-- =============================================================================
-- 迁移脚本：创建 Web 管理后台所需的 4 张表
-- 数据库：zqyy_app
-- 关联需求：Requirements 1.1（用户认证）、4.1（任务队列）、5.1（调度任务）
-- =============================================================================

BEGIN;

-- ---------------------------------------------------------------------------
-- admin_users 表：管理后台操作员账户
-- 每个 Operator 绑定一个门店（site_id），登录后 JWT 携带 site_id
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS admin_users (
    id            SERIAL        PRIMARY KEY,
    username      VARCHAR(64)   UNIQUE NOT NULL,
    password_hash VARCHAR(256)  NOT NULL,
    display_name  VARCHAR(128),
    site_id       BIGINT        NOT NULL,          -- 绑定的门店 ID
    is_active     BOOLEAN       DEFAULT TRUE,
    created_at    TIMESTAMPTZ   DEFAULT NOW(),
    updated_at    TIMESTAMPTZ   DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_admin_users_site
    ON admin_users(site_id);

-- ---------------------------------------------------------------------------
-- task_queue 表：ETL 任务执行队列
-- 状态流转：pending → running → success / failed / cancelled
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS task_queue (
    id            UUID          PRIMARY KEY DEFAULT gen_random_uuid(),
    site_id       BIGINT        NOT NULL,          -- 门店隔离
    config        JSONB         NOT NULL,           -- 序列化的 TaskConfig
    status        VARCHAR(20)   NOT NULL DEFAULT 'pending',
    position      INTEGER       NOT NULL DEFAULT 0,
    created_at    TIMESTAMPTZ   DEFAULT NOW(),
    started_at    TIMESTAMPTZ,
    finished_at   TIMESTAMPTZ,
    exit_code     INTEGER,
    error_message TEXT
);

-- 按状态查询（如获取所有 running 任务）
CREATE INDEX IF NOT EXISTS idx_task_queue_status
    ON task_queue(status);

-- 按门店 + 位置查询待执行任务（部分索引，仅 pending 状态）
CREATE INDEX IF NOT EXISTS idx_task_queue_site_position
    ON task_queue(site_id, position)
    WHERE status = 'pending';

-- ---------------------------------------------------------------------------
-- task_execution_log 表：任务执行历史记录
-- 每次执行（无论来自队列还是直接触发）都记录一条日志
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS task_execution_log (
    id            UUID          PRIMARY KEY DEFAULT gen_random_uuid(),
    queue_id      UUID          REFERENCES task_queue(id),
    site_id       BIGINT        NOT NULL,          -- 门店隔离
    task_codes    TEXT[]        NOT NULL,
    status        VARCHAR(20)   NOT NULL,
    started_at    TIMESTAMPTZ   NOT NULL,
    finished_at   TIMESTAMPTZ,
    exit_code     INTEGER,
    duration_ms   INTEGER,
    command       TEXT,                             -- 实际执行的 CLI 命令
    output_log    TEXT,                             -- stdout 完整日志
    error_log     TEXT,                             -- stderr 日志
    summary       JSONB,                            -- 执行摘要
    created_at    TIMESTAMPTZ   DEFAULT NOW()
);

-- 按门店 + 开始时间倒序查询（执行历史列表）
CREATE INDEX IF NOT EXISTS idx_execution_log_site_started
    ON task_execution_log(site_id, started_at DESC);

-- ---------------------------------------------------------------------------
-- scheduled_tasks 表：定时调度任务
-- 支持一次性 / 固定间隔 / 每日 / 每周 / Cron 五种调度类型
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS scheduled_tasks (
    id              UUID          PRIMARY KEY DEFAULT gen_random_uuid(),
    site_id         BIGINT        NOT NULL,          -- 门店隔离
    name            VARCHAR(256)  NOT NULL,
    task_codes      TEXT[]        NOT NULL,
    task_config     JSONB         NOT NULL,           -- 序列化的 TaskConfig
    schedule_config JSONB         NOT NULL,           -- 序列化的 ScheduleConfig
    enabled         BOOLEAN       DEFAULT TRUE,
    last_run_at     TIMESTAMPTZ,
    next_run_at     TIMESTAMPTZ,
    run_count       INTEGER       DEFAULT 0,
    last_status     VARCHAR(20),
    created_at      TIMESTAMPTZ   DEFAULT NOW(),
    updated_at      TIMESTAMPTZ   DEFAULT NOW()
);

-- 按门店查询调度任务
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_site
    ON scheduled_tasks(site_id);

-- 查询到期的已启用调度任务（部分索引）
CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_next_run
    ON scheduled_tasks(next_run_at)
    WHERE enabled = TRUE;

COMMIT;
