package binding

import (
	"net/http"
	"strings"

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

func (handler *CollectionHandler) List(request api.WorkspaceScopedRequest) (api.Response, error) {
	limit, err := pageLimit(request)
	if err != nil {
		return api.Response{}, err
	}
	page, err := handler.service.List(request.Context(), ListInput{
		WorkspaceID:     request.WorkspaceID(),
		PlanID:          strings.TrimSpace(request.Gin.Query("planId")),
		State:           strings.TrimSpace(request.Gin.Query("state")),
		IncludeArchived: includeArchived(request),
		Limit:           limit,
		Cursor:          strings.TrimSpace(request.Gin.Query("cursor")),
	})
	if err != nil {
		return api.Response{}, err
	}
	items := make([]dto.WorkflowBindingResponse, 0, len(page.Items))
	for _, item := range page.Items {
		items = append(items, bindingResponse(item))
	}
	return api.OK(dto.WorkflowBindingListResponse{Items: items, NextCursor: page.NextCursor}), nil
}

func (handler *CollectionHandler) Create(request api.WorkspaceScopedJSON[dto.WorkflowBindingCreateRequest]) (api.Response, error) {
	planID, err := requiredPlanID(request.Body.PlanID)
	if err != nil {
		return api.Response{}, err
	}
	planVersionID, source, inputPolicy, err := requiredRevisionSpec(request.Body.PlanVersionID, request.Body.Source, request.Body.InputPolicy)
	if err != nil {
		return api.Response{}, err
	}
	idempotencyKey, err := requireIdempotencyKey(request.Gin.GetHeader(idempotencyHeader))
	if err != nil {
		return api.Response{}, err
	}
	if request.Body.Activate == nil {
		return api.Response{}, publicError(http.StatusBadRequest, "binding_invalid_request", "activate is required")
	}
	binding, revision, err := handler.service.Create(request.Context(), CreateInput{
		WorkspaceID:    request.WorkspaceID(),
		Key:            request.Body.Key,
		DisplayName:    request.Body.DisplayName,
		DescriptionMD:  request.Body.DescriptionMD,
		PlanID:         planID,
		PlanVersionID:  planVersionID,
		Source:         source,
		InputPolicy:    inputPolicy,
		Activate:       *request.Body.Activate,
		Owner:          requestOwner(request.WorkspaceScopedRequest),
		Actor:          requestActor(request.WorkspaceScopedRequest),
		IdempotencyKey: idempotencyKey,
	})
	if err != nil {
		return api.Response{}, err
	}
	return bindingRevisionMutationResponse(http.StatusCreated, binding, revision), nil
}
