package task

import (
	"net/http"
	"strings"

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

// List handles GET /api/task-board/options.
// It returns all configured field options for the task board.
func (handler *BoardOptionHandler) List(r api.WorkspaceScopedRequest) (api.Response, error) {
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	response, err := handler.taskBoard.ListTaskFieldOptions(r.Context(), ListTaskFieldOptionsRequest{
		Context: NewUserServiceContext(workspaceID, authenticated.User.ID, authenticated.User.Name),
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToTaskBoardOptions(taskboardListTaskFieldOptionsResponseForDTO(response))), nil
}

// Create handles POST /api/task-board/options.
// It creates a new field option for the task board.
func (handler *BoardOptionHandler) Create(r api.WorkspaceScopedJSON[dto.TaskBoardOptionRequest]) (api.Response, error) {
	request := r.Body
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	response, err := handler.taskBoard.UpsertTaskFieldOption(r.Context(), UpsertTaskFieldOptionRequest{
		Context: NewUserServiceContext(workspaceID, authenticated.User.ID, authenticated.User.Name),
		Option: TaskFieldOptionInput{
			FieldKind: request.FieldKind,
			Key:       request.Key,
			Label:     request.Label,
			Aliases:   request.Aliases,
		},
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(dto.TaskBoardOptionResponse{Option: converter.ToTaskFieldOption(taskboardTaskFieldOptionForDTO(response.Option))}), nil
}

// Update handles PATCH /api/task-board/options/:optionId.
// It updates the label and aliases of an existing field option.
func (handler *BoardOptionHandler) Update(r api.WorkspaceScopedJSON[dto.TaskBoardOptionRequest]) (api.Response, error) {
	request := r.Body
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	optionID := strings.TrimSpace(r.Gin.Param("optionId"))
	if optionID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "optionId is required")
	}

	response, err := handler.taskBoard.UpsertTaskFieldOption(r.Context(), UpsertTaskFieldOptionRequest{
		Context:  NewUserServiceContext(workspaceID, authenticated.User.ID, authenticated.User.Name),
		OptionID: optionID,
		Option: TaskFieldOptionInput{
			Label:   request.Label,
			Aliases: request.Aliases,
		},
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(dto.TaskBoardOptionResponse{Option: converter.ToTaskFieldOption(taskboardTaskFieldOptionForDTO(response.Option))}), nil
}

// Reorder handles POST /api/task-board/options/:optionId/reorder.
// It moves a field option to a new position in the ordering.
func (handler *BoardOptionHandler) Reorder(r api.WorkspaceScopedJSON[dto.TaskBoardOptionReorderRequest]) (api.Response, error) {
	request := r.Body
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	optionID := strings.TrimSpace(r.Gin.Param("optionId"))
	if optionID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "optionId is required")
	}

	response, err := handler.taskBoard.ReorderTaskFieldOption(r.Context(), ReorderTaskFieldOptionRequest{
		Context:  NewUserServiceContext(workspaceID, authenticated.User.ID, authenticated.User.Name),
		OptionID: optionID,
		Position: request.Position,
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(dto.TaskBoardOptionResponse{Option: converter.ToTaskFieldOption(taskboardTaskFieldOptionForDTO(response.Option))}), nil
}

// Deactivate handles POST /api/task-board/options/:optionId/deactivate.
// It deactivates a field option so it no longer appears in selections.
func (handler *BoardOptionHandler) Deactivate(r api.WorkspaceScopedRequest) (api.Response, error) {
	return handler.setActive(r, false)
}

// Reactivate handles POST /api/task-board/options/:optionId/reactivate.
// It reactivates a previously deactivated field option.
func (handler *BoardOptionHandler) Reactivate(r api.WorkspaceScopedRequest) (api.Response, error) {
	return handler.setActive(r, true)
}

func (handler *BoardOptionHandler) setActive(r api.WorkspaceScopedRequest, active bool) (api.Response, error) {
	authenticated := r.User
	workspaceID := r.WorkspaceID()

	optionID := strings.TrimSpace(r.Gin.Param("optionId"))
	if optionID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "optionId is required")
	}

	response, err := handler.taskBoard.SetTaskFieldOptionActive(r.Context(), SetTaskFieldOptionActiveRequest{
		Context:  NewUserServiceContext(workspaceID, authenticated.User.ID, authenticated.User.Name),
		OptionID: optionID,
		Active:   active,
	})
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToTaskBoardOptionActive(taskboardSetTaskFieldOptionActiveResponseForDTO(response))), nil
}
