package taskboard

import (
	"context"
	"strings"
)

const (
	taskDetailTimelinePageSize = 20
	taskTimelineMaxPageSize    = 100
)

type taskDiscussionMentionTarget struct {
	AgentID      string
	MemberID     string
	MentionToken string
}

// SendTaskScopeMessage authorizes a Task discussion and writes it as a
// task-scope message with the Task metadata side effects required by readers.
func (txs TxStore) SendTaskScopeMessage(ctx context.Context, request SendTaskScopeMessageRequest) (SendTaskScopeMessageResponse, error) {
	workspaceID, err := request.Context.requireWorkspaceID()
	if err != nil {
		return SendTaskScopeMessageResponse{}, err
	}

	switch request.Context.principalType() {
	case PrincipalTypeUser:
		userID, _, err := request.Context.requireUser()
		if err != nil {
			return SendTaskScopeMessageResponse{}, err
		}
		result, err := txs.sendTaskScopeMessageForUser(ctx, userID, workspaceID, request.Task, request.TaskScopeID, request.Message, request.ClientMessageID)
		if err != nil {
			return SendTaskScopeMessageResponse{}, err
		}
		return result, nil
	case PrincipalTypeAgent:
		agent, err := request.Context.requireAgentActor()
		if err != nil {
			return SendTaskScopeMessageResponse{}, err
		}
		if taskID := strings.TrimSpace(request.Task.TaskID); taskID != "" || strings.TrimSpace(request.TaskScopeID) != "" {
			result, err := txs.sendTaskScopeMessageForAgentTaskTarget(ctx, agent, request.Task, request.TaskScopeID, request.Message, request.ClientMessageID, request.Freshness)
			if err != nil {
				return SendTaskScopeMessageResponse{}, err
			}
			return result, nil
		}
		taskNumber, err := request.Task.requireTaskNumber()
		if err != nil {
			return SendTaskScopeMessageResponse{}, err
		}
		result, err := txs.sendTaskScopeMessageForAgentNumber(ctx, agent, request.Board, taskNumber, request.Message, request.ClientMessageID, request.Freshness)
		if err != nil {
			return SendTaskScopeMessageResponse{}, err
		}
		return result, nil
	default:
		return SendTaskScopeMessageResponse{}, badRequest("context subject principalType is required")
	}
}
