package run

import (
	"strings"

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

func (handler *Handler) ListActivations(request api.WorkspaceScopedRequest) (api.Response, error) {
	id, input, err := childListInput(request)
	if err != nil {
		return api.Response{}, err
	}
	input.RunID = id
	page, err := handler.service.ListActivations(request.Context(), input)
	if err != nil {
		return api.Response{}, err
	}
	items := make([]dto.WorkflowRunActivationResponse, 0, len(page.Items))
	for _, value := range page.Items {
		items = append(items, activationResponse(value))
	}
	return api.OK(dto.WorkflowRunActivationListResponse{Items: items, NextCursor: page.NextCursor}), nil
}

func (handler *Handler) ListEffects(request api.WorkspaceScopedRequest) (api.Response, error) {
	id, input, err := childListInput(request)
	if err != nil {
		return api.Response{}, err
	}
	input.RunID = id
	page, err := handler.service.ListEffects(request.Context(), input)
	if err != nil {
		return api.Response{}, err
	}
	queueContexts, err := handler.service.ListEffectQueueContexts(request.Context(), request.WorkspaceID(), id)
	if err != nil {
		return api.Response{}, err
	}
	items := make([]dto.WorkflowRunEffectResponse, 0, len(page.Items))
	for _, value := range page.Items {
		items = append(items, effectResponseWithQueue(value, queueContexts[value.ID]))
	}
	return api.OK(dto.WorkflowRunEffectListResponse{Items: items, NextCursor: page.NextCursor}), nil
}

func (handler *Handler) ListEvents(request api.WorkspaceScopedRequest) (api.Response, error) {
	id, err := requestRunID(request)
	if err != nil {
		return api.Response{}, err
	}
	limit, err := pageLimit(request)
	if err != nil {
		return api.Response{}, err
	}
	page, err := handler.service.ListEvents(request.Context(), ListEventsInput{
		WorkspaceID: request.WorkspaceID(), RunID: id, Limit: limit,
		Cursor: strings.TrimSpace(request.Gin.Query("cursor")),
	})
	if err != nil {
		return api.Response{}, err
	}
	items := make([]dto.WorkflowRunEventResponse, 0, len(page.Items))
	for _, value := range page.Items {
		items = append(items, eventResponse(value))
	}
	return api.OK(dto.WorkflowRunEventListResponse{Items: items, NextCursor: page.NextCursor}), nil
}

func childListInput(request api.WorkspaceScopedRequest) (string, ListChildrenInput, error) {
	id, err := requestRunID(request)
	if err != nil {
		return "", ListChildrenInput{}, err
	}
	limit, err := pageLimit(request)
	if err != nil {
		return "", ListChildrenInput{}, err
	}
	return id, ListChildrenInput{
		WorkspaceID: request.WorkspaceID(), Status: strings.TrimSpace(request.Gin.Query("status")),
		Limit: limit, Cursor: strings.TrimSpace(request.Gin.Query("cursor")),
	}, nil
}
