-- V21: 2차 웨이브 확장 — 체크인·리드 확장(M10) + CMS 버전 이력·미디어(M17)
-- V17/V19 는 이미 dev 서버에 적용(Flyway 체크섬 고정) → 확장분을 본 마이그레이션으로 분리. 전부 멱등.


-- ── 체크인·배지 QR 확장(멱등 ALTER) ─────────────────────────────────────────
-- QR 토큰: 배지 코드와 분리된 불투명 검증 토큰(현장 체크인 스캔 대상). checkin_at: 체크인 시각(중복 방지·집계 근거).
ALTER TABLE visitor_registration ADD COLUMN IF NOT EXISTS qr_token   varchar(64);
ALTER TABLE visitor_registration ADD COLUMN IF NOT EXISTS checkin_at timestamptz;
-- 기존/시드 행 백필(결정론적 · 데모): 토큰은 id 해시, 완료건은 등록 2시간 후로 가정.
UPDATE visitor_registration SET qr_token = 'QR-' || upper(substr(md5(id), 1, 20)) WHERE qr_token IS NULL;
UPDATE visitor_registration SET checkin_at = registered_at + interval '2 hours'
 WHERE checkin_state = 'done' AND checkin_at IS NULL;
CREATE UNIQUE INDEX IF NOT EXISTS uq_visitor_reg_qr ON visitor_registration (qr_token) WHERE qr_token IS NOT NULL;

-- ── 리드 소유·동의·메모 확장(멱등 ALTER) ────────────────────────────────────
-- exhibitor_id: 소유 참가업체(수집 주체) · agree_privacy: 개인정보 수집 동의 · note: 상담 메모.
ALTER TABLE lead ADD COLUMN IF NOT EXISTS exhibitor_id  varchar(40);
ALTER TABLE lead ADD COLUMN IF NOT EXISTS agree_privacy boolean NOT NULL DEFAULT true;
ALTER TABLE lead ADD COLUMN IF NOT EXISTS note          text;
CREATE INDEX IF NOT EXISTS idx_lead_exhibitor ON lead (event_id, exhibitor_id);


-- ── 콘텐츠 버전 이력(SCR-35 우측 버전 이력·롤백) ────────────────────────────────
--   콘텐츠 본문/제목 저장·상태 게시·롤백 시점마다 스냅샷 1행. version_no 는 콘텐츠별 단조 증가.
CREATE TABLE IF NOT EXISTS cms_content_version (
    id          varchar(40)  PRIMARY KEY,
    content_id  varchar(40)  NOT NULL REFERENCES cms_content(id) ON DELETE CASCADE,
    version_no  int          NOT NULL,
    title       varchar(300),
    body        text,
    status      varchar(20),
    author_name varchar(120),
    note        varchar(200),                                  -- 스냅샷 사유(created|edited|published|rollback...)
    created_at  timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (content_id, version_no)
);
CREATE INDEX IF NOT EXISTS idx_cms_version_content ON cms_content_version(content_id, version_no DESC);

-- ── 미디어 라이브러리(SCR-35 중앙 미디어 스트립) ──────────────────────────────
--   기존 업로드 패턴(login-slides) 재사용 — 파일은 {kintex.upload.dir}/cms/ 아래 UUID 저장, /uploads/cms/** 서빙.
CREATE TABLE IF NOT EXISTS cms_media (
    id            varchar(40)  PRIMARY KEY,
    event_id      varchar(40),
    file_name     varchar(300) NOT NULL,                       -- 표시용 원본 파일명(신뢰 안 함·표시 전용)
    url           varchar(500) NOT NULL,                       -- /uploads/cms/{uuid.ext}
    content_type  varchar(80),
    size_bytes    bigint,
    alt_text      varchar(300),                                -- 대체 텍스트(접근성·AI 태깅 예정)
    uploader_name varchar(120),
    created_at    timestamptz  NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_cms_media_created ON cms_media(created_at DESC);

-- 버전 시드(멱등): 게시 워크플로 데모용 — cms-about 3버전, cms-home 1버전.
INSERT INTO cms_content_version (id, content_id, version_no, title, body, status, author_name, note)
VALUES
    ('cv-about-1', 'cms-about', 1, '행사 소개(초안)', '스마트 팩토리 엑스포 초안 본문.',                 'draft',    '관리자', 'created'),
    ('cv-about-2', 'cms-about', 2, '행사 소개',       'KINTEX 스마트 팩토리 엑스포 소개(보강).',           'review',   '관리자', 'edited'),
    ('cv-about-3', 'cms-about', 3, '행사 소개',       'KINTEX 스마트 팩토리 엑스포 소개',                 'review',   '관리자', 'edited'),
    ('cv-home-1',  'cms-home',  1, '페이지',          '전시 공식 홈 페이지 본문',                          'published','관리자', 'published')
ON CONFLICT (content_id, version_no) DO NOTHING;
