package rcuquota

import (
	"context"

	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/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (s *serviceImpl) GetRcuQuota(ctx context.Context, request *globalngv1.GetRcuQuotaRequest) (*entity.RcuQuota, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "Domain.GetRcuQuota")
	defer span.End()

	if request == nil {
		return nil, bizerr.New(bizerr.ErrCodeParams, "request cannot be nil")
	}

	if request.OrganizationId == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "organizationId cannot be empty")
	}

	if request.ServicePlan == globalcommonv1.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		return nil, bizerr.New(bizerr.ErrCodeParams, "service plan cannot be empty")
	}

	rcuQuota, err := s.rcuQuotaRepo.Load(ctx, request.OrganizationId, request.ServicePlan.String())
	if err != nil {
		return nil, err
	}

	return rcuQuota, nil
}

var servicePlans = []globalcommonv1.ServicePlan{
	globalcommonv1.ServicePlan_Premium,
	globalcommonv1.ServicePlan_BYOC,
	globalcommonv1.ServicePlan_Premium_Reserved,
	globalcommonv1.ServicePlan_Essential_V2,
}

func (s *serviceImpl) ListOrgRcuQuotas(ctx context.Context, request *globalngv1.ListOrgRcuQuotasRequest) ([]*entity.RcuQuota, bizerr.BizError) {
	var rcuQuotas []*entity.RcuQuota
	for _, sp := range servicePlans {
		rcuQuota, err := s.rcuQuotaRepo.Load(ctx, request.OrganizationId, sp.String())
		if err != nil {
			return rcuQuotas, err
		}
		rcuQuotas = append(rcuQuotas, rcuQuota)
	}
	return rcuQuotas, nil
}
