package cidr

import (
	"gorm.io/gorm"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	"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"
	"github.com/tidbcloud/tidb-management-service/utilities/enum"
)

func cidrEnToModel(en *entity.CIDR, region *schema.Region) *schema.Cidr {
	return &schema.Cidr{
		Model: gorm.Model{
			ID: uint(en.ID),
		},
		ProjectID:  en.ProjectID,
		RegionID:   uint64(region.ID),
		CIDR:       en.CIDR,
		ProviderID: region.ProviderId,
		TenantID:   en.TenantID,
	}
}

func cidrModelToEn(cidr *schema.Cidr) (*entity.CIDR, bizerr.BizError) {
	out := &entity.CIDR{
		ID:        uint64(cidr.ID),
		ProjectID: cidr.ProjectID,
		TenantID:  cidr.TenantID,
		BasicRegion: &entity.BasicRegion{
			Name:              0, // fill later
			DisplayName:       cidr.Region.DisplayName,
			LogicalName:       cidr.Region.Name,
			CloudProviderName: 0, // fill later
		},
		CIDR: cidr.CIDR,
	}

	// fill BasicRegion.Name
	regionName, err := enum.FromString[globalcommonv1.Region_Name](cidr.Region.RegionName)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeUnknown, "region %s is not supported", cidr.Region.Name)
	}
	out.BasicRegion.Name = globalcommonv1.Region_Name(regionName)

	// fill BasicRegion.CloudProviderName
	cloudProviderName, err := enum.FromString[globalcommonv1.CloudProvider_Name](cidr.Provider.Name)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeUnknown, "cloud provider %s is not supported", cidr.Provider.Name)
	}
	out.BasicRegion.CloudProviderName = globalcommonv1.CloudProvider_Name(cloudProviderName)

	return out, nil
}

func cidrEnToSecondaryCidrModel(en *entity.CIDR, region *schema.Region) *schema.SecondaryCidr {
	return &schema.SecondaryCidr{
		Model: gorm.Model{
			ID: uint(en.ID),
		},
		ProjectID:  en.ProjectID,
		RegionID:   uint64(region.ID),
		CIDR:       en.CIDR,
		ProviderID: region.ProviderId,
		TenantID:   en.TenantID,
		VpcID:      en.VpcID,
	}
}

func secondaryCidrModelToEn(cidr *schema.SecondaryCidr) (*entity.CIDR, bizerr.BizError) {
	out := &entity.CIDR{
		ID:        uint64(cidr.ID),
		ProjectID: cidr.ProjectID,
		TenantID:  cidr.TenantID,
		BasicRegion: &entity.BasicRegion{
			Name:              0, // fill later
			DisplayName:       cidr.Region.DisplayName,
			LogicalName:       cidr.Region.Name,
			CloudProviderName: 0, // fill later
		},
		CIDR:  cidr.CIDR,
		VpcID: cidr.VpcID,
	}

	// fill BasicRegion.Name
	regionName, err := enum.FromString[globalcommonv1.Region_Name](cidr.Region.RegionName)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeUnknown, "region %s is not supported", cidr.Region.RegionName)
	}
	out.BasicRegion.Name = globalcommonv1.Region_Name(regionName)

	// fill BasicRegion.CloudProviderName
	cloudProviderName, err := enum.FromString[globalcommonv1.CloudProvider_Name](cidr.Provider.Name)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeUnknown, "cloud provider %s is not supported", cidr.Provider.Name)
	}
	out.BasicRegion.CloudProviderName = globalcommonv1.CloudProvider_Name(cloudProviderName)

	return out, nil
}
