package cvt

import (
	"errors"

	"gorm.io/gorm"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/infra/repoimpl/common"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/infra/repoimpl/schema"
	"github.com/tidbcloud/tidb-management-service/utilities/enum"
)

func SpuEnToModel(en *entity.Spu) (*schema.ComponentTier, error) {
	if en == nil {
		return nil, errors.New("nil tier entity")
	}

	if en.GetKey() == "" {
		en.Key = entity.BuildSpuKey(en.ComponentType, en.Name, en.Version)
	}

	return &schema.ComponentTier{
		Model: gorm.Model{
			ID: uint(en.Id),
		},
		Key:           en.Key,
		DisplayName:   en.DisplayName,
		ComponentType: en.ComponentType.String(),
		CPUNum:        uint32(en.CpuCore),
		MemorySizeGi:  uint32(en.MemorySizeGi),
		Name:          en.GetName(),
		Version:       en.GetVersion(),
	}, nil
}

func SpuModel2En(tm *schema.ComponentTier) (*entity.Spu, error) {
	if tm == nil {
		return nil, errors.New("nil tier model")
	}

	typeCvt, err := enum.FromString[globaldedicatedv1.ComponentType](tm.ComponentType)
	if err != nil {
		return nil, err
	}

	if tm.Name == "" {
		tm.Name = common.GetSpuName(tm.Key)
	}

	return &entity.Spu{
		Id:            uint64(tm.ID),
		Key:           tm.Key,
		Name:          tm.Name,
		DisplayName:   tm.DisplayName,
		ComponentType: globaldedicatedv1.ComponentType(typeCvt),
		CpuCore:       int32(tm.CPUNum),
		MemorySizeGi:  int32(tm.MemorySizeGi),
		Version:       tm.Version,
	}, nil
}
