package teamworkflow

import (
	"net/http"
	"strings"

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

func (handler *DetailHandler) Get(request api.WorkspaceScopedRequest) (api.Response, error) {
	input, err := itemInput(request)
	if err != nil {
		return api.Response{}, err
	}
	item, err := handler.service.GetForUser(request.Context(), input)
	if err != nil {
		return api.Response{}, err
	}
	return api.Response{
		Status:  http.StatusOK,
		Body:    itemResponse(item),
		Headers: http.Header{"ETag": []string{teamWorkflowETag(item.ID, item.Revision)}},
	}, nil
}

func (handler *DetailHandler) Delete(request api.WorkspaceScopedRequest) (api.Response, error) {
	input, err := itemInput(request)
	if err != nil {
		return api.Response{}, err
	}
	expectedRevision, err := requireTeamWorkflowRevision(request.Gin.GetHeader("If-Match"), input.TeamWorkflowID)
	if err != nil {
		return api.Response{}, err
	}
	deleteInput := DeleteInput{
		UserID: input.UserID, WorkspaceID: input.WorkspaceID, TeamID: input.TeamID,
		TeamWorkflowID: input.TeamWorkflowID, ExpectedRevision: expectedRevision,
	}
	if err := handler.service.DeleteForUser(request.Context(), deleteInput); err != nil {
		return api.Response{}, err
	}
	return api.NoContent(), nil
}

func (handler *AvailabilityHandler) Update(request api.WorkspaceScopedRequest) (api.Response, error) {
	input, err := itemInput(request)
	if err != nil {
		return api.Response{}, err
	}
	expectedRevision, err := requireTeamWorkflowRevision(request.Gin.GetHeader("If-Match"), input.TeamWorkflowID)
	if err != nil {
		return api.Response{}, err
	}
	lifecycleInput := LifecycleInput{
		UserID: input.UserID, WorkspaceID: input.WorkspaceID, TeamID: input.TeamID,
		TeamWorkflowID: input.TeamWorkflowID, ExpectedRevision: expectedRevision, Archived: handler.archived,
	}
	item, err := handler.service.SetAvailabilityForUser(request.Context(), lifecycleInput)
	if err != nil {
		return api.Response{}, err
	}
	return api.Response{
		Status: http.StatusOK, Body: itemResponse(item),
		Headers: http.Header{"ETag": []string{teamWorkflowETag(item.ID, item.Revision)}},
	}, nil
}

func itemInput(request api.WorkspaceScopedRequest) (GetInput, error) {
	teamID, err := requiredParam(request, "teamId")
	if err != nil {
		return GetInput{}, err
	}
	teamWorkflowID, err := requiredParam(request, "teamWorkflowId")
	if err != nil {
		return GetInput{}, err
	}
	return GetInput{
		UserID:         strings.TrimSpace(request.UserID()),
		WorkspaceID:    strings.TrimSpace(request.WorkspaceID()),
		TeamID:         teamID,
		TeamWorkflowID: teamWorkflowID,
	}, nil
}
