-- ============================================================================
-- V96 — F-B4 세션 정원 기반 사전등록(RSVP) + F-C5 대기열·취소표
-- 담당: kintex-visitor(VIS)·backend · 작성: 2026-07-23
-- ----------------------------------------------------------------------------
-- 목적: 컨퍼런스 세션에 정원·마감·대기 상태를 부여한다.
--   ① 정원 여유 → CONFIRMED, ② 정원 소진 → WAITLIST(대기), ③ 취소 발생 → 대기 1명 자동 승격 + 알림.
-- 원칙: tenant_id='KINTEX' 고정. FK 최소화. 전부 멱등.
--   동시성: 확정 수 증가는 조건부 UPDATE(seat_taken < capacity)로 오버부킹을 원자 차단.
-- ============================================================================

-- ── 1) 세션 마스터 ───────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS event_session (
    tenant_id   varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id          varchar(64)  NOT NULL,
    event_id    varchar(64)  NOT NULL,
    title       varchar(200) NOT NULL,
    speaker     varchar(160),
    room        varchar(80),
    track       varchar(80),
    starts_at   timestamptz,
    ends_at     timestamptz,
    capacity    integer      NOT NULL DEFAULT 0,   -- 0=정원 무제한
    seat_taken  integer      NOT NULL DEFAULT 0,   -- 확정 좌석 수(RSVP CONFIRMED)
    status      varchar(16)  NOT NULL DEFAULT 'open',  -- open/closed
    sort_order  integer      NOT NULL DEFAULT 0,
    created_at  timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_event_session PRIMARY KEY (tenant_id, id),
    CONSTRAINT ck_event_session_seat CHECK (seat_taken >= 0)
);
CREATE INDEX IF NOT EXISTS ix_event_session_event ON event_session (tenant_id, event_id, sort_order);

-- ── 2) RSVP(관람객 세션 신청) ───────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS session_rsvp (
    tenant_id     varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id            varchar(64)  NOT NULL,
    session_id    varchar(64)  NOT NULL,
    event_id      varchar(64)  NOT NULL,
    user_id       varchar(64)  NOT NULL,
    status        varchar(16)  NOT NULL DEFAULT 'CONFIRMED',  -- CONFIRMED/WAITLIST/CANCELLED
    waitlist_pos  integer,                                     -- WAITLIST 순번(대기 진입 시점 seq)
    created_at    timestamptz  NOT NULL DEFAULT now(),
    updated_at    timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_session_rsvp PRIMARY KEY (tenant_id, id),
    CONSTRAINT uq_session_rsvp_user UNIQUE (session_id, user_id)
);
CREATE INDEX IF NOT EXISTS ix_session_rsvp_user ON session_rsvp (tenant_id, user_id, status);
CREATE INDEX IF NOT EXISTS ix_session_rsvp_wait ON session_rsvp (tenant_id, session_id, status, waitlist_pos);

-- ============================================================================
-- 시드 — e-2026-live 세션 5종. sess-keynote 는 정원=확정(소진)으로 대기열 데모 유도.
-- ============================================================================
INSERT INTO event_session
    (tenant_id, id, event_id, title, speaker, room, track, starts_at, ends_at, capacity, seat_taken, status, sort_order) VALUES
  ('KINTEX','sess-keynote','e-2026-live','기조연설 — 전시산업의 AI 전환','김전시 (킨텍스 원장)','컨퍼런스룸 A','Keynote',
     now()+interval '2 day', now()+interval '2 day' + interval '1 hour', 120, 120, 'open', 0),
  ('KINTEX','sess-ai','e-2026-live','부스 자동설계 실무 세션','이설계 (수석)','세미나실 1','Tech',
     now()+interval '2 day' + interval '2 hour', now()+interval '2 day' + interval '3 hour', 60, 42, 'open', 1),
  ('KINTEX','sess-buyer','e-2026-live','바이어 매칭 라운드테이블','박매칭 (매니저)','미팅룸 3','Business',
     now()+interval '2 day' + interval '4 hour', now()+interval '2 day' + interval '5 hour', 30, 24, 'open', 2),
  ('KINTEX','sess-safe','e-2026-live','현장 안전·시공 규정 브리핑','최안전 (홀매니저)','세미나실 2','Ops',
     now()+interval '3 day', now()+interval '3 day' + interval '1 hour', 80, 15, 'open', 3),
  ('KINTEX','sess-net','e-2026-live','참가업체 네트워킹 나이트','운영팀','로비 라운지','Networking',
     now()+interval '3 day' + interval '6 hour', now()+interval '3 day' + interval '8 hour', 0, 0, 'open', 4)
ON CONFLICT (tenant_id, id) DO NOTHING;

-- 대기열 데모: 기조연설(정원 소진)에 데모 대기자 2명 시드(멱등).
INSERT INTO session_rsvp (tenant_id, id, session_id, event_id, user_id, status, waitlist_pos) VALUES
  ('KINTEX','rsvp-wait-1','sess-keynote','e-2026-live','demo-visitor-01','WAITLIST', 1),
  ('KINTEX','rsvp-wait-2','sess-keynote','e-2026-live','demo-visitor-02','WAITLIST', 2)
ON CONFLICT (session_id, user_id) DO NOTHING;

-- 데모 계정(admin) 확정 RSVP 1건(마이 화면 폐루프) — app_user 존재 시에만.
INSERT INTO session_rsvp (tenant_id, id, session_id, event_id, user_id, status)
SELECT 'KINTEX','rsvp-admin-safe','sess-safe','e-2026-live','admin-d80a2603','CONFIRMED'
WHERE EXISTS (SELECT 1 FROM app_user u WHERE u.id = 'admin-d80a2603')
  AND NOT EXISTS (SELECT 1 FROM session_rsvp r WHERE r.session_id='sess-safe' AND r.user_id='admin-d80a2603');
