package structs

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"gopkg.in/yaml.v3"
)

func TestClusterUniqueKey_IsValid(t *testing.T) {
	t.Run("valid", func(t *testing.T) {
		k := ClusterUniqueKey{
			BizType:       "1",
			TenantID:      "2",
			ProjectID:     "3",
			ApplicationID: "4",
		}

		assert.True(t, k.IsValid())
	})
	t.Run("invalid", func(t *testing.T) {
		k := ClusterUniqueKey{
			BizType:   "1",
			TenantID:  "2",
			ProjectID: "3",
		}

		assert.False(t, k.IsValid())

		k = ClusterUniqueKey{
			BizType:       "1",
			TenantID:      "2",
			ApplicationID: "4",
		}

		assert.False(t, k.IsValid())

		k = ClusterUniqueKey{
			BizType:       "1",
			ProjectID:     "3",
			ApplicationID: "4",
		}

		assert.False(t, k.IsValid())

		k = ClusterUniqueKey{
			TenantID:      "2",
			ProjectID:     "3",
			ApplicationID: "4",
		}

		assert.False(t, k.IsValid())
	})
}

func TestClusterUniqueKey_Splice(t *testing.T) {
	t.Run("valid", func(t *testing.T) {
		k := ClusterUniqueKey{
			BizType:       "1",
			TenantID:      "2",
			ProjectID:     "3",
			ApplicationID: "4",
		}

		assert.Equal(t, "1/2/3/4", k.Splice())
	})
}

func TestArchivedClusterInfo_YAML(t *testing.T) {
	c := ArchivedClusterInfo{
		ClusterBaseInfo: ClusterBaseInfo{
			CommonReqInfo: CommonReqInfo{
				Vendor: constants.AWS,
				Region: "us-west-2",
			},
			TenantID: "1",
		},
		VMAccountID: "111",
		VMProjectID: "222",
	}

	out, err := yaml.Marshal(c)
	assert.NoError(t, err)

	c2 := ArchivedClusterInfo{}
	err = yaml.Unmarshal(out, &c2)
	assert.NoError(t, err)
	assert.Equal(t, c.TenantID, c2.TenantID)
	assert.Equal(t, c.Vendor, c2.Vendor)
	assert.Equal(t, c.Region, c2.Region)
	assert.Equal(t, c.VMProjectID, c2.VMProjectID)
	assert.Equal(t, c.VMAccountID, c2.VMAccountID)
}

func TestStorageInfo_JSONUsesStorageAccountField(t *testing.T) {
	payload, err := json.Marshal(StorageInfo{
		BucketName:     "bucket-a",
		StorageAccount: "account-a",
		Category:       constants.SLOWQUERYS,
		DataARN:        "arn-a",
		ObjectPath:     "path-a",
	})
	assert.NoError(t, err)
	assert.JSONEq(t, `{
		"bucketName": "bucket-a",
		"storageAccount": "account-a",
		"category": "slowquery",
		"dataARN": "arn-a",
		"objectPath": "path-a"
	}`, string(payload))
}
