CREATE TABLE disputes
(
    id                  BIGINT PRIMARY KEY,
    order_id            BIGINT       NOT NULL UNIQUE,
    initiator_id        BIGINT       NOT NULL,
    initiator_name      VARCHAR(100) NOT NULL,
    respondent_id       BIGINT       NOT NULL,
    reason              TEXT         NOT NULL,
    evidence            TEXT[] DEFAULT ARRAY[]::TEXT[],
    status              VARCHAR(20)  NOT NULL DEFAULT 'open',
    result              VARCHAR(30),
    respondent_reason   TEXT,
    respondent_evidence TEXT[] DEFAULT ARRAY[]::TEXT[],
    appeal_reason       TEXT,
    appealed_at         TIMESTAMPTZ,
    resolved_by         BIGINT,
    resolved_at         TIMESTAMPTZ,
    search_text         TEXT GENERATED ALWAYS AS (initiator_name || ' ' || reason || ' ' ||
                                                  coalesce(respondent_reason, '') || ' ' ||
                                                  coalesce(appeal_reason, '')) STORED,
    created_at          TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at          TIMESTAMPTZ  NOT NULL DEFAULT NOW(),

    CONSTRAINT chk_dispute_status CHECK (status IN ('open', 'reviewing', 'resolved', 'appealed')),
    CONSTRAINT chk_dispute_result CHECK (result IS NULL OR result IN ('full_refund', 'full_payment', 'partial_refund'))
);

-- 基础索引
CREATE INDEX idx_disputes_order ON disputes (order_id);
CREATE INDEX idx_disputes_status ON disputes (status, created_at DESC);
CREATE INDEX idx_disputes_initiator ON disputes (initiator_id);

-- 三元组索引用于争议内容搜索
CREATE INDEX idx_disputes_search_trgm ON disputes USING gin(search_text gin_trgm_ops);

-- 复合索引优化状态查询
CREATE INDEX idx_disputes_status_created ON disputes (status, created_at DESC);

-- 参与者索引
CREATE INDEX idx_disputes_initiator_status ON disputes (initiator_id, status, created_at DESC);
CREATE INDEX idx_disputes_respondent_status ON disputes (respondent_id, status, created_at DESC);

-- 数组索引优化证据查询
CREATE INDEX idx_disputes_evidence ON disputes USING gin(evidence);
CREATE INDEX idx_disputes_respondent_evidence ON disputes USING gin(respondent_evidence);

CREATE TRIGGER trigger_disputes_updated_at
    BEFORE UPDATE
    ON disputes
    FOR EACH ROW
    EXECUTE FUNCTION update_updated_at_column();