package query

import (
	"testing"

	"github.com/tidbcloud/serverless-metering/pkg/config"
	"github.com/tidbcloud/serverless-metering/pkg/repository"
	"github.com/tj/assert"
)

func TestUsage_GetSkuName_IAStorage(t *testing.T) {
	const provider, region = "aws", "us-east-1"

	cases := []struct {
		name        string
		enableIASku bool
		encrypt     bool
		essential   bool
		want        string
	}{
		{
			name:        "ia disabled, non-encrypted, starter",
			enableIASku: false, encrypt: false, essential: false,
			want: "serverless-row-storage:aws:us-east-1:starter",
		},
		{
			name:        "ia disabled, encrypted, starter",
			enableIASku: false, encrypt: true, essential: false,
			want: "serverless-row-storage-dual-encryption:aws:us-east-1:starter",
		},
		{
			name:        "ia disabled, non-encrypted, essential",
			enableIASku: false, encrypt: false, essential: true,
			want: "serverless-row-storage:aws:us-east-1:essential",
		},
		{
			name:        "ia enabled, non-encrypted, starter",
			enableIASku: true, encrypt: false, essential: false,
			want: "serverless-row-storage-ia:aws:us-east-1:starter",
		},
		{
			name:        "ia enabled, encrypted falls into single ia sku",
			enableIASku: true, encrypt: true, essential: false,
			want: "serverless-row-storage-ia:aws:us-east-1:starter",
		},
		{
			name:        "ia enabled, essential",
			enableIASku: true, encrypt: false, essential: true,
			want: "serverless-row-storage-ia:aws:us-east-1:essential",
		},
	}

	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			config.Global().EnableIASku = tc.enableIASku
			t.Cleanup(func() { config.Global().EnableIASku = true })

			cb := &repository.ClusterBranch{
				EncryptKeyspace: tc.encrypt,
			}
			if tc.essential {
				cb.MaxRcu = 1
			}
			usage := &Usage{MetricType: MetricTypeTikvStorageIA}
			usage.clusterBranch = cb

			got := usage.GetSkuName(provider, region)
			assert.Equal(t, tc.want, got)
		})
	}
}

func TestUsage_GetSkuName_StandardStorageUnaffected(t *testing.T) {
	config.Global().EnableIASku = true
	t.Cleanup(func() { config.Global().EnableIASku = true })

	usage := &Usage{MetricType: MetricTypeTikvStorage}
	usage.clusterBranch = &repository.ClusterBranch{}
	assert.Equal(t, "serverless-row-storage:aws:us-east-1:starter", usage.GetSkuName("aws", "us-east-1"))
}
