package invocation

import (
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
)

func (handler *Handler) InvokeManual(request api.WorkspaceScopedJSON[dto.WorkflowInvocationCreateRequest]) (api.Response, error) {
	id, err := planID(request.WorkspaceScopedRequest)
	if err != nil {
		return api.Response{}, err
	}
	input, err := requireInvocationInput(request.Body.Input)
	if err != nil {
		return api.Response{}, err
	}
	idempotencyKey, err := requireIdempotencyKey(request.Gin.GetHeader(idempotencyHeader))
	if err != nil {
		return api.Response{}, err
	}
	result, err := handler.service.InvokeManual(request.Context(), ManualInput{
		WorkspaceID: request.WorkspaceID(), PlanID: id, PlanVersionID: strings.TrimSpace(request.Body.PlanVersionID), Input: input,
		Principal: requestPrincipal(request.WorkspaceScopedRequest),
		InvokedBy: requestActor(request.WorkspaceScopedRequest), IdempotencyKey: idempotencyKey,
		TeamID: strings.TrimSpace(request.Body.TeamID),
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.Created(invocationResponse(result.Invocation, result.Run.Status, result.Replayed)), nil
}

func (handler *Handler) List(request api.WorkspaceScopedRequest) (api.Response, error) {
	planID, err := listPlanID(request)
	if err != nil {
		return api.Response{}, err
	}
	limit, err := pageLimit(request)
	if err != nil {
		return api.Response{}, err
	}
	page, err := handler.service.List(request.Context(), ListInput{
		WorkspaceID: request.WorkspaceID(), PlanID: planID, Limit: limit,
		Cursor: strings.TrimSpace(request.Gin.Query("cursor")),
	})
	if err != nil {
		return api.Response{}, err
	}
	items := make([]dto.WorkflowInvocationResponse, 0, len(page.Items))
	for _, item := range page.Items {
		items = append(items, listInvocationResponse(item))
	}
	return api.OK(dto.WorkflowInvocationListResponse{Items: items, NextCursor: page.NextCursor}), nil
}
