-- ============================================================
-- schema/config.sql — 配置表 DDL（参考副本）
-- ============================================================
-- 数据库：TimescaleDB (PostgreSQL 17)
-- 说明：管理系统配置、监控标的、交易所连接参数
--
-- ⚠️ 权威初始化脚本已迁移至：data/init-db/001_init.sql
--    本文件保留作为 pg.initSchema() 非 Docker 部署的回退方案和文档参考。
--    修改表结构时请同步更新 001_init.sql。
-- ============================================================

-- ============================================================
-- 1. monitored_symbols — 监控交易对配置
-- ============================================================
-- 用途：声明数据采集模块需要订阅哪些交易对的 K 线流
-- 消费方：WebSocket 行情采集服务启动时读取此表决定订阅列表
-- ============================================================
CREATE TABLE IF NOT EXISTS monitored_symbols (
    id          SERIAL        PRIMARY KEY,

    -- ---- 标识维度（与 klines 表对齐） ----
    exchange    TEXT          NOT NULL,  -- 交易所：binance / okx / bybit
    symbol      TEXT          NOT NULL,  -- 交易对：BTCUSDT / ETHUSDT
    interval    TEXT          NOT NULL,  -- K 线周期：1m / 5m / 15m / 1h / 4h / 1d

    -- ---- 控制字段 ----
    enabled     BOOLEAN       NOT NULL DEFAULT TRUE,  -- 是否启用采集
    priority    SMALLINT      NOT NULL DEFAULT 0,     -- 优先级（数值越大越优先，用于限频时取舍）

    -- ---- 备注 ----
    label       TEXT,          -- 人类可读标签，如 "BTC/USDT 1分钟线"
    notes       TEXT,          -- 备注说明

    -- ---- 元数据 ----
    created_at  TIMESTAMPTZ   NOT NULL DEFAULT NOW(),
    updated_at  TIMESTAMPTZ   NOT NULL DEFAULT NOW(),

    -- 同一 (exchange, symbol, interval) 组合不可重复
    UNIQUE (exchange, symbol, interval)
);

-- 索引：按启用状态快速筛选
CREATE INDEX IF NOT EXISTS idx_monitored_symbols_enabled
    ON monitored_symbols (enabled, exchange, priority DESC);

-- 索引：按交易对查找所有周期
CREATE INDEX IF NOT EXISTS idx_monitored_symbols_symbol
    ON monitored_symbols (symbol, interval);

COMMENT ON TABLE  monitored_symbols IS '监控交易对配置表：声明哪些 (交易所,交易对,周期) 需要采集 K 线数据';
COMMENT ON COLUMN monitored_symbols.exchange  IS '交易所标识：binance / okx / bybit';
COMMENT ON COLUMN monitored_symbols.symbol    IS '交易对：BTCUSDT / ETHUSDT';
COMMENT ON COLUMN monitored_symbols.interval  IS 'K 线周期：1m / 5m / 15m / 1h / 4h / 1d';
COMMENT ON COLUMN monitored_symbols.enabled   IS '是否启用 WebSocket 订阅';
COMMENT ON COLUMN monitored_symbols.priority  IS '优先级（0-32767），限频时高优先级交易对优先保留';


-- ============================================================
-- 2. exchange_config — 交易所连接配置
-- ============================================================
-- 用途：存储各交易所的 API 端点、限频参数等连接级配置
-- 安全提醒：API Key/Secret 不应明文存储于此表，
--           建议通过环境变量或 Vault 注入，此表仅存非敏感参数
-- ============================================================
CREATE TABLE IF NOT EXISTS exchange_config (
    id          SERIAL        PRIMARY KEY,

    -- ---- 交易所标识 ----
    exchange    TEXT          NOT NULL UNIQUE,  -- 交易所：binance / okx / bybit

    -- ---- 连接参数 ----
    rest_url    TEXT,          -- REST API 基础 URL（留空则用 SDK 默认值）
    ws_url      TEXT,          -- WebSocket 基础 URL（留空则用 SDK 默认值）
    ws_ping_interval_ms INTEGER NOT NULL DEFAULT 30000, -- 心跳间隔（毫秒）

    -- ---- 限频控制 ----
    rate_limit_per_sec  REAL  NOT NULL DEFAULT 20.0,  -- 每秒最大请求数
    max_reconnect_attempts INT NOT NULL DEFAULT 10,   -- 最大重连次数
    reconnect_delay_ms     INT NOT NULL DEFAULT 3000, -- 重连延迟基数（指数退避）

    -- ---- 开关 ----
    enabled     BOOLEAN       NOT NULL DEFAULT TRUE,  -- 是否启用该交易所

    -- ---- 备注 ----
    notes       TEXT,

    -- ---- 元数据 ----
    created_at  TIMESTAMPTZ   NOT NULL DEFAULT NOW(),
    updated_at  TIMESTAMPTZ   NOT NULL DEFAULT NOW()
);

COMMENT ON TABLE  exchange_config IS '交易所连接配置表：REST/WS 端点、限频、重连策略';
COMMENT ON COLUMN exchange_config.rest_url              IS 'REST API 地址，空则使用 SDK 默认';
COMMENT ON COLUMN exchange_config.ws_url                IS 'WebSocket 地址，空则使用 SDK 默认';
COMMENT ON COLUMN exchange_config.rate_limit_per_sec    IS '每秒最大请求数（Binance 默认 20/s）';
COMMENT ON COLUMN exchange_config.max_reconnect_attempts IS 'WebSocket 断线最大重连次数';
COMMENT ON COLUMN exchange_config.reconnect_delay_ms    IS '重连退避基数（实际延迟 = 基数 × 2^attempts）';


-- ============================================================
-- 3. app_config — 全局应用配置（Key-Value）
-- ============================================================
-- 用途：存储不适合硬编码的运行时参数，如批量写入阈值
-- ============================================================
CREATE TABLE IF NOT EXISTS app_config (
    id          SERIAL        PRIMARY KEY,
    key         TEXT          NOT NULL UNIQUE,  -- 配置键
    value       TEXT          NOT NULL,         -- 配置值（统一存为文本，消费方自行解析类型）
    description TEXT,                           -- 说明
    updated_at  TIMESTAMPTZ   NOT NULL DEFAULT NOW()
);

COMMENT ON TABLE app_config IS '全局应用配置（KV 结构），运行时参数集中管理';

-- 默认配置项
INSERT INTO app_config (key, value, description) VALUES
    ('batch_size',            '500',  '批量写入缓冲区条数阈值'),
    ('flush_interval_ms',     '1000', '缓冲区最大等待时间（毫秒）'),
    ('log_level',             'info', '日志级别：trace / debug / info / warn / error'),
    ('redis_publish_enabled', 'true', '是否启用 Redis 发布')
ON CONFLICT (key) DO NOTHING;


-- ============================================================
-- 4. 初始数据：预置常见交易对的监控配置
-- ============================================================
-- 以下为建议的默认监控列表，可根据实际需求增删
INSERT INTO monitored_symbols (exchange, symbol, interval, enabled, priority, label) VALUES
    -- Binance 主力交易对 — 1m
    ('binance', 'BTCUSDT', '1m',  TRUE, 10, 'BTC/USDT 1分钟线'),
    ('binance', 'ETHUSDT', '1m',  TRUE, 9,  'ETH/USDT 1分钟线'),
    ('binance', 'SOLUSDT', '1m',  TRUE, 8,  'SOL/USDT 1分钟线'),
    ('binance', 'BNBUSDT', '1m',  TRUE, 7,  'BNB/USDT 1分钟线'),

    -- Binance 主力交易对 — 1h（策略用）
    ('binance', 'BTCUSDT', '1h',  TRUE, 10, 'BTC/USDT 1小时线'),
    ('binance', 'ETHUSDT', '1h',  TRUE, 9,  'ETH/USDT 1小时线'),
    ('binance', 'SOLUSDT', '1h',  TRUE, 8,  'SOL/USDT 1小时线'),

    -- Binance 主力交易对 — 1d（日线）
    ('binance', 'BTCUSDT', '1d',  TRUE, 10, 'BTC/USDT 日线'),
    ('binance', 'ETHUSDT', '1d',  TRUE, 9,  'ETH/USDT 日线')
ON CONFLICT (exchange, symbol, interval) DO NOTHING;

-- 预置交易所默认连接配置
INSERT INTO exchange_config (exchange, rate_limit_per_sec, notes) VALUES
    ('binance', 20.0,  'Binance 现货 — 默认权重限频 1200/min'),
    ('okx',     10.0,  'OKX 现货 — 默认限频 10/s'),
    ('bybit',   10.0,  'Bybit 现货 — 默认限频 10/s')
ON CONFLICT (exchange) DO NOTHING;


-- ============================================================
-- 5. 常用查询示例
-- ============================================================

-- 查询所有启用的监控标的（采集服务启动时使用）
-- SELECT exchange, symbol, interval, priority
-- FROM monitored_symbols
-- WHERE enabled = TRUE
-- ORDER BY exchange, priority DESC, symbol, interval;

-- 查询某交易所下所有交易对
-- SELECT DISTINCT symbol
-- FROM monitored_symbols
-- WHERE exchange = 'binance' AND enabled = TRUE
-- ORDER BY symbol;

-- 禁用某个交易对的采集
-- UPDATE monitored_symbols SET enabled = FALSE, updated_at = NOW()
-- WHERE exchange = 'binance' AND symbol = 'BTCUSDT' AND interval = '1m';

-- 新增监控标的（动态添加，无需重启）
-- INSERT INTO monitored_symbols (exchange, symbol, interval, enabled, priority, label)
-- VALUES ('binance', 'DOGEUSDT', '1m', TRUE, 5, 'DOGE/USDT 1分钟线')
-- ON CONFLICT (exchange, symbol, interval) DO UPDATE
-- SET enabled = TRUE, updated_at = NOW();
