package plan

import (
	"net/http"

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

func (handler *DraftHandler) Get(r api.WorkspaceScopedRequest) (api.Response, error) {
	id, err := planID(r)
	if err != nil {
		return api.Response{}, err
	}
	draft, err := handler.service.GetDraft(r.Context(), r.WorkspaceID(), id)
	if err != nil {
		return api.Response{}, err
	}
	return api.Response{Status: http.StatusOK, Body: draftResponse(draft), Headers: http.Header{"ETag": []string{draftETag(draft.PlanID, draft.Revision)}}}, nil
}

func (handler *DraftHandler) Save(r api.WorkspaceScopedJSON[dto.WorkflowPlanDraftSaveRequest]) (api.Response, error) {
	source, err := requiredSource(r.Body.Source)
	if err != nil {
		return api.Response{}, err
	}
	id, err := planID(r.WorkspaceScopedRequest)
	if err != nil {
		return api.Response{}, err
	}
	expectedRevision, err := requireDraftRevision(r.Gin.GetHeader("If-Match"), id)
	if err != nil {
		return api.Response{}, err
	}
	if err := handler.requireWorkspaceAuthoringAllowed(
		r.Context(), r.WorkspaceID(), id, r.Workspace.MemberID,
	); err != nil {
		return api.Response{}, err
	}
	draft, err := handler.service.SaveDraft(r.Context(), planmanage.SaveDraftInput{
		WorkspaceID:      r.WorkspaceID(),
		PlanID:           id,
		ExpectedRevision: expectedRevision,
		Source:           source,
		Layout:           r.Body.Layout,
		Actor:            requestActor(r.WorkspaceScopedRequest),
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.Response{Status: http.StatusOK, Body: draftResponse(draft), Headers: http.Header{"ETag": []string{draftETag(draft.PlanID, draft.Revision)}}}, nil
}
