package exec

import "context"

type taskDeleteResult struct {
	DeletedTaskNumbers  []int64 `json:"deletedTaskNumbers"`
	PromotedTaskNumbers []int64 `json:"promotedTaskNumbers"`
}

var taskDeleteSpec = actionSpec[taskDeleteRequest, taskDeleteResult]{
	Meta: actionMeta{
		Domain:      "task",
		Name:        "delete",
		Summary:     "delete one agent-created task",
		Description: "Delete one task created by the current agent; promote or delete its subtasks.",
		Permission:  permissionAgentScopedMutation,
	},
	Examples: []actionExample[taskDeleteRequest]{
		{Title: "delete leaf", Input: taskDeleteRequest{Channel: "#agentteam", Number: 2021}},
	},
}

func (handler taskHandler) delete(ctx context.Context, request actionScopedJSON[taskDeleteRequest]) (actionResult[taskDeleteResult], error) {
	input := request.Body
	if err := validateTaskLocator(input.Channel, input.Number); err != nil {
		return actionResult[taskDeleteResult]{}, err
	}
	switch input.SubtaskMode {
	case "", "promote", "delete":
	default:
		return actionResult[taskDeleteResult]{}, NewError(CodeValidation, "subtaskMode must be promote or delete")
	}
	result, err := handler.remote(request.Authorized).delete(ctx, input)
	if err != nil {
		return actionResult[taskDeleteResult]{}, classifyTaskError(err, "delete task failed")
	}
	if result.DeletedTaskNumbers == nil {
		result.DeletedTaskNumbers = []int64{}
	}
	if result.PromotedTaskNumbers == nil {
		result.PromotedTaskNumbers = []int64{}
	}
	return actionResult[taskDeleteResult]{Data: result, Text: "Deleted task(s)."}, nil
}

type taskDeleteRequest struct {
	Channel     string `json:"channel" jsonschema:"minLength=1"`
	Number      int    `json:"number" jsonschema:"minimum=1"`
	SubtaskMode string `json:"subtaskMode,omitempty" jsonschema:"enum=promote,enum=delete"`
}
