package resourcepool

import (
	"context"

	"github.com/samber/lo"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/adapter/billing"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (s *serviceImpl) checkTenantBillingPlan(
	ctx context.Context,
	resourcePool *globalngv1.ResourcePool,
	cloudRegion *entity.Region,
) bizerr.BizError {
	if resourcePool.GetOwnerType() != globalngv1.ResourcePool_ORGANIZATION ||
		resourcePool.GetServicePlan() != globalcommonv1.ServicePlan_BYOC {
		return nil
	}
	provider, ok := billing.ProviderMap[cloudRegion.GetCloudProviderId()]
	if !ok {
		return bizerr.New(
			bizerr.ErrCodeParams,
			"unsupported cloud provider %s for billing",
			cloudRegion.GetCloudProviderId(),
		)
	}

	result, err := s.billingCli.BillingActionCheck(
		ctx,
		billing.Action_Create,
		resourcePool.GetOwnerId(),
		&billing.Resource{
			Type:     billing.ResourceType_NextgenCluster,
			Region:   lo.ToPtr(cloudRegion.GetId().String()),
			Provider: lo.ToPtr(provider),
			IsFree:   false,
		},
	)
	if err != nil {
		return err
	}
	if result.Pass {
		return nil
	}
	if result.Reason != nil {
		return bizerr.New(bizerr.ErrCodeParams, "%s", *result.Reason)
	}
	return bizerr.New(bizerr.ErrCodeParams, "Check tenant billing plan failed")
}
