package cvt

import (
	"strconv"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/infra/repoimpl/schema"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func SpuMappingsEnToModel(ens []*entity.SpuMapping) (map[uint64]*schema.TierTierUnit, bizerr.BizError) {
	outs := make(map[uint64]*schema.TierTierUnit)
	for _, en := range ens {
		if en == nil {
			return nil, bizerr.New(bizerr.ErrCodeParams, "spu mapping is nil")
		}
		if _, ok := outs[en.SpuId]; !ok {
			outs[en.SpuId] = &schema.TierTierUnit{
				ComponentTierId: en.SpuId,
				TierUnitMapping: schema.TierUnitMapping{},
			}
		}

		regionNames := make([]string, 0, len(en.Regions))
		for name, ok := range en.Regions {
			if ok {
				regionNames = append(regionNames, name.String())
			}
		}
		tenantIDs := make([]string, 0, len(en.TenantIDs))
		for id, ok := range en.TenantIDs {
			if ok {
				tenantIDs = append(tenantIDs, strconv.Itoa(int(id)))
			}
		}
		outs[en.SpuId].TierUnitMapping.Items = append(outs[en.SpuId].TierUnitMapping.Items, &schema.TierUnitMappingItem{
			ProviderName: en.Provider.Enum().String(),
			RegionNames:  regionNames,
			TenantIDs:    tenantIDs,
			SkuKey:       en.SkuKey,
		})
	}

	return outs, nil
}
