-- 创建tokens表
CREATE TABLE IF NOT EXISTS tokens (
    id VARCHAR(255) NOT NULL,           -- token的唯一标识符
    user_id VARCHAR(255) NOT NULL,      -- 用户ID
    issuer VARCHAR(255) NOT NULL,       -- 令牌发行者
    account VARCHAR(255) NOT NULL,      -- 账户名称
    secret TEXT NOT NULL,               -- 密钥
    type VARCHAR(10) NOT NULL,          -- 令牌类型（totp/hotp）
    counter INTEGER,                    -- HOTP计数器（可选）
    period INTEGER NOT NULL,            -- TOTP周期（秒）
    digits INTEGER NOT NULL,            -- 验证码位数
    algo VARCHAR(10) NOT NULL,          -- 使用的哈希算法
    timestamp BIGINT NOT NULL,          -- 最后更新时间戳
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id, user_id)
);

-- 创建更新时间戳的触发器
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ language 'plpgsql';

CREATE TRIGGER update_tokens_updated_at
    BEFORE UPDATE ON tokens
    FOR EACH ROW
    EXECUTE FUNCTION update_updated_at_column();

-- 创建索引
CREATE INDEX IF NOT EXISTS idx_tokens_user_id ON tokens(user_id);
CREATE INDEX IF NOT EXISTS idx_tokens_timestamp ON tokens(timestamp);

-- 添加注释
COMMENT ON TABLE tokens IS 'OTP令牌数据表';
COMMENT ON COLUMN tokens.id IS '令牌的唯一标识符';
COMMENT ON COLUMN tokens.user_id IS '用户ID';
COMMENT ON COLUMN tokens.issuer IS '令牌发行者';
COMMENT ON COLUMN tokens.account IS '账户名称';
COMMENT ON COLUMN tokens.secret IS '密钥';
COMMENT ON COLUMN tokens.type IS '令牌类型（totp/hotp）';
COMMENT ON COLUMN tokens.counter IS 'HOTP计数器（可选）';
COMMENT ON COLUMN tokens.period IS 'TOTP周期（秒）';
COMMENT ON COLUMN tokens.digits IS '验证码位数';
COMMENT ON COLUMN tokens.algo IS '使用的哈希算法';
COMMENT ON COLUMN tokens.timestamp IS '最后更新时间戳';
COMMENT ON COLUMN tokens.created_at IS '创建时间';
COMMENT ON COLUMN tokens.updated_at IS '最后更新时间';