-- Chat Switchboard — 019 Tasks (SQLite)
-- Consolidated v0.28.0: merges 026 + 027
-- v0.28.0-cs3: trigger_token, action task_type, queued run status.

CREATE TABLE IF NOT EXISTS tasks (
    id                 TEXT PRIMARY KEY,
    owner_id           TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    team_id            TEXT REFERENCES teams(id) ON DELETE SET NULL,
    name               TEXT NOT NULL,
    description        TEXT DEFAULT '',
    scope              TEXT NOT NULL DEFAULT 'personal',
    task_type          TEXT NOT NULL DEFAULT 'prompt',
    system_function    TEXT DEFAULT '',
    persona_id         TEXT REFERENCES personas(id) ON DELETE SET NULL,
    model_id           TEXT,
    system_prompt      TEXT DEFAULT '',
    user_prompt        TEXT DEFAULT '',
    workflow_id        TEXT REFERENCES workflows(id) ON DELETE SET NULL,
    tool_grants        TEXT,
    schedule           TEXT NOT NULL,
    timezone           TEXT NOT NULL DEFAULT 'UTC',
    is_active          INTEGER NOT NULL DEFAULT 1,
    trigger_token      TEXT UNIQUE,
    max_tokens         INTEGER NOT NULL DEFAULT 4096,
    max_tool_calls     INTEGER NOT NULL DEFAULT 10,
    max_wall_clock     INTEGER NOT NULL DEFAULT 300,
    output_mode        TEXT NOT NULL DEFAULT 'channel',
    output_channel_id  TEXT REFERENCES channels(id) ON DELETE SET NULL,
    webhook_url        TEXT,
    webhook_secret     TEXT,
    provider_config_id TEXT REFERENCES provider_configs(id) ON DELETE SET NULL,
    notify_on_complete INTEGER NOT NULL DEFAULT 0,
    notify_on_failure  INTEGER NOT NULL DEFAULT 1,
    last_run_at        TEXT,
    next_run_at        TEXT,
    run_count          INTEGER NOT NULL DEFAULT 0,
    created_at         TEXT NOT NULL DEFAULT (datetime('now')),
    updated_at         TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_tasks_next_run ON tasks (next_run_at) WHERE is_active = 1;
CREATE INDEX IF NOT EXISTS idx_tasks_owner ON tasks (owner_id);
CREATE INDEX IF NOT EXISTS idx_tasks_team ON tasks (team_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_trigger_token ON tasks (trigger_token) WHERE trigger_token IS NOT NULL;

CREATE TABLE IF NOT EXISTS task_runs (
    id               TEXT PRIMARY KEY,
    task_id          TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
    channel_id       TEXT REFERENCES channels(id) ON DELETE SET NULL,
    status           TEXT NOT NULL DEFAULT 'running',
    trigger_payload  TEXT,
    started_at       TEXT NOT NULL DEFAULT (datetime('now')),
    completed_at     TEXT,
    tokens_used      INTEGER DEFAULT 0,
    tool_calls       INTEGER DEFAULT 0,
    wall_clock       INTEGER DEFAULT 0,
    error            TEXT
);

CREATE INDEX IF NOT EXISTS idx_task_runs_task ON task_runs (task_id);
CREATE INDEX IF NOT EXISTS idx_task_runs_status ON task_runs (task_id, status);
