package cvt

import (
	"math"
	"strconv"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/serverless/v1"
	regionalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/regional/serverless/v1"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/constant"
)

func CreateReq2RegionSvcModel(
	req *globalserverlessv1.ServerlessServiceCreateRequest,
) regionalserverlessv1.ServerlessRegionalServiceCreateClusterRequest {
	annos := map[string]string{
		constant.AnnoServicePlan: globalcommonv1.ServicePlan_Starter.String(),
	}
	if req.GetSpendLimit().GetMonthly() > 0 {
		// rewrite service plan for Starter cluster with spengding limit
		annos[constant.AnnoServicePlan] = constant.ServicePlanStarterScalable
	}
	if req.GetAutoScaling().GetMaxRcu() > 0 {
		annos[constant.AnnoServicePlan] = globalcommonv1.ServicePlan_Essential.String()
	}
	if req.GetRuVersion() > 0 {
		annos[constant.AnnoRuVersion] = strconv.Itoa(int(req.GetRuVersion()))
	}
	return regionalserverlessv1.ServerlessRegionalServiceCreateClusterRequest{
		ClusterId: req.Id,
		ProjectId: req.ProjectId,
		TenantId:  req.TenantId,
		Endpoints: &regionalserverlessv1.Endpoints{
			Public: &regionalserverlessv1.PublicEndpoint{
				Disabled: req.GetEndpoints().GetPublic().GetDisabled(),
			},
			Private: &regionalserverlessv1.PrivateEndpoint{
				Disabled: req.GetEndpoints().GetPrivate().GetDisabled(),
			},
		},
		EnhancedEncryptionEnabled: req.GetEncryptionConfig().GetEnhancedEncryptionEnabled(),
		RestoreCluster:            req.GetRestoreCluster(),
		ZoneRedundantEnabled:      req.GetZoneRedundantEnabled(),
		AuditLogConfig:            req.GetAuditLogConfig(),
		Kubernetes:                req.GetKubernetes(),
		AutoScaling:               req.GetAutoScaling(),
		Annotations:               annos,
	}
}

func ListReq2RegionSvcListReq(
	req *globalserverlessv1.ServerlessServiceListRequest,
) *regionalserverlessv1.ServerlessRegionalServiceListClustersRequest {
	filter := req.Filter
	if req.Filter == nil {
		filter = &globalserverlessv1.ClusterFilter{}
	}

	return &regionalserverlessv1.ServerlessRegionalServiceListClustersRequest{
		// TODO: need to improve
		Page:       0,
		PageSize:   math.MaxInt32,
		States:     filter.States,
		ClusterIds: filter.ClusterIds,
		ProjectIds: filter.ProjectIds,
	}
}
