package cluster

import (
	"context"

	"github.com/samber/lo"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/v1beta1"
	appcommon "github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/pkg/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func (c *serverImpl) ShowNodeQuota(
	ctx context.Context,
	request *openapidedicatedv1beta1.ShowNodeQuotaRequest,
) (*openapidedicatedv1beta1.ShowNodeQuotaResponse, error) {
	// Extract request meta.
	reqMeta, err := metadata.ExtractRequestMetaWithCheckPermission(ctx)
	if err != nil {
		return nil, bizerr.WrapErrorWithCode(err, bizerr.ErrCodeParams, "failed to extract request metadata")
	}

	resp, err := c.dedicatedCli.ListTenantQuota(ctx, &globaldedicatedv1.ListTenantQuotaRequest{
		TenantId: reqMeta.OrgID,
	})
	if err != nil {
		return nil, err
	}

	return &openapidedicatedv1beta1.ShowNodeQuotaResponse{
		ComponentQuotas: lo.Map(
			resp.GetTenantQuotas(),
			func(item *globaldedicatedv1.TenantQuota, _ int) *openapidedicatedv1beta1.ShowNodeQuotaResponse_ComponentQuota {
				return &openapidedicatedv1beta1.ShowNodeQuotaResponse_ComponentQuota{
					ComponentType: appcommon.CvtComponentTypeToOpenapi(item.GetComponent()),
					Quota:         int32(item.GetQuota()),
				}
			},
		),
	}, nil
}
