-- B1 순번기 무손실(durable-before-publish). 순번=DB SEQUENCE(원자적·durable), 발행 전 outbox에
-- 커밋 → 크래시/리더승계 시 미발행분 재발행(at-least-once). 소비측은 seq 멱등이라 중복 무해.

-- 전역 순번 시퀀스. 기존 원장 최대값 다음부터 이어서 발번(재기동·기존DB 호환).
CREATE SEQUENCE IF NOT EXISTS global_seq_seq AS BIGINT START 1;
SELECT setval(
    'global_seq_seq',
    GREATEST(
        (SELECT COALESCE(MAX(global_seq), 0) FROM journal_log),
        (SELECT COALESCE(MAX(global_seq), 0) FROM transfer),
        1
    ),
    true   -- is_called=true → 다음 nextval은 max+1
);

-- 저널 아웃박스. payload = rtgs.journal로 발행되는 JournalEntry JSON 원문(재발행 시 그대로 송신).
CREATE TABLE IF NOT EXISTS journal_outbox (
    global_seq  BIGINT      PRIMARY KEY,
    bmi         VARCHAR(22),
    payload     TEXT        NOT NULL,
    published   BOOLEAN     NOT NULL DEFAULT FALSE,
    created_at  BIGINT
);
-- 미발행분 재발행 스캔용(부분 인덱스).
CREATE INDEX IF NOT EXISTS idx_outbox_unpublished ON journal_outbox (global_seq) WHERE NOT published;

COMMENT ON TABLE  journal_outbox            IS '순번기 저널 아웃박스(무손실 발행)';
COMMENT ON COLUMN journal_outbox.global_seq IS '전역순번';
COMMENT ON COLUMN journal_outbox.payload    IS '발행 저널원문(JournalEntry JSON)';
COMMENT ON COLUMN journal_outbox.published  IS '발행완료여부';
