-- +goose Up
-- +goose StatementBegin
ALTER TABLE tenant_ledgers
    ADD COLUMN IF NOT EXISTS operator_user_id bigint,
    ADD COLUMN IF NOT EXISTS biz_ref_type varchar(32),
    ADD COLUMN IF NOT EXISTS biz_ref_id bigint;

-- tenant_ledgers.operator_user_id：操作者（谁触发该流水）
-- 用途：用于审计与风控追溯（例如后台代退款/调账等）。
COMMENT ON COLUMN tenant_ledgers.operator_user_id IS '操作者用户ID：谁触发该流水（admin/buyer/system）；用于审计与追责；可为空（历史数据或无法识别时）';

-- tenant_ledgers.biz_ref_type/biz_ref_id：业务引用（幂等与追溯）
-- 用途：在 idempotency_key 之外提供结构化引用（例如 order/refund 等），便于报表与按业务对象追溯。
COMMENT ON COLUMN tenant_ledgers.biz_ref_type IS '业务引用类型：order/refund/etc；与 biz_ref_id 组成可选的结构化幂等/追溯键';
COMMENT ON COLUMN tenant_ledgers.biz_ref_id IS '业务引用ID：与 biz_ref_type 配合使用（例如 orders.id）；用于对账与审计';

-- 索引：按操作者检索敏感操作流水（后台审计用）。
CREATE INDEX IF NOT EXISTS ix_tenant_ledgers_tenant_operator ON tenant_ledgers(tenant_id, operator_user_id);

-- 索引：按业务引用快速定位同一业务对象的流水集合。
CREATE INDEX IF NOT EXISTS ix_tenant_ledgers_tenant_biz_ref ON tenant_ledgers(tenant_id, biz_ref_type, biz_ref_id);

-- 结构化幂等（可选）：同一业务引用在同一流水类型下只能出现一条。
-- 说明：biz_ref_* 允许为空；仅当两者都非空时才参与唯一性约束。
CREATE UNIQUE INDEX IF NOT EXISTS ux_tenant_ledgers_tenant_biz_ref_type_id_type
    ON tenant_ledgers(tenant_id, biz_ref_type, biz_ref_id, type)
    WHERE biz_ref_type IS NOT NULL AND biz_ref_id IS NOT NULL;
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP INDEX IF EXISTS ux_tenant_ledgers_tenant_biz_ref_type_id_type;
DROP INDEX IF EXISTS ix_tenant_ledgers_tenant_biz_ref;
DROP INDEX IF EXISTS ix_tenant_ledgers_tenant_operator;

ALTER TABLE tenant_ledgers
    DROP COLUMN IF EXISTS biz_ref_id,
    DROP COLUMN IF EXISTS biz_ref_type,
    DROP COLUMN IF EXISTS operator_user_id;
-- +goose StatementEnd
