-- V19: M17 CMS — 콘텐츠·게시 워크플로 · 다국어 번역 · 참가업체 마이크로사이트 (멱등 · V1~V13 불변)
-- 근거: _workspace/port_cms.md(화면 계약) + 할 일(엔드포인트 계약).
--   cms_content     : 헤드리스 콘텐츠(페이지/포스트/블록) + 게시 상태(draft→review→approved→published) + 예약게시.
--   cms_translation : 콘텐츠×언어(ko/en/zh/ja) 번역본 + 번역 상태(none/ai/reviewed).
--   microsite       : 참가업체별 공개 소개 페이지(섹션 JSONB·테마·SEO) — 관람객 공개 조회(/api/public/microsites).
-- 신규 테이블만 추가(기존 스키마 무영향). 모든 DDL/시드 멱등.

-- ── 콘텐츠 ───────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS cms_content (
    id           varchar(40)  PRIMARY KEY,
    event_id     varchar(40),                                 -- 행사 스코프(선택)
    content_type varchar(20)  NOT NULL DEFAULT 'PAGE',         -- PAGE|POST|NOTICE|BLOCK
    title        varchar(300) NOT NULL,
    body         text,                                         -- 블록/본문(JSON 또는 텍스트)
    status       varchar(20)  NOT NULL DEFAULT 'draft',        -- draft|review|approved|published
    lang         varchar(5)   NOT NULL DEFAULT 'ko',           -- 원천(소스) 언어
    scheduled_at timestamptz,                                  -- 예약 게시 시각(NULL=즉시/미예약)
    signage      boolean      NOT NULL DEFAULT false,          -- 현장 사이니지 동시 배포
    mailing      boolean      NOT NULL DEFAULT false,          -- 메일링 통보
    author_id    varchar(40),
    author_name  varchar(120),
    published_at timestamptz,
    created_at   timestamptz  NOT NULL DEFAULT now(),
    updated_at   timestamptz  NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_cms_content_event  ON cms_content(event_id, updated_at DESC);
CREATE INDEX IF NOT EXISTS idx_cms_content_status ON cms_content(status);

-- ── 번역(콘텐츠×언어) ────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS cms_translation (
    id           varchar(40)  PRIMARY KEY,
    content_id   varchar(40)  NOT NULL REFERENCES cms_content(id) ON DELETE CASCADE,
    lang         varchar(5)   NOT NULL,                        -- ko|en|zh|ja
    title        varchar(300),
    body         text,
    trans_status varchar(10)  NOT NULL DEFAULT 'none',         -- none(미번역)|ai(AI 초벌)|reviewed(검수완료)
    updated_at   timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (content_id, lang)
);
CREATE INDEX IF NOT EXISTS idx_cms_translation_content ON cms_translation(content_id);

-- ── 마이크로사이트(참가업체별) ───────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS microsite (
    exhibitor_id   varchar(40)  PRIMARY KEY,                   -- 참가업체 식별자(company/booth 스코프)
    event_id       varchar(40),
    slug           varchar(80)  UNIQUE,                        -- 공개 URL 서브도메인 슬러그
    exhibitor_name varchar(200),
    theme          varchar(20)  NOT NULL DEFAULT 'blue',
    sections       jsonb        NOT NULL DEFAULT '[]'::jsonb,  -- [{id,type,visible,order,payload}]
    seo_title      varchar(300),
    seo_meta       text,
    langs          varchar(40)  NOT NULL DEFAULT 'ko',         -- 지원 언어 CSV
    status         varchar(20)  NOT NULL DEFAULT 'draft',      -- draft|published
    published_at   timestamptz,
    created_at     timestamptz  NOT NULL DEFAULT now(),
    updated_at     timestamptz  NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_microsite_event ON microsite(event_id);

-- ── 시드(멱등: ON CONFLICT DO NOTHING) ───────────────────────────────────────
INSERT INTO cms_content (id, event_id, content_type, title, body, status, lang, scheduled_at, signage, mailing, author_name)
VALUES
    ('cms-home',   NULL, 'PAGE',   '페이지',      '전시 공식 홈 페이지 본문',       'published', 'ko', NULL, true,  false, '관리자'),
    ('cms-notice', NULL, 'NOTICE', '공지사항',    '반입·반출 안내 공지',            'draft',     'ko', NULL, false, false, '관리자'),
    ('cms-about',  NULL, 'PAGE',   '행사 소개',   'KINTEX 스마트 팩토리 엑스포 소개', 'review',    'ko', '2026-08-01 09:00+09', false, false, '관리자'),
    ('cms-speaker',NULL, 'POST',   '연사 정보',   '주요 연사 및 세션 안내',          'published', 'ko', NULL, false, true,  '시스템'),
    ('cms-faq',    NULL, 'PAGE',   'FAQ',        '자주 묻는 질문',                 'published', 'ko', NULL, false, false, '관리자')
ON CONFLICT (id) DO NOTHING;

INSERT INTO cms_translation (id, content_id, lang, title, body, trans_status)
VALUES
    ('tr-about-ko', 'cms-about', 'ko', '행사 소개',                   'KINTEX 스마트 팩토리 엑스포 소개',                 'reviewed'),
    ('tr-about-en', 'cms-about', 'en', 'Exhibition Overview',         'Overview of KINTEX Smart Factory Expo.',          'ai'),
    ('tr-about-zh', 'cms-about', 'zh', '展会介绍',                    '',                                                'none'),
    ('tr-about-ja', 'cms-about', 'ja', 'イベント紹介',                '',                                                'none'),
    ('tr-home-ko',  'cms-home',  'ko', '페이지',                      '전시 공식 홈 페이지 본문',                          'reviewed'),
    ('tr-home-en',  'cms-home',  'en', 'KINTEX Global Smart Tech Expo 2026', 'Official home page of the exhibition.',    'reviewed'),
    ('tr-notice-ko','cms-notice','ko', '공지사항',                    '반입·반출 안내 공지',                              'reviewed'),
    ('tr-notice-en','cms-notice','en', '',                           '',                                                'none')
ON CONFLICT (content_id, lang) DO NOTHING;

INSERT INTO microsite (exhibitor_id, event_id, slug, exhibitor_name, theme, sections, seo_title, seo_meta, langs, status)
VALUES (
    'hanbit', NULL, 'hanbit', '(주)한빛로보틱스', 'blue',
    '[{"id":"intro","type":"intro","visible":true,"order":0,"payload":{"headline":"지능형 로보틱스의 새로운 지평을 열다","desc":"산업용 로봇부터 서비스 자동화 솔루션까지, 한빛로보틱스가 제시하는 미래 모빌리티 생태계를 경험하세요."}},{"id":"products","type":"products","visible":true,"order":1,"payload":{"items":[{"name":"HR-A1 협동로봇","tag":"NEW","desc":"고정밀 센서·AI 비전 시스템 탑재 다목적 협동로봇."},{"name":"ServiBot Elite","tag":"POPULAR","desc":"전시장·호텔용 지능형 서비스 로봇."}]}},{"id":"gallery","type":"gallery","visible":true,"order":2,"payload":{"images":[]}},{"id":"contact","type":"contact","visible":true,"order":3,"payload":{"email":"","phone":""}}]'::jsonb,
    '한빛로보틱스 | KINTEX AI 전시',
    'KINTEX AI EXPO (주)한빛로보틱스 공식 마이크로사이트 — 최첨단 협동로봇·서비스 로봇 솔루션을 만나보세요.',
    'ko,en', 'published'
)
ON CONFLICT (exhibitor_id) DO NOTHING;
