-- Migration 018: 分组-Key 号池（一对多关系）
-- 一个分组可以有多个key，形成号池
SET search_path TO crawl;

-- 分组-Key关联表
CREATE TABLE IF NOT EXISTS group_keys (
    id          BIGSERIAL    PRIMARY KEY,
    group_id    BIGINT       NOT NULL REFERENCES model_groups(id) ON DELETE CASCADE,
    api_key_id  BIGINT       NOT NULL REFERENCES api_keys(id) ON DELETE CASCADE,
    priority    INT          NOT NULL DEFAULT 0,        -- 优先级（越大越高）
    weight      INT          NOT NULL DEFAULT 1,        -- 权重（负载均衡用）
    is_active   BOOLEAN      NOT NULL DEFAULT TRUE,     -- 是否启用
    status      VARCHAR(20)  NOT NULL DEFAULT 'active', -- active/rate_limited/banned/failed
    status_msg  TEXT,                                   -- 状态说明
    last_used_at TIMESTAMPTZ,                           -- 最后使用时间
    total_tokens BIGINT      NOT NULL DEFAULT 0,        -- 该key在该分组下使用的token总数
    request_count BIGINT     NOT NULL DEFAULT 0,        -- 请求次数
    error_count  BIGINT      NOT NULL DEFAULT 0,        -- 错误次数
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE(group_id, api_key_id)  -- 同一分组不能重复添加同一个key
);

CREATE INDEX IF NOT EXISTS idx_group_keys_group ON group_keys(group_id);
CREATE INDEX IF NOT EXISTS idx_group_keys_key ON group_keys(api_key_id);
CREATE INDEX IF NOT EXISTS idx_group_keys_status ON group_keys(status);

COMMENT ON TABLE group_keys IS '分组-Key号池关系表，一个分组可以有多个key';
COMMENT ON COLUMN group_keys.priority IS '优先级，数值越大越优先使用';
COMMENT ON COLUMN group_keys.weight IS '权重，用于加权负载均衡';
COMMENT ON COLUMN group_keys.status IS '状态: active=正常, rate_limited=限流, banned=禁用, failed=失败';
