-- V53: 마케팅(EDM) 수신동의·수신거부 + 발송 이력 집계 (GAP G-04 실발송).
-- 멱등(IF NOT EXISTS / 조건부 UPDATE). 기존 마이그레이션(V1~V51) 불변 · 순증(additive)만.
-- 보안 불변(§0-3): 원문 이메일은 응답/로그 미노출. unsub_token 은 무작위 불투명 토큰(PII 미포함).
-- ★ V52 는 타 에이전트 예약 — 본 파일은 V53 만 사용한다.

-- ── 1) 관람객 사전등록: 수신거부 상태 + 불투명 수신거부 토큰 ──────────────────
-- marketing_unsubscribed: 수신거부(true 시 발송 대상에서 영구 제외 — agree_marketing 과 별개 축).
ALTER TABLE visitor_registration
    ADD COLUMN IF NOT EXISTS marketing_unsubscribed boolean NOT NULL DEFAULT false;

-- unsub_token: EDM 하단 수신거부 링크의 불투명 토큰(이메일·PII 미포함, 재현 불가 난수).
ALTER TABLE visitor_registration
    ADD COLUMN IF NOT EXISTS unsub_token varchar(64);

-- 신규 등록은 DB DEFAULT 로 토큰 자동 부여(애플리케이션 INSERT 수정 불필요, 확장 무의존).
ALTER TABLE visitor_registration
    ALTER COLUMN unsub_token SET DEFAULT md5(random()::text || clock_timestamp()::text || random()::text);

-- 기존 행 백필(멱등 — NULL 만 채움).
UPDATE visitor_registration
    SET unsub_token = md5(random()::text || clock_timestamp()::text || id)
    WHERE unsub_token IS NULL;

-- 토큰 조회(수신거부 처리)용 유니크 인덱스.
CREATE UNIQUE INDEX IF NOT EXISTS uq_visitor_reg_unsub_token
    ON visitor_registration (unsub_token) WHERE unsub_token IS NOT NULL;

-- 발송 대상 조회 가속(동의·미거부·이메일 보유).
CREATE INDEX IF NOT EXISTS idx_visitor_reg_marketing_target
    ON visitor_registration (event_id)
    WHERE agree_marketing = true AND marketing_unsubscribed = false AND email IS NOT NULL;

-- ── 2) 캠페인 발송 결과 집계 컬럼 ────────────────────────────────────────────
-- audience(=성공 발송건)와 별도로 스킵/실패/테스트여부를 표시용으로 보존.
ALTER TABLE edm_campaign ADD COLUMN IF NOT EXISTS sent_ok        integer NOT NULL DEFAULT 0;
ALTER TABLE edm_campaign ADD COLUMN IF NOT EXISTS sent_skipped   integer NOT NULL DEFAULT 0;
ALTER TABLE edm_campaign ADD COLUMN IF NOT EXISTS sent_failed    integer NOT NULL DEFAULT 0;
ALTER TABLE edm_campaign ADD COLUMN IF NOT EXISTS last_test_mode boolean;
ALTER TABLE edm_campaign ADD COLUMN IF NOT EXISTS last_sent_at   timestamptz;
