package taskboard

import (
	"context"

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

// ListTaskSubtasks returns one bounded keyset page of a parent task's direct
// children in newest-first order (created_at DESC, id DESC). The parent is
// resolved and read-authorized first through the same taskboard service/context
// boundaries as Task detail, so workspace isolation, parent relation, channel
// permission checks, and the current 403/404 non-enumeration behavior are
// preserved. A cursor is always re-scoped to the resolved parent: children of
// another parent or workspace can never leak through it.
func (store *Store) ListTaskSubtasks(ctx context.Context, request ListTaskSubtasksRequest) (ListTaskSubtasksResponse, error) {
	var out0 ListTaskSubtasksResponse
	err := coredb.WithTx(ctx, store.db, func(tx coredb.Tx) error {
		var err error
		out0, err = store.InTx(tx).ListTaskSubtasks(ctx, request)
		return err
	})
	if err != nil {
		return out0, err
	}
	return out0, nil
}

func (txs TxStore) ListTaskSubtasks(ctx context.Context, request ListTaskSubtasksRequest) (ListTaskSubtasksResponse, error) {
	switch request.Context.principalType() {
	case PrincipalTypeUser:
		return txs.listTaskSubtasksForUser(ctx, request)
	case PrincipalTypeAgent:
		return txs.listTaskSubtasksForAgent(ctx, request)
	default:
		return ListTaskSubtasksResponse{}, badRequest("context subject principalType is required")
	}
}

func (txs TxStore) listTaskSubtasksForUser(ctx context.Context, request ListTaskSubtasksRequest) (ListTaskSubtasksResponse, error) {
	userID, _, err := request.Context.requireUser()
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	workspaceID, err := request.Context.requireWorkspaceID()
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	task, err := txs.resolveReadableUserTask(ctx, txs.tx, userID, workspaceID, request.Board, request.Task)
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	page, err := txs.listTasksByParentTaskPage(ctx, txs.tx, workspaceID, task.ID, request.Limit, request.Cursor)
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	return ListTaskSubtasksResponse{Tasks: page.Tasks, HasMore: page.HasMore, NextCursor: page.NextCursor}, nil
}

func (txs TxStore) listTaskSubtasksForAgent(ctx context.Context, request ListTaskSubtasksRequest) (ListTaskSubtasksResponse, error) {
	agent, err := request.Context.requireAgentActor()
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	task, err := txs.resolveReadableAgentTask(ctx, txs.tx, agent, request.Board, request.Task)
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	page, err := txs.listTasksByParentTaskPage(ctx, txs.tx, agent.WorkspaceID, task.ID, request.Limit, request.Cursor)
	if err != nil {
		return ListTaskSubtasksResponse{}, err
	}
	return ListTaskSubtasksResponse{Tasks: page.Tasks, HasMore: page.HasMore, NextCursor: page.NextCursor}, nil
}
