// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package api

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestAPI_OperatorUsage(t *testing.T) {
	t.Parallel()
	c, s := makeClient(t)
	defer s.Stop()
	s.WaitForSerfCheck(t)

	registerService := func(svc *AgentService) {
		reg := &CatalogRegistration{
			Datacenter: "dc1",
			Node:       "foobar",
			Address:    "192.168.10.10",
			Service:    svc,
		}
		if _, err := c.Catalog().Register(reg, nil); err != nil {
			t.Fatal(err)
		}
	}
	registerService(&AgentService{
		ID:      "redis1",
		Service: "redis",
		Port:    8000,
	})
	registerService(&AgentService{
		ID:      "redis2",
		Service: "redis",
		Port:    8001,
	})
	registerService(&AgentService{
		Kind:    ServiceKindConnectProxy,
		ID:      "proxy1",
		Service: "proxy",
		Port:    9000,
		Proxy:   &AgentServiceConnectProxyConfig{DestinationServiceName: "foo"},
	})
	registerService(&AgentService{
		ID:      "web-native",
		Service: "web",
		Port:    8002,
		Connect: &AgentServiceConnect{Native: true},
	})

	usage, _, err := c.Operator().Usage(nil)
	require.NoError(t, err)
	require.Contains(t, usage.Usage, "dc1")
	require.Equal(t, 4, usage.Usage["dc1"].Services)
	require.Equal(t, 5, usage.Usage["dc1"].ServiceInstances)
	require.Equal(t, map[string]int{
		"api-gateway":         0,
		"connect-native":      1,
		"connect-proxy":       1,
		"ingress-gateway":     0,
		"mesh-gateway":        0,
		"terminating-gateway": 0,
	}, usage.Usage["dc1"].ConnectServiceInstances)
	require.Equal(t, 3, usage.Usage["dc1"].BillableServiceInstances)
}