-- SQLite 建表脚本
-- 用于 go-trustlog 数据库持久化模块
-- SQLite 3+ 版本

-- ============================================
-- 1. operation 表 - 操作记录表
-- ============================================
CREATE TABLE IF NOT EXISTS operation (
    op_id              TEXT NOT NULL PRIMARY KEY,
    op_actor           TEXT,
    doid               TEXT,
    producer_id        TEXT,
    request_body_hash  TEXT,
    response_body_hash TEXT,
    sign               TEXT,
    op_source          TEXT,
    op_type            TEXT,
    do_prefix          TEXT,
    do_repository      TEXT,
    client_ip          TEXT,          -- 客户端IP（可空，仅落库，不存证）
    server_ip          TEXT,          -- 服务端IP（可空，仅落库，不存证）
    trustlog_status    TEXT,          -- 存证状态：NOT_TRUSTLOGGED / TRUSTLOGGED
    timestamp          DATETIME,
    created_at         DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建索引
CREATE INDEX IF NOT EXISTS idx_operation_timestamp ON operation(timestamp);
CREATE INDEX IF NOT EXISTS idx_operation_status ON operation(trustlog_status);
CREATE INDEX IF NOT EXISTS idx_operation_doid ON operation(doid);

-- ============================================
-- 2. trustlog_cursor 表 - 游标表（任务发现队列）
-- ============================================
CREATE TABLE IF NOT EXISTS trustlog_cursor (
    cursor_key       TEXT NOT NULL PRIMARY KEY,          -- 游标键（如：operation_scan）
    cursor_value     TEXT NOT NULL,                      -- 游标值（最后处理的时间戳，RFC3339Nano格式）
    last_updated_at  TEXT DEFAULT (datetime('now'))      -- 最后更新时间
);

-- 创建索引
CREATE INDEX IF NOT EXISTS idx_cursor_updated_at ON trustlog_cursor(last_updated_at);

-- ============================================
-- 3. trustlog_retry 表 - 重试表
-- ============================================
CREATE TABLE IF NOT EXISTS trustlog_retry (
    op_id              TEXT NOT NULL PRIMARY KEY,
    retry_count        INTEGER DEFAULT 0,                -- 重试次数
    retry_status       TEXT DEFAULT 'PENDING',          -- 重试状态：PENDING / RETRYING / DEAD_LETTER
    last_retry_at      DATETIME,                        -- 上次重试时间
    next_retry_at      DATETIME,                        -- 下次重试时间（用于指数退避）
    error_message      TEXT,                            -- 错误信息
    created_at         DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at         DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建索引
CREATE INDEX IF NOT EXISTS idx_retry_status ON trustlog_retry(retry_status);
CREATE INDEX IF NOT EXISTS idx_retry_next_retry_at ON trustlog_retry(next_retry_at);

-- ============================================
-- 验证查询
-- ============================================

-- 查询所有表
SELECT name FROM sqlite_master 
WHERE type='table' 
    AND name IN ('operation', 'trustlog_cursor', 'trustlog_retry');

-- 查询 operation 表结构
PRAGMA table_info(operation);

-- 查询所有索引
SELECT name, tbl_name FROM sqlite_master 
WHERE type='index' 
    AND tbl_name IN ('operation', 'trustlog_cursor', 'trustlog_retry')
ORDER BY tbl_name, name;

-- 查询游标表初始记录
SELECT * FROM trustlog_cursor WHERE id = 1;

