package gkeheterogeneous

import (
	"context"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	clusterrepo "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/cluster"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/region"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/featuregate"
)

func Prepare(
	ctx context.Context,
	clusterRepo clusterrepo.Repo,
	regionRepo region.Repo,
	featGateCli featuregate.Service,
	tenantID uint64,
	projectID uint64,
	clusterID uint64,
	componentType globaldedicatedv1.ComponentType,
	requireGCP bool,
	requireFeatureGate bool,
) (*entity.Cluster, *entity.Region, bizerr.BizError) {
	if componentType == globaldedicatedv1.ComponentType_COMPONENT_TYPE_UNSPECIFIED {
		return nil, nil, bizerr.New(bizerr.ErrCodeParams, "unsupported component_type %s", componentType.String())
	}
	cluster, berr := clusterRepo.Get(ctx, clusterID, false)
	if berr != nil {
		return nil, nil, berr
	}
	if tenantID != 0 && cluster.OrganizationId != tenantID {
		return nil, nil, bizerr.New(bizerr.ErrCodeParams, "tenant_id does not match cluster")
	}
	if projectID != 0 && cluster.ProjectId != projectID {
		return nil, nil, bizerr.New(bizerr.ErrCodeParams, "project_id does not match cluster")
	}
	if requireGCP && cluster.CloudProviderId != globalcommonv1.CloudProvider_GCP {
		return nil, nil, bizerr.New(bizerr.ErrCodeParams, "gke heterogeneous deploy only supports gcp clusters")
	}
	if requireFeatureGate && featGateCli == nil {
		return nil, nil, bizerr.New(bizerr.ErrCodeUnknown, "feature gate client is required for gke heterogeneous deploy")
	}
	if requireFeatureGate && !featGateCli.CheckFeatureEnabled(
		featuregate.GKEHeterogeneousDeploy,
		cluster.OrganizationId,
		cluster.ProjectId,
		cluster.GetCloudProviderId().String(),
		cluster.RegionId.String(),
	) {
		return nil, nil, bizerr.New(bizerr.ErrCodeParams, "gke heterogeneous deploy feature gate is disabled")
	}
	regionEn, berr := regionRepo.SelectRegionById(ctx, cluster.RegionId, cluster.OrganizationId)
	if berr != nil {
		return nil, nil, berr
	}
	if regionEn.State != globalcommonv1.Region_ACTIVE {
		return nil, nil, bizerr.New(bizerr.ErrCodePermission, "region is not active")
	}
	return cluster, regionEn, nil
}
