package reservedcapacitytemplate

import (
	"testing"

	"github.com/stretchr/testify/require"
	"gorm.io/datatypes"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/schema"
)

func TestEntityToModelStoresProtoJSONWithEnumNames(t *testing.T) {
	template, err := entityToModel(&globalngv1.ReservedCapacityTemplate{
		Id:           1,
		TemplateCode: "template-1",
		Scope:        globalngv1.ReservedCapacityTemplate_DEFAULT,
		Status:       globalngv1.ReservedCapacityTemplate_ACTIVE,
		Workload: &globalngv1.ReservedCapacityTemplate_Workload{
			WorkloadType: globalngv1.ReservedCapacityTemplate_MIXED,
		},
		FixedTopology: &globalngv1.FixedTopology{
			Components: []*globalngv1.ComponentTopology{{
				ComponentType: globalngv1.ComponentType_TIKV,
				NodeQuota: &globalngv1.NodeQuota{
					NodeSpec:  &globalngv1.NodeSpec{Cpu: 8, MemoryGi: 16},
					NodeCount: 3,
				},
			}},
		},
	})
	require.NoError(t, err)
	require.JSONEq(t, `{"workload_type":"MIXED"}`, string(template.Workload))
	require.JSONEq(
		t,
		`{"components":[{"component_type":"TIKV","node_quota":{"node_spec":{"cpu":8,"memory_gi":16},"node_count":3}}]}`,
		string(template.FixedTopology),
	)
}

func TestModelToEntityParsesProtoJSONWithEnumNames(t *testing.T) {
	template, err := modelToEntity(&schema.ReservedCapacityTemplate{
		ID:           1,
		TemplateCode: "template-1",
		Scope:        globalngv1.ReservedCapacityTemplate_DEFAULT.String(),
		Status:       globalngv1.ReservedCapacityTemplate_ACTIVE.String(),
		Workload:     datatypes.JSON(`{"workload_type":"MIXED","qps_min":100,"qps_max":200}`),
		FixedTopology: datatypes.JSON(
			`{"components":[{"component_type":"TIKV","node_quota":{"node_spec":{"cpu":8,"memory_gi":16},"node_count":3},"storages":[{"name":"DATA","type":"gp3","size_gi":1500,"iops":8000,"throughput_mbs":400}]}]}`,
		),
	})
	require.NoError(t, err)
	require.Equal(t, globalngv1.ReservedCapacityTemplate_MIXED, template.GetWorkload().GetWorkloadType())
	require.EqualValues(t, 100, template.GetWorkload().GetQpsMin())
	require.EqualValues(t, 200, template.GetWorkload().GetQpsMax())
	require.Len(t, template.GetFixedTopology().GetComponents(), 1)
	require.Equal(t, globalngv1.ComponentType_TIKV, template.GetFixedTopology().GetComponents()[0].GetComponentType())
	require.Equal(t, globalngv1.StorageSpec_DATA, template.GetFixedTopology().GetComponents()[0].GetStorages()[0].GetName())
}
