-- 001__deals.sql
-- Таблицы для PostgreSQL-реализации Repository в M2 (когда pgx будет
-- доступен через прокси). В M1 m2m-core работает с MemoryRepository.

CREATE SCHEMA IF NOT EXISTS m2m_core;
COMMENT ON SCHEMA m2m_core IS 'Состояние сделок M2M, события и аудит.';

CREATE TABLE IF NOT EXISTS m2m_core.deals (
    id              uuid PRIMARY KEY,
    guid            uuid NOT NULL UNIQUE,
    state           varchar(32) NOT NULL,
    investor_id     uuid,
    signed_claim    bytea,
    request_xml     bytea,
    response_xml    bytea,
    decision_xml    bytea,
    created_at      timestamptz NOT NULL DEFAULT now(),
    updated_at      timestamptz NOT NULL DEFAULT now()
);
COMMENT ON TABLE m2m_core.deals IS 'Корневая запись о M2M-сделке. Уникальность по guid обеспечивает идемпотентность.';
COMMENT ON COLUMN m2m_core.deals.guid IS 'GUID, который ушёл в M2MTransferRequest.Header.GUID.';
COMMENT ON COLUMN m2m_core.deals.state IS 'Текущее состояние FSM: draft/validated/submitted_to_nsd/awaiting_decision/confirmed/awaiting_sub16/done/rejected/timed_out/manual_approval.';

CREATE INDEX IF NOT EXISTS idx_deals_state ON m2m_core.deals(state);
CREATE INDEX IF NOT EXISTS idx_deals_investor ON m2m_core.deals(investor_id) WHERE investor_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_deals_created ON m2m_core.deals(created_at DESC);

CREATE TABLE IF NOT EXISTS m2m_core.deal_events (
    id          bigserial PRIMARY KEY,
    deal_id     uuid NOT NULL REFERENCES m2m_core.deals(id) ON DELETE CASCADE,
    type        varchar(64) NOT NULL,
    payload     jsonb,
    actor       text,
    created_at  timestamptz NOT NULL DEFAULT now()
);
COMMENT ON TABLE m2m_core.deal_events IS 'Журнал событий сделки (event-sourcing для аудита).';
COMMENT ON COLUMN m2m_core.deal_events.actor IS 'Кто инициировал событие: system, nsd, operator-<login>, lk-callback и т.д.';

CREATE INDEX IF NOT EXISTS idx_deal_events_deal ON m2m_core.deal_events(deal_id, created_at);
CREATE INDEX IF NOT EXISTS idx_deal_events_type ON m2m_core.deal_events(type);
