package plan

import (
	"net/http"
	"strings"

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

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

func (handler *CollectionHandler) Create(r api.WorkspaceScopedJSON[dto.WorkflowPlanCreateRequest]) (api.Response, error) {
	source, err := requiredSource(r.Body.Source)
	if err != nil {
		return api.Response{}, err
	}
	plan, draft, err := handler.service.Create(r.Context(), planmanage.CreateInput{
		WorkspaceID:    r.WorkspaceID(),
		Key:            r.Body.Key,
		DisplayName:    r.Body.DisplayName,
		DescriptionMD:  r.Body.DescriptionMD,
		Source:         source,
		Layout:         r.Body.Layout,
		Actor:          requestActor(r.WorkspaceScopedRequest),
		IdempotencyKey: idempotencyKey(r.WorkspaceScopedRequest),
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.Response{
		Status: http.StatusCreated,
		Body: dto.WorkflowPlanCreateResponse{
			Plan:  editablePlanResponse(plan),
			Draft: draftResponse(draft),
		},
		Headers: http.Header{
			"ETag":              []string{planETag(plan.ID, plan.Revision)},
			"X-Plan-Draft-ETag": []string{draftETag(draft.PlanID, draft.Revision)},
		},
	}, nil
}
