-- Migration 047: Create referral_profiles table
-- 推荐关系表: 每个用户一条记录，记录推荐码、推荐人、推荐链

CREATE TABLE IF NOT EXISTS referral_profiles (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- 用户 ID (对应 users.id)
    user_id UUID NOT NULL,

    -- 此用户的推荐码 (用于邀请他人注册)
    referral_code VARCHAR(20) NOT NULL,

    -- 推荐人 userId (注册时使用了他人推荐码时才有值)
    referrer_id UUID,

    -- 注册时填写的推荐码 (即推荐人的推荐码)
    used_code VARCHAR(20),

    -- 推荐链: 从直接推荐人到顶层的 userId 数组 (PostgreSQL 原生 text[])
    referral_chain TEXT[] NOT NULL DEFAULT '{}',

    -- 直推下级人数
    direct_referral_count INTEGER NOT NULL DEFAULT 0,

    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- 唯一约束
CREATE UNIQUE INDEX IF NOT EXISTS idx_referral_profiles_user
    ON referral_profiles(user_id);

CREATE UNIQUE INDEX IF NOT EXISTS idx_referral_profiles_code
    ON referral_profiles(referral_code);

-- 推荐人查询加速
CREATE INDEX IF NOT EXISTS idx_referral_profiles_referrer
    ON referral_profiles(referrer_id);

-- updated_at 自动更新触发器
CREATE OR REPLACE FUNCTION update_referral_profiles_updated_at()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_referral_profiles_updated_at
    BEFORE UPDATE ON referral_profiles
    FOR EACH ROW EXECUTE FUNCTION update_referral_profiles_updated_at();
