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"
	"google.golang.org/protobuf/types/known/emptypb"
)

func (s *appImpl) GetResolvedAutoscalePolicyBundle(
	ctx context.Context,
	req *apiv1.GetResolvedAutoscalePolicyBundleRequest,
) (*apiv1.ResolvedAutoscalePolicyBundle, error) {
	return s.ngService.GetResolvedAutoscalePolicyBundle(ctx, req.GetSharedPoolId(), req.GetComponentType())
}

func (s *appImpl) ApplyMaterializedAutoscalePolicies(
	ctx context.Context,
	req *apiv1.ApplyMaterializedAutoscalePoliciesRequest,
) (*apiv1.ApplyMaterializedAutoscalePoliciesResponse, error) {
	policies, err := s.ngService.ApplyMaterializedAutoscalePolicies(ctx, req.GetSubjectType(), req.GetSubjectId(), req.GetPolicies())
	if err != nil {
		return nil, err
	}
	return &apiv1.ApplyMaterializedAutoscalePoliciesResponse{Policies: policies}, nil
}

func (s *appImpl) EvaluateAutoscalePolicy(
	ctx context.Context,
	req *apiv1.EvaluateAutoscalePolicyRequest,
) (*apiv1.EvaluateAutoscalePolicyResponse, error) {
	return s.ngService.EvaluateAutoscalePolicy(
		ctx,
		req.GetSharedPoolId(),
		req.GetComponentType(),
		req.GetDirection(),
		req.GetCapability(),
		req.GetTrigger(),
	)
}

func (s *appImpl) ListAutoscalePolicies(
	ctx context.Context,
	req *apiv1.ListAutoscalePoliciesRequest,
) (*apiv1.ListAutoscalePoliciesResponse, error) {
	return s.ngService.ListAutoscalePolicies(ctx, req.GetSubjectType(), req.GetSubjectId(), req.GetComponentType())
}

func (s *appImpl) UpsertAutoscaleRuntimeGuard(
	ctx context.Context,
	req *apiv1.UpsertAutoscaleRuntimeGuardRequest,
) (*apiv1.AutoscaleRuntimeGuard, error) {
	return s.ngService.UpsertAutoscaleRuntimeGuard(ctx, req.GetGuard())
}

func (s *appImpl) DeleteAutoscaleRuntimeGuard(
	ctx context.Context,
	req *apiv1.DeleteAutoscaleRuntimeGuardRequest,
) (*emptypb.Empty, error) {
	if err := s.ngService.DeleteAutoscaleRuntimeGuard(
		ctx,
		req.GetScopeType(),
		req.GetScopeId(),
		req.GetGuardType(),
		req.GetComponentType(),
	); err != nil {
		return nil, err
	}
	return &emptypb.Empty{}, nil
}

func (s *appImpl) ListAutoscaleRuntimeGuards(
	ctx context.Context,
	req *apiv1.ListAutoscaleRuntimeGuardsRequest,
) (*apiv1.ListAutoscaleRuntimeGuardsResponse, error) {
	return s.ngService.ListAutoscaleRuntimeGuards(ctx, repo.AutoscaleRuntimeGuardFilter{
		ScopeType:     req.GetScopeType(),
		ScopeID:       req.GetScopeId(),
		GuardType:     req.GetGuardType(),
		ComponentType: req.GetComponentType(),
		ActiveOnly:    req.GetActiveOnly(),
	})
}
