-- +goose Up
-- +goose StatementBegin
-- Users
CREATE TABLE IF NOT EXISTS users(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：用户唯一标识；约束：PK/不可为空
    username varchar(255) NOT NULL UNIQUE, -- 用户名：登录账号；用途：登录/展示；约束：唯一/非空/长度<=255
    password varchar(255) NOT NULL, -- 密码：加密存储；用途：登录校验；约束：非空/不得明文
    roles text[] DEFAULT '{user}', -- 角色：权限集合；用途：鉴权/授权；约束：枚举值数组/默认{user}
    status varchar(50) DEFAULT 'active', -- 状态：账号状态；用途：禁用控制；约束：active/inactive/banned/默认active
    metas jsonb DEFAULT '{}', -- 元数据：扩展信息；用途：灵活扩展；约束：JSON对象/默认{}
    balance bigint DEFAULT 0, -- 余额：全局可用余额；用途：钱包/支付；约束：最小货币单位/默认0
    balance_frozen bigint DEFAULT 0, -- 冻结余额：冻结资金；用途：风控/结算；约束：最小货币单位/默认0
    verified_at timestamp with time zone, -- 实名认证时间：通过时间；用途：风控展示；约束：可空
    nickname varchar(255) DEFAULT '', -- 昵称：展示名称；用途：前台展示；约束：长度<=255/可空
    avatar varchar(512) DEFAULT '', -- 头像：URL地址；用途：展示；约束：长度<=512/可空
    gender varchar(32) DEFAULT 'secret', -- 性别：用户性别；用途：资料展示；约束：male/female/secret/默认secret
    bio varchar(512) DEFAULT '', -- 简介：用户简介；用途：个人主页；约束：长度<=512/可空
    birthday date, -- 生日：YYYY-MM-DD；用途：资料展示；约束：可空
    location jsonb DEFAULT '{}', -- 位置：省市信息；用途：资料展示；约束：JSON对象/默认{}
    points bigint DEFAULT 0, -- 积分：用户积分；用途：积分体系；约束：>=0/默认0
    phone varchar(32) DEFAULT '', -- 手机号：登录/验证；用途：OTP登录；约束：长度<=32/可空
    is_real_name_verified boolean DEFAULT FALSE, -- 实名认证：是否认证；用途：风控/展示；约束：布尔/默认false
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    deleted_at timestamp with time zone -- 删除时间：软删除；用途：逻辑删除；约束：可空
);

-- Tenants
CREATE TABLE IF NOT EXISTS tenants(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：租户唯一标识；约束：PK/不可为空
    user_id bigint NOT NULL, -- 创建者ID：关联users.id；用途：租户归属；约束：非空
    code varchar(64) NOT NULL UNIQUE, -- 租户代码：唯一编码；用途：URL/路由；约束：唯一/非空/长度<=64
    uuid uuid NOT NULL, -- UUID：全局唯一；用途：外部标识；约束：非空
    name varchar(128) NOT NULL, -- 租户名称：展示名；用途：后台展示；约束：非空/长度<=128
    status varchar(64) NOT NULL, -- 状态：租户状态；用途：启停控制；约束：pending_verify/verified/banned
    config jsonb DEFAULT '{}', -- 配置：租户配置；用途：功能开关；约束：JSON对象/默认{}
    expired_at timestamp with time zone, -- 过期时间：租户有效期；用途：到期控制；约束：可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

CREATE INDEX IF NOT EXISTS idx_tenants_user_id ON tenants(user_id);

-- TenantUsers
CREATE TABLE IF NOT EXISTS tenant_users(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：成员关系唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：关联tenants.id；用途：多租户隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：关联users.id；用途：成员归属；约束：非空
    role text[] DEFAULT '{member}', -- 角色：成员角色；用途：权限控制；约束：member/tenant_admin/默认member
    status varchar(50) DEFAULT 'verified', -- 状态：成员状态；用途：启停控制；约束：pending_verify/verified/banned
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    UNIQUE (tenant_id, user_id) -- 约束：同一租户内用户唯一
);

-- Contents
CREATE TABLE IF NOT EXISTS contents(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：内容唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：内容作者；用途：归属；约束：非空
    title varchar(255) NOT NULL, -- 标题：内容标题；用途：列表展示/搜索；约束：非空/长度<=255
    description text NOT NULL, -- 描述：详情说明；用途：详情展示；约束：非空
    status varchar(32) DEFAULT 'draft', -- 状态：内容状态；用途：审核/发布控制；约束：draft/reviewing/published/unpublished/blocked
    visibility varchar(32) DEFAULT 'tenant_only', -- 可见性：可见范围；用途：权限控制；约束：public/tenant_only/private
    preview_seconds int DEFAULT 60, -- 试看秒数：试看时长；用途：试看控制；约束：>=0/默认60
    preview_downloadable boolean DEFAULT FALSE, -- 试看下载：是否允许下载；用途：权限控制；约束：布尔/默认false
    published_at timestamp with time zone, -- 发布时间：发布时刻；用途：排序/展示；约束：可空
    summary varchar(256) DEFAULT '', -- 简介：列表摘要；用途：卡片展示；约束：长度<=256/可空
    tags jsonb DEFAULT '[]', -- 标签：标签列表；用途：筛选；约束：JSON数组/默认[]
    body text DEFAULT '', -- 内容正文：图文内容；用途：详情页；约束：可空
    genre varchar(64) DEFAULT '', -- 流派：内容类型；用途：分类筛选；约束：长度<=64/可空
    views int DEFAULT 0, -- 浏览量：浏览计数；用途：热度排序；约束：>=0/默认0
    likes int DEFAULT 0, -- 点赞数：点赞计数；用途：热度排序；约束：>=0/默认0
    key varchar(32) DEFAULT '', -- 调性：音乐调性；用途：展示/筛选；约束：长度<=32/可空
    is_pinned boolean DEFAULT FALSE, -- 置顶：是否置顶；用途：首页推荐；约束：布尔/默认false
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    deleted_at timestamp with time zone -- 删除时间：软删除；用途：逻辑删除；约束：可空
);

CREATE INDEX IF NOT EXISTS idx_contents_tenant_id ON contents(tenant_id);

-- MediaAssets
CREATE TABLE IF NOT EXISTS media_assets(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：资源唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：资源上传者；用途：归属；约束：非空
    type varchar(32) DEFAULT 'video', -- 资源类型：媒体类型；用途：播放/展示；约束：video/audio/image
    status varchar(32) DEFAULT 'uploaded', -- 处理状态：处理阶段；用途：转码流程；约束：uploaded/processing/ready/failed/deleted
    provider varchar(64) NOT NULL, -- 存储提供方：存储类型；用途：访问/迁移；约束：非空
    bucket varchar(128) NOT NULL, -- 存储桶：桶名称；用途：定位对象；约束：非空
    object_key varchar(512) NOT NULL, -- 对象Key：对象路径；用途：访问对象；约束：非空/长度<=512
    meta jsonb DEFAULT '{}', -- 元数据：资源信息；用途：文件元数据；约束：JSON对象/默认{}
    variant varchar(32) DEFAULT 'main', -- 产物类型：衍生版本；用途：主片/预览；约束：main/preview/默认main
    source_asset_id bigint DEFAULT 0, -- 来源资源ID：派生来源；用途：追溯；约束：0表示无
    hash varchar(64) DEFAULT '', -- 文件哈希：用于去重；用途：秒传/去重；约束：长度<=64/可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    deleted_at timestamp with time zone -- 删除时间：软删除；用途：逻辑删除；约束：可空
);

CREATE INDEX IF NOT EXISTS idx_media_assets_hash ON media_assets (hash);

-- ContentAssets
CREATE TABLE IF NOT EXISTS content_assets(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：内容资源关联；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：关联创建者；用途：归属；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：内容资源绑定；约束：非空
    asset_id bigint NOT NULL, -- 资源ID：关联资源；用途：内容资源绑定；约束：非空
    role varchar(32) DEFAULT 'main', -- 资源角色：资源用途；用途：封面/主文件；约束：main/cover/preview
    sort int DEFAULT 0, -- 排序：展示排序；用途：前端排序；约束：>=0/默认0
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

-- ContentPrices
CREATE TABLE IF NOT EXISTS content_prices(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：价格记录；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：内容作者；用途：归属；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：定价归属；约束：非空
    currency varchar(16) DEFAULT 'CNY', -- 币种：货币类型；用途：计价；约束：ISO币种/默认CNY
    price_amount bigint NOT NULL, -- 原价金额：最小货币单位；用途：计价；约束：>=0/非空
    discount_type varchar(16) DEFAULT 'none', -- 折扣类型：折扣规则；用途：促销；约束：none/percent/amount
    discount_value bigint DEFAULT 0, -- 折扣值：折扣额度；用途：促销；约束：>=0/默认0
    discount_start_at timestamp with time zone, -- 折扣开始：起始时间；用途：促销；约束：可空
    discount_end_at timestamp with time zone, -- 折扣结束：结束时间；用途：促销；约束：可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    UNIQUE (tenant_id, content_id) -- 约束：同租户同内容仅一条价格记录
);

-- ContentAccess
CREATE TABLE IF NOT EXISTS content_access(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：内容权益记录；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：权益持有者；用途：权限判断；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：权限判断；约束：非空
    order_id bigint DEFAULT 0, -- 订单ID：关联订单；用途：溯源；约束：0表示无
    status varchar(16) DEFAULT 'active', -- 权益状态：使用状态；用途：权限判断；约束：active/revoked
    revoked_at timestamp with time zone, -- 撤销时间：撤销时刻；用途：审计；约束：可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    UNIQUE (tenant_id, user_id, content_id) -- 约束：同用户同内容唯一权益
);

-- Orders
CREATE TABLE IF NOT EXISTS orders(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：订单唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：下单用户；用途：归属；约束：非空
    type varchar(32) DEFAULT 'content_purchase', -- 订单类型：业务类型；用途：业务分支；约束：content_purchase/recharge
    status varchar(32) DEFAULT 'created', -- 订单状态：支付状态；用途：流程控制；约束：created/paid/refunded/closed
    currency varchar(16) DEFAULT 'CNY', -- 币种：货币类型；用途：计价；约束：ISO币种/默认CNY
    amount_original bigint NOT NULL, -- 原价金额：订单原价；用途：结算；约束：>=0/非空
    amount_discount bigint NOT NULL, -- 优惠金额：优惠合计；用途：结算；约束：>=0/非空
    amount_paid bigint NOT NULL, -- 实付金额：实际支付；用途：结算；约束：>=0/非空
    snapshot jsonb DEFAULT '{}', -- 订单快照：下单快照；用途：审计/对账；约束：JSON对象/默认{}
    idempotency_key varchar(128) NOT NULL, -- 幂等键：请求幂等；用途：重复请求保护；约束：非空/长度<=128
    paid_at timestamp with time zone, -- 支付时间：支付成功时间；用途：对账；约束：可空
    refunded_at timestamp with time zone, -- 退款时间：退款时间；用途：对账；约束：可空
    refund_forced boolean DEFAULT FALSE, -- 强制退款：是否强制；用途：风控；约束：布尔/默认false
    refund_operator_user_id bigint DEFAULT 0, -- 退款操作人：操作者ID；用途：审计；约束：0表示无
    refund_reason varchar(255) DEFAULT '', -- 退款原因：原因说明；用途：审计；约束：长度<=255/可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    coupon_id bigint DEFAULT 0 -- 优惠券ID：使用的券；用途：优惠计算；约束：0表示未使用
);

-- OrderItems
CREATE TABLE IF NOT EXISTS order_items(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：订单项唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：下单用户；用途：归属；约束：非空
    order_id bigint NOT NULL, -- 订单ID：关联订单；用途：订单明细；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：明细关联；约束：非空
    content_user_id bigint NOT NULL, -- 内容作者ID：作者用户；用途：分账；约束：非空
    amount_paid bigint NOT NULL, -- 实付金额：行实付；用途：结算；约束：>=0/非空
    snapshot jsonb DEFAULT '{}', -- 内容快照：下单内容快照；用途：审计；约束：JSON对象/默认{}
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

-- TenantLedgers
CREATE TABLE IF NOT EXISTS tenant_ledgers(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：流水唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：租户主或操作者；用途：归属；约束：非空
    order_id bigint DEFAULT 0, -- 订单ID：关联订单；用途：溯源；约束：0表示无
    type varchar(32) NOT NULL, -- 流水类型：业务类型；用途：账务分类；约束：枚举值/非空
    amount bigint NOT NULL, -- 流水金额：变动金额；用途：账务；约束：非空
    balance_before bigint NOT NULL, -- 变更前余额：可用余额；用途：审计；约束：非空
    balance_after bigint NOT NULL, -- 变更后余额：可用余额；用途：审计；约束：非空
    frozen_before bigint NOT NULL, -- 变更前冻结：冻结余额；用途：审计；约束：非空
    frozen_after bigint NOT NULL, -- 变更后冻结：冻结余额；用途：审计；约束：非空
    idempotency_key varchar(128) NOT NULL, -- 幂等键：幂等保障；用途：防重复入账；约束：非空
    remark varchar(255) NOT NULL, -- 备注：流水说明；用途：审计；约束：非空
    operator_user_id bigint DEFAULT 0, -- 操作者ID：人工操作人；用途：审计；约束：0表示无
    biz_ref_type varchar(32) DEFAULT '', -- 业务引用类型：外部关联；用途：对账；约束：长度<=32
    biz_ref_id bigint DEFAULT 0, -- 业务引用ID：外部关联；用途：对账；约束：0表示无
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

-- TenantInvites
CREATE TABLE IF NOT EXISTS tenant_invites(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：邀请记录；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：创建人；用途：溯源；约束：非空
    code varchar(64) NOT NULL, -- 邀请码：邀请码；用途：邀请加入；约束：非空/长度<=64
    status varchar(32) DEFAULT 'active', -- 邀请状态：是否可用；用途：控制邀请；约束：active/disabled/expired
    max_uses int NOT NULL, -- 最大次数：可用次数；用途：限制；约束：>0/非空
    used_count int DEFAULT 0, -- 已使用：已用次数；用途：限制；约束：>=0/默认0
    expires_at timestamp with time zone, -- 过期时间：失效时间；用途：控制；约束：可空
    disabled_at timestamp with time zone, -- 禁用时间：禁用时刻；用途：审计；约束：可空
    disabled_operator_user_id bigint DEFAULT 0, -- 禁用操作人：操作者；用途：审计；约束：0表示无
    remark varchar(255) DEFAULT '', -- 备注：说明；用途：审计；约束：长度<=255/可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

-- TenantJoinRequests
CREATE TABLE IF NOT EXISTS tenant_join_requests(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：入驻申请；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：申请人；用途：溯源；约束：非空
    status varchar(32) DEFAULT 'pending', -- 申请状态：审核状态；用途：审核流程；约束：pending/approved/rejected
    reason varchar(255) NOT NULL, -- 申请原因：申请说明；用途：审核；约束：非空/长度<=255
    decided_at timestamp with time zone, -- 处理时间：审核时间；用途：审计；约束：可空
    decided_operator_user_id bigint DEFAULT 0, -- 处理人ID：操作者；用途：审计；约束：0表示无
    decided_reason varchar(255) DEFAULT '', -- 处理说明：审核意见；用途：审计；约束：长度<=255/可空
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

-- Comments
CREATE TABLE IF NOT EXISTS comments(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：评论唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：评论者；用途：归属；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：评论归属；约束：非空
    reply_to bigint DEFAULT 0, -- 回复评论ID：0为一级；用途：楼中楼；约束：0表示无
    content text NOT NULL, -- 评论内容：评论文本；用途：展示；约束：非空
    likes int DEFAULT 0, -- 点赞数：点赞计数；用途：排序；约束：>=0/默认0
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW(), -- 更新时间：记录更新；用途：审计；约束：默认now()
    deleted_at timestamp with time zone -- 删除时间：软删除；用途：逻辑删除；约束：可空
);

CREATE INDEX IF NOT EXISTS idx_comments_content_id ON comments(content_id);
CREATE INDEX IF NOT EXISTS idx_comments_user_id ON comments(user_id);

-- User Content Actions (Like, Favorite)
CREATE TABLE IF NOT EXISTS user_content_actions(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：内容互动；约束：PK/不可为空
    user_id bigint NOT NULL, -- 用户ID：操作用户；用途：归属；约束：非空
    content_id bigint NOT NULL, -- 内容ID：关联内容；用途：互动对象；约束：非空
    type varchar(32) NOT NULL, -- 类型：互动类型；用途：点赞/收藏；约束：like/favorite
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    UNIQUE (user_id, content_id, type) -- 约束：同一用户同类型仅一次
);

-- User Comment Actions (Like)
CREATE TABLE IF NOT EXISTS user_comment_actions(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：评论互动；约束：PK/不可为空
    user_id bigint NOT NULL, -- 用户ID：操作用户；用途：归属；约束：非空
    comment_id bigint NOT NULL, -- 评论ID：关联评论；用途：互动对象；约束：非空
    type varchar(32) NOT NULL, -- 类型：互动类型；用途：点赞；约束：like
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    UNIQUE (user_id, comment_id, type) -- 约束：同一用户同类型仅一次
);

-- Payout Accounts
CREATE TABLE IF NOT EXISTS payout_accounts(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：提现账户；约束：PK/不可为空
    tenant_id bigint NOT NULL, -- 租户ID：多租户隔离；用途：数据隔离；约束：非空
    user_id bigint NOT NULL, -- 用户ID：账户持有人；用途：归属；约束：非空
    type varchar(32) NOT NULL, -- 类型：账户类型；用途：打款方式；约束：bank/alipay
    name varchar(128) NOT NULL, -- 账户名称：开户行/支付宝名称；用途：打款；约束：非空/长度<=128
    account varchar(128) NOT NULL, -- 账号：银行卡/支付宝账号；用途：打款；约束：非空/长度<=128
    realname varchar(128) NOT NULL, -- 真实姓名：收款人；用途：打款；约束：非空/长度<=128
    created_at timestamp with time zone DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamp with time zone DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

CREATE INDEX IF NOT EXISTS idx_payout_accounts_tenant_id ON payout_accounts(tenant_id);

-- Notifications
CREATE TABLE IF NOT EXISTS notifications(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：通知唯一标识；约束：PK/不可为空
    user_id bigint NOT NULL, -- 用户ID：接收者；用途：归属；约束：非空
    tenant_id bigint DEFAULT 0, -- 租户ID：来源租户；用途：来源标识；约束：0表示无
    type varchar(32) NOT NULL, -- 类型：通知类型；用途：分类展示；约束：system/order/audit/interaction
    title varchar(255) NOT NULL, -- 标题：通知标题；用途：展示；约束：非空/长度<=255
    content text NOT NULL, -- 内容：通知内容；用途：展示；约束：非空
    is_read boolean DEFAULT FALSE, -- 已读：是否已读；用途：状态管理；约束：布尔/默认false
    created_at timestamp with time zone DEFAULT NOW() -- 创建时间：记录创建；用途：审计；约束：默认now()
);

CREATE INDEX IF NOT EXISTS idx_notifications_user_id ON notifications(user_id);

-- Coupons
CREATE TABLE IF NOT EXISTS coupons(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：优惠券唯一标识；约束：PK/不可为空
    tenant_id bigint NOT NULL DEFAULT 0, -- 租户ID：适用租户；用途：范围控制；约束：0表示全局
    title varchar(255) NOT NULL, -- 标题：优惠券标题；用途：展示；约束：非空/长度<=255
    description text, -- 描述：优惠券说明；用途：展示；约束：可空
    type varchar(32) NOT NULL, -- 类型：优惠类型；用途：优惠计算；约束：fix_amount/discount
    value bigint NOT NULL, -- 面值：优惠金额/折扣；用途：优惠计算；约束：>0
    min_order_amount bigint NOT NULL DEFAULT 0, -- 最低金额：使用门槛；用途：限制；约束：>=0/默认0
    max_discount bigint, -- 最高折扣：上限金额；用途：限制；约束：可空
    total_quantity integer NOT NULL DEFAULT 0, -- 总量：发行数量；用途：发放控制；约束：>=0/默认0
    used_quantity integer NOT NULL DEFAULT 0, -- 已用：已使用数量；用途：核销统计；约束：>=0/默认0
    start_at timestamptz, -- 开始时间：生效时间；用途：有效期控制；约束：可空
    end_at timestamptz, -- 结束时间：失效时间；用途：有效期控制；约束：可空
    created_at timestamptz NOT NULL DEFAULT NOW(), -- 创建时间：记录创建；用途：审计；约束：默认now()
    updated_at timestamptz NOT NULL DEFAULT NOW() -- 更新时间：记录更新；用途：审计；约束：默认now()
);

CREATE INDEX IF NOT EXISTS idx_coupons_tenant_id ON coupons(tenant_id);

-- UserCoupons
CREATE TABLE IF NOT EXISTS user_coupons(
    id bigserial PRIMARY KEY, -- 主键ID：自增；用途：用户券唯一标识；约束：PK/不可为空
    user_id bigint NOT NULL, -- 用户ID：领券用户；用途：归属；约束：非空
    coupon_id bigint NOT NULL, -- 优惠券ID：关联优惠券；用途：关联；约束：非空
    order_id bigint, -- 订单ID：使用订单；用途：核销溯源；约束：可空
    status varchar(32) NOT NULL DEFAULT 'unused', -- 状态：使用状态；用途：核销；约束：unused/used/expired
    used_at timestamptz, -- 使用时间：核销时间；用途：审计；约束：可空
    created_at timestamptz NOT NULL DEFAULT NOW() -- 创建时间：记录创建；用途：审计；约束：默认now()
);

CREATE INDEX IF NOT EXISTS idx_user_coupons_user_id ON user_coupons(user_id);
CREATE INDEX IF NOT EXISTS idx_user_coupons_coupon_id ON user_coupons(coupon_id);
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS user_coupons;
DROP TABLE IF EXISTS coupons;
DROP TABLE IF EXISTS notifications;
DROP TABLE IF EXISTS payout_accounts;
DROP TABLE IF EXISTS user_comment_actions;
DROP TABLE IF EXISTS user_content_actions;
DROP TABLE IF EXISTS comments;
DROP TABLE IF EXISTS tenant_join_requests;
DROP TABLE IF EXISTS tenant_invites;
DROP TABLE IF EXISTS tenant_ledgers;
DROP TABLE IF EXISTS order_items;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS content_access;
DROP TABLE IF EXISTS content_prices;
DROP TABLE IF EXISTS content_assets;
DROP TABLE IF EXISTS media_assets;
DROP TABLE IF EXISTS contents;
DROP TABLE IF EXISTS tenant_users;
DROP TABLE IF EXISTS tenants;
DROP TABLE IF EXISTS users;
-- +goose StatementEnd
