package cluster

import (
	"context"

	"github.com/samber/lo"

	openapicommonv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/billing"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func checkClusterCreateRestrictions(
	cluster *entity.Cluster,
	thirdProviders []openapicommonv1beta1.Region_CloudProvider,
) bizerr.BizError {
	// This check is shared by all public serverless creation paths so that
	// Starter restrictions stay consistent across create, batch create, and claim.
	if cluster == nil {
		return bizerr.New(bizerr.ErrCodeParams, "cluster is nil")
	}

	if len(thirdProviders) > 0 && !lo.Contains(thirdProviders, cluster.CloudProvider) {
		return bizerr.New(bizerr.ErrCodePermission, bizerr.ErrMsg3rdPartyAccount, cluster.CloudProvider)
	}

	return nil
}

func (svc *service) checkAlibabaCloudMarketplaceServerlessCreate(
	ctx context.Context,
	cluster *entity.Cluster,
	thirdProviders []openapicommonv1beta1.Region_CloudProvider,
) bizerr.BizError {
	if cluster == nil {
		return bizerr.New(bizerr.ErrCodeParams, "cluster is nil")
	}
	if cluster.CloudProvider != openapicommonv1beta1.Region_alicloud ||
		!lo.Contains(thirdProviders, openapicommonv1beta1.Region_alicloud) ||
		cluster.ServicePlan != openapicommonv1beta1.ServicePlan_Starter {
		return nil
	}

	provider := billing.ProviderAlicloud
	result, err := svc.billingCli.BillingActionCheck(
		ctx,
		billing.ActionCreate,
		cluster.OrganizationId,
		&billing.Resource{
			Type:     billing.ResourceTypeServerlessCluster,
			Provider: &provider,
		},
	)
	if err != nil {
		return err
	}
	if result == nil {
		return bizerr.New(bizerr.ErrCodeSvcBilling, "billing action check result is nil")
	}
	if result.Pass {
		return nil
	}

	return bizerr.New(bizerr.ErrCodePermission, "%s", *result.Reason)
}
