package resourcepool

import (
	"context"

	"google.golang.org/protobuf/types/known/timestamppb"

	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) GetResourcePoolPauseResumeOperation(
	ctx context.Context,
	request *globalngv1.GetResourcePoolPauseResumeOperationRequest,
) (*globalngv1.ResourcePoolPauseResumeOperation, bizerr.BizError) {
	if request == nil {
		return nil, bizerr.New(bizerr.ErrCodeParams, "request cannot be nil")
	}
	if request.GetResourcePoolId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "resource pool id is required")
	}
	if request.GetOperationId() == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "operation id is required")
	}
	operation, berr := s.pauseOperationRepo.Get(ctx, request.GetResourcePoolId(), request.GetOperationId())
	if berr != nil {
		return nil, berr
	}
	return resourcePoolPauseResumeOperationFromLocal(operation), nil
}

func resourcePoolPauseResumeOperationFromLocal(
	operation *entity.ResourcePoolPauseOperation,
) *globalngv1.ResourcePoolPauseResumeOperation {
	operationType := globalngv1.ResourcePoolPauseResumeOperation_OPERATION_PAUSE
	if operation.Type == entity.ResourcePoolPauseOperationTypeResume {
		operationType = globalngv1.ResourcePoolPauseResumeOperation_OPERATION_RESUME
	}
	status := globalngv1.ResourcePoolPauseResumeOperation_RUNNING
	switch operation.Status {
	case entity.ResourcePoolPauseOperationSucceeded:
		status = globalngv1.ResourcePoolPauseResumeOperation_SUCCEEDED
	case entity.ResourcePoolPauseOperationFailed:
		status = globalngv1.ResourcePoolPauseResumeOperation_FAILED
	}
	result := &globalngv1.ResourcePoolPauseResumeOperation{
		OperationId:    operation.OperationID,
		ResourcePoolId: operation.ResourcePoolID,
		Type:           operationType,
		Status:         status,
		ResultSummary:  operation.ResultSummary,
		CreatedAt:      timestamppb.New(operation.CreatedAt),
		UpdatedAt:      timestamppb.New(operation.UpdatedAt),
	}
	if operation.CompletedAt != nil {
		result.CompletedAt = timestamppb.New(*operation.CompletedAt)
	}
	return result
}
