-- ============================================================================
-- V86 — 관심 행사 구독(오픈 예정 행사) + 티켓 오픈 알림 (F-C1, 공개 사이트)
-- ============================================================================
-- 공개(비로그인) 관람객이 "오픈 예정" 행사를 이메일로 구독 → 티켓 판매가 개시되면(오픈 감지 스케줄러)
-- 이메일 알림을 1회 발송한다. 발송 채널은 자체 Postfix SMTP(기승인, 옥션통지·EDM·비번재설정 재사용).
-- 표준: tenant_id='KINTEX'(대문자, 복합 PK 선두). FK 최소화(컬럼만). 멱등(IF NOT EXISTS / ON CONFLICT).
-- PII 최소화(§0-3): email 원문은 발송 경로 한정 — 로그·API 응답에는 email_masked / 건수만 노출.
--   불투명 unsub_token 으로 원클릭 수신거부(PII 미포함).
-- ============================================================================

CREATE TABLE IF NOT EXISTS event_subscription (
    tenant_id    varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id           varchar(64)  NOT NULL,
    event_id     varchar(64)  NOT NULL,
    email        varchar(200) NOT NULL,          -- 발송 경로 한정 원문(로그/응답 미노출)
    email_masked varchar(200),                   -- wat***@example.com (노출 안전)
    unsub_token  varchar(64)  NOT NULL,          -- 불투명 원클릭 수신거부 토큰
    status       varchar(16)  NOT NULL DEFAULT 'active',   -- active / unsubscribed
    notified_at  timestamptz,                    -- 티켓 오픈 알림 발송 시각(중복 발송 방지)
    created_at   timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_event_subscription PRIMARY KEY (tenant_id, id)
);

-- 행사 단위 이메일 유니크(중복 구독 방지) — 대소문자 무시.
CREATE UNIQUE INDEX IF NOT EXISTS uq_event_subscription_email
    ON event_subscription (tenant_id, event_id, lower(email));

-- 오픈 감지 스케줄러 대상(활성·미통지)만 인덱싱 → 작고 선택도 높음.
CREATE INDEX IF NOT EXISTS ix_event_subscription_pending
    ON event_subscription (tenant_id, event_id)
    WHERE status = 'active' AND notified_at IS NULL;

-- 원클릭 수신거부 토큰 조회.
CREATE INDEX IF NOT EXISTS ix_event_subscription_token
    ON event_subscription (unsub_token);

-- ── 데모 시드(소량) — "오픈 예정" 구독 폐루프 시연 ────────────────────────────
-- 오픈예정 데모 행사(티켓 판매 개시 D+20) — 구독 '대기' 상태가 화면에 보이도록(아직 오픈 전).
INSERT INTO event (id, name, start_date, end_date, status)
VALUES ('e-2026-upcoming', '2026 미래모빌리티 위크(오픈예정)',
        current_date + 60, current_date + 63, 'active')
ON CONFLICT (id) DO NOTHING;

INSERT INTO ticket_product
    (tenant_id, id, event_id, code, kind, name, description, price, sale_start, sale_end,
     total_qty, sold_qty, max_per_order, status, sort_order)
VALUES
  ('KINTEX', 'tp-upcoming-gen', 'e-2026-upcoming', 'UPC-GEN', 'GENERAL', '일반권',
     '티켓 판매 개시 예정 · 구독 시 오픈 알림', 12000,
     now() + interval '20 day', now() + interval '55 day', 3000, 0, 10, 'active', 0)
ON CONFLICT (tenant_id, id) DO NOTHING;

-- 데모 구독 2건: ① 오픈예정 행사(대기·notified_at NULL) ② e-2026-live(이미 오픈 → 통지완료 상태 시드)
INSERT INTO event_subscription
    (tenant_id, id, event_id, email, email_masked, unsub_token, status, notified_at)
VALUES
  ('KINTEX', 'es-demo-1', 'e-2026-upcoming', 'watcher1@example.com',
     'wat***@example.com', 'estok-demo-00000001', 'active', NULL),
  ('KINTEX', 'es-demo-2', 'e-2026-live', 'watcher2@example.com',
     'wat***@example.com', 'estok-demo-00000002', 'active', now() - interval '1 day')
ON CONFLICT (tenant_id, id) DO NOTHING;
