package app

import (
	"context"

	apiv1 "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/repo"
)

// Policy-shaped RPC handlers (PR-A: feat/apply-autoscale-policy-rpc).
// These delegate to the same server.Service that the v1 handlers use,
// so all business logic lives in domain/server (single source of truth).

func (s *appImpl) CreateOrReplaceAutoscalePolicy(
	ctx context.Context,
	req *apiv1.CreateOrReplaceAutoscalePolicyRequest,
) (*apiv1.AutoscalePolicyResponse, error) {
	return s.ngService.CreateOrReplaceAutoscalePolicy(
		ctx,
		req.GetScope(),
		req.GetSubjectId(),
		req.GetSpecs(),
		req.GetApplyToAllSharedPools(),
		req.GetRequestId(),
	)
}

func (s *appImpl) PatchAutoscalePolicy(
	ctx context.Context,
	req *apiv1.PatchAutoscalePolicyRequest,
) (*apiv1.AutoscalePolicyResponse, error) {
	return s.ngService.PatchAutoscalePolicy(
		ctx,
		req.GetScope(),
		req.GetSubjectId(),
		req.GetSpecs(),
		req.GetApplyToAllSharedPools(),
		req.GetRequestId(),
	)
}

func (s *appImpl) GetAutoscalePolicy(
	ctx context.Context,
	req *apiv1.GetAutoscalePolicyRequest,
) (*apiv1.GetAutoscalePolicyResponse, error) {
	bundle, err := s.ngService.GetAutoscalePolicy(ctx, req.GetScope(), req.GetSubjectId())
	if err != nil {
		return nil, err
	}
	return &apiv1.GetAutoscalePolicyResponse{Bundle: bundle}, nil
}

func (s *appImpl) GetEffectiveAutoscalePolicy(
	ctx context.Context,
	req *apiv1.GetEffectiveAutoscalePolicyRequest,
) (*apiv1.GetAutoscalePolicyResponse, error) {
	bundle, err := s.ngService.GetEffectiveAutoscalePolicy(ctx, req.GetScope(), req.GetSubjectId())
	if err != nil {
		return nil, err
	}
	return &apiv1.GetAutoscalePolicyResponse{Bundle: bundle}, nil
}

func (s *appImpl) ListAutoscalePolicy(
	ctx context.Context,
	req *apiv1.ListAutoscalePolicyRequest,
) (*apiv1.ListAutoscalePolicyResponse, error) {
	bundles, next, err := s.ngService.ListAutoscalePolicy(
		ctx,
		repo.AutoscalePolicyBundleFilter{
			Scope:           req.GetScope(),
			SubjectIDPrefix: req.GetSubjectIdPrefix(),
		},
		req.GetPageSize(),
		req.GetPageToken(),
	)
	if err != nil {
		return nil, err
	}
	return &apiv1.ListAutoscalePolicyResponse{
		Bundles:       bundles,
		NextPageToken: next,
	}, nil
}

func (s *appImpl) PreviewAutoscalePolicy(
	ctx context.Context,
	req *apiv1.PreviewAutoscalePolicyRequest,
) (*apiv1.PreviewAutoscalePolicyResponse, error) {
	targets, err := s.ngService.PreviewAutoscalePolicy(
		ctx,
		req.GetScope(),
		req.GetSubjectId(),
		req.GetSpecs(),
		req.GetOperation(),
		req.GetApplyToAllSharedPools(),
	)
	if err != nil {
		return nil, err
	}
	return &apiv1.PreviewAutoscalePolicyResponse{Targets: targets}, nil
}

func (s *appImpl) SyncAutoscalePolicy(
	ctx context.Context,
	req *apiv1.SyncAutoscalePolicyRequest,
) (*apiv1.AutoscalePolicyResponse, error) {
	return s.ngService.SyncAutoscalePolicy(
		ctx,
		req.GetScope(),
		req.GetSubjectId(),
		req.GetMode(),
		req.GetKeys(),
		req.GetApplyToAllSharedPools(),
		req.GetRequestId(),
	)
}
