-- ============================================================================
-- V39 데모 데이터 현실화 — "진행 중" 전시 + 서류/마일스톤/CMS/공지 + 데모 계정 워크스페이스
-- 담당: kintex-testdata-dev · 작성: 2026-07-12
-- ----------------------------------------------------------------------------
-- 배경(소유자 지적):
--   • "진행 중"(now() ∈ start~end) 전시가 없음 → 홈 진행중 탭·캘린더·ongoingEvents KPI 공백.
--   • 서류·마일스톤·CMS·공지가 비어 보임(공개 공지는 cms_content published 필요, 데모 계정은
--     e-2026-smf가 '예정'이라 진입해도 실감 데이터 부족).
--   • ★데모 계정(주최자/참가/공사)이 로그인 후 대시보드·플로어플랜·참가업체에서 "다 홈으로 이동"
--     (=행사 미참여). 근본원인 2가지: (1)OTP 필수역할이 OTP_ENROLL로 로그인 차단(→§99 OTP 편의),
--     (2)연결 행사 e-2026-smf가 '예정'뿐이라 진행중 워크스페이스 부재(→§2 진행중 리치행사 연결).
--
-- 원칙(불변):
--   • V1~V38 파일 불변. 본 파일은 순증(additive) — 전부 순수 INSERT ... ON CONFLICT DO NOTHING.
--     예외: §99 OTP 편의만 '백필형' UPDATE(otp_secret IS NULL 가드 — 기존 값 보존, 멱등).
--   • 테넌트 표준 = 'KINTEX'(대문자). 날짜는 CURRENT_DATE/now() 상대값(배포 시점 기준 항상 유효).
--   • PII 전부 가짜 더미(@kintex.test · 010-0000-xxxx). 실존 인물 금지.
--   • V38 데모 폐루프와 ID 충돌 없음(신규 접두어 e-2026-live / *-live-* / cms-v39-* / nt-live-*).
--
-- 실컬럼 근거(grep V1~V38): event(V2+V23 category/hall_label +V26 tenant_id +V32 poster_url),
--   hall_assignment/layout/booth(V2/V3), booth_sale(V27), required_document/event_milestone(V14),
--   cms_content(V19), notice/notification(V8/V38), app_user.otp_secret varchar(255)/otp_enabled(V12),
--   event_member UNIQUE(event_id,user_id,role_code)(V2). 홈 진행중 탭=HomeMapper.findShowcase(tenant 스코프).
-- ============================================================================


-- ============================================================================
-- 1. 진행 중 전시 3건 — now() ∈ [start,end]. status=active·category='전시'·hall_label·poster_url.
--    HomeMapper.findShowcase('ongoing')·findSummaryCounts.ongoingEvents 는 테넌트 스코프(멤버십 무관)
--    → 아래 3건이 홈 '진행중' 탭·캘린더·KPI를 즉시 채운다. 날짜는 CURRENT_DATE 상대(항상 진행중).
-- ============================================================================
INSERT INTO event (id, name, start_date, end_date, status, tenant_id, category, hall_label, poster_url) VALUES
  ('e-2026-live',  '2026 스마트 물류·자동화 코리아 (LIVE)',
     CURRENT_DATE - 1, CURRENT_DATE + 3, 'active', 'KINTEX', '전시', '제1전시장 홀1',
     'https://www.kintex.com/imageView.do?atchmnflNo=469205&fileseq=1'),
  ('e-2026-live2', '2026 국제 첨단로봇 & AI 엑스포',
     CURRENT_DATE,     CURRENT_DATE + 2, 'active', 'KINTEX', '전시', '제2전시장 홀7 , 전시홀 8',
     'https://www.kintex.com/imageView.do?atchmnflNo=469254&fileseq=2'),
  ('e-2026-live3', '2026 미래 모빌리티 위크',
     CURRENT_DATE - 2, CURRENT_DATE + 1, 'active', 'KINTEX', '전시', '제1전시장 홀3 , 전시홀 4',
     'https://www.kintex.com/imageView.do?atchmnflNo=469283&fileseq=1')
ON CONFLICT (id) DO NOTHING;


-- ============================================================================
-- 2. e-2026-live 리치 폐루프 — 데모 계정이 진입할 '진행중' 워크스페이스.
--    홀배정(대표)+배치+부스 8(POLYGON)+판매 오버레이+서류+마일스톤+설계안 → 대시보드/플로어플랜/참가업체 채움.
--    SRID 0 = 홀 로컬 평면(미터). 부스=6m×3m(18㎡) 4×2 그리드. 홀=H1(제1전시장 홀1).
-- ============================================================================
-- 2-1) 홀 배정(대표) + 배치 ------------------------------------------------------
INSERT INTO hall_assignment (id, event_id, hall_id, is_primary) VALUES
  ('ha-live-h1', 'e-2026-live', 'H1', true)
ON CONFLICT (event_id, hall_id) DO NOTHING;

INSERT INTO layout (id, event_id, hall_id, version, name, status) VALUES
  ('ly-live', 'e-2026-live', 'H1', 1, 'LIVE 데모 배치(진행중)', 'confirmed')
ON CONFLICT (id) DO NOTHING;

-- 2-2) 부스 8(POLYGON) ---------------------------------------------------------
INSERT INTO booth (id, layout_id, booth_no, booth_type, geom, size_w_m, size_d_m, height_m,
                   floor_load_t_per_m2, assigned_company_name, premium) VALUES
  ('booth-live-01','ly-live','L-101','island',     ST_GeomFromText('POLYGON((0 0,6 0,6 3,0 3,0 0))',0),      6,3,4.0,1.0,'(주)스마트오토메이션',true),
  ('booth-live-02','ly-live','L-102','independent', ST_GeomFromText('POLYGON((7 0,13 0,13 3,7 3,7 0))',0),    6,3,3.5,1.0,'델타로보틱스',false),
  ('booth-live-03','ly-live','L-103','assembled',   ST_GeomFromText('POLYGON((14 0,20 0,20 3,14 3,14 0))',0), 6,3,3.0,1.0,'글로벌테크',false),
  ('booth-live-04','ly-live','L-104','corner',      ST_GeomFromText('POLYGON((21 0,27 0,27 3,21 3,21 0))',0), 6,3,3.5,1.0,'미래제조연구소',false),
  ('booth-live-05','ly-live','L-105','assembled',   ST_GeomFromText('POLYGON((0 4,6 4,6 7,0 7,0 4))',0),      6,3,3.0,1.0,NULL,false),
  ('booth-live-06','ly-live','L-106','assembled',   ST_GeomFromText('POLYGON((7 4,13 4,13 7,7 7,7 4))',0),    6,3,3.0,1.0,'한국센서테크',false),
  ('booth-live-07','ly-live','L-107','independent', ST_GeomFromText('POLYGON((14 4,20 4,20 7,14 7,14 4))',0), 6,3,3.5,1.0,NULL,false),
  ('booth-live-08','ly-live','L-108','assembled',   ST_GeomFromText('POLYGON((21 4,27 4,27 7,21 7,21 4))',0), 6,3,3.0,1.0,'바이오헬스랩',false)
ON CONFLICT (id) DO NOTHING;

-- 2-3) 판매 오버레이(booth_sale) — sold 5 · available 2 · held 1 ------------------
INSERT INTO booth_sale (tenant_id, id, event_id, hall_id, booth_id, booth_no, status, unit_price,
                        area_m2, held_by, held_until, sold_to_company, sold_by, sold_at,
                        blocked_reason, created_by) VALUES
  ('KINTEX','bs-live-01','e-2026-live','H1','booth-live-01','L-101','sold',      6534000,18,NULL,NULL,'(주)스마트오토메이션','demo-organizer',now()-interval '18 day',NULL,'system-seed'),
  ('KINTEX','bs-live-02','e-2026-live','H1','booth-live-02','L-102','sold',      5445000,18,NULL,NULL,'델타로보틱스','demo-organizer',now()-interval '14 day',NULL,'system-seed'),
  ('KINTEX','bs-live-03','e-2026-live','H1','booth-live-03','L-103','sold',      4356000,18,NULL,NULL,'글로벌테크','demo-organizer',now()-interval '10 day',NULL,'system-seed'),
  ('KINTEX','bs-live-04','e-2026-live','H1','booth-live-04','L-104','sold',      4791600,18,NULL,NULL,'미래제조연구소','demo-organizer',now()-interval '7 day',NULL,'system-seed'),
  ('KINTEX','bs-live-05','e-2026-live','H1','booth-live-05','L-105','available', NULL,   18,NULL,NULL,NULL,NULL,NULL,NULL,'system-seed'),
  ('KINTEX','bs-live-06','e-2026-live','H1','booth-live-06','L-106','sold',      4356000,18,NULL,NULL,'한국센서테크','demo-organizer',now()-interval '4 day',NULL,'system-seed'),
  ('KINTEX','bs-live-07','e-2026-live','H1','booth-live-07','L-107','held',      NULL,   18,'demo-exhibitor',now()+interval '45 minute',NULL,NULL,NULL,NULL,'system-seed'),
  ('KINTEX','bs-live-08','e-2026-live','H1','booth-live-08','L-108','available', NULL,   18,NULL,NULL,NULL,NULL,NULL,NULL,'system-seed')
ON CONFLICT (id) DO NOTHING;

-- 2-4) 설계안(design_plan) — 대시보드 designApproved/designTotal 채움 -----------------
INSERT INTO design_plan (id, booth_id, version, status, spec) VALUES
  ('dp-live-01','booth-live-01',1,'approved', '{"theme":"island-premium","height":4.0}'::jsonb),
  ('dp-live-02','booth-live-02',1,'approved', '{"theme":"independent","height":3.5}'::jsonb),
  ('dp-live-03','booth-live-03',1,'review',   '{"theme":"assembled-basic","height":3.0}'::jsonb),
  ('dp-live-06','booth-live-06',1,'draft',    '{"theme":"assembled-basic","height":3.0}'::jsonb)
ON CONFLICT (booth_id, version) DO NOTHING;

-- 2-5) 필수 서류(6) — 상태 분포 + 마감 임박(D+2). /docs (진행중 행사) 채움 -------------------
INSERT INTO required_document (id, event_id, doc_type, name, status, due_date, sort_order) VALUES
  ('doc-live-op',      'e-2026-live','operation_plan','행사운영계획서',      'approved',  NULL,              0),
  ('doc-live-layout',  'e-2026-live','booth_layout',  '부스배치도',          'approved',  NULL,              1),
  ('doc-live-disaster','e-2026-live','disaster_plan', '재해대처계획서',      'submitted', CURRENT_DATE + 5,  2),
  ('doc-live-rigging', 'e-2026-live','rigging_calc',  '리깅 구조계산서',      'draft',     CURRENT_DATE + 2,  3),
  ('doc-live-fire',    'e-2026-live','fire_safety',   '방화관리 책임서약서',  'submitted', CURRENT_DATE + 4,  4),
  ('doc-live-elec',    'e-2026-live','elec_safety',   '전기안전 점검확인서',  'pending',   CURRENT_DATE + 2,  5)
ON CONFLICT (event_id, doc_type) DO NOTHING;

-- 2-6) 마일스톤(5) — 진행중 행사 타임라인(상대일). 개장 완료·현재는 운영 단계 --------------------
INSERT INTO event_milestone (id, event_id, milestone_type, label, due_date, state, sort_order) VALUES
  ('ms-live-assign',   'e-2026-live','assignment','D-150 배정',    CURRENT_DATE - 150, 'done',   0),
  ('ms-live-prereview','e-2026-live','pre_review','D-30 사전협의', CURRENT_DATE - 30,  'done',   1),
  ('ms-live-utility',  'e-2026-live','utility',   'D-25 유틸리티', CURRENT_DATE - 25,  'done',   2),
  ('ms-live-docs',     'e-2026-live','documents', 'D-7 신고서류',  CURRENT_DATE - 7,   'done',   3),
  ('ms-live-opening',  'e-2026-live','opening',   'D-0 개장·운영', CURRENT_DATE - 1,   'active', 4)
ON CONFLICT (event_id, milestone_type) DO NOTHING;

INSERT INTO document_review_issue (id, event_id, tone, title, description, sort_order) VALUES
  ('dri-live-1','e-2026-live','info','현장 운영중','진행중 행사 — 실시간 서류 상태를 확인하세요.', 0),
  ('dri-live-2','e-2026-live','warn','마감 임박','리깅 구조계산서·전기안전 점검확인서 마감 D-2.', 1)
ON CONFLICT (id) DO NOTHING;

-- 2-7) ★데모 계정 → e-2026-live(진행중) 멤버십. 로그인 후 '진행중' 워크스페이스 보유
--      → 대시보드/플로어플랜/참가업체가 실제 진행중 행사로 진입("다 홈으로" 해소).
--      findEventRoles ORDER BY start_date → e-2026-live(오늘 개장)가 e-2026-smf(8월)보다 먼저 노출.
INSERT INTO event_member (id, event_id, user_id, role_code, booth_id, company_id) VALUES
  ('em-live-org', 'e-2026-live', 'demo-organizer',  'ORGANIZER',  NULL,            NULL),
  ('em-live-exh', 'e-2026-live', 'demo-exhibitor',  'EXHIBITOR',  'booth-live-02', NULL),
  ('em-live-con', 'e-2026-live', 'demo-contractor', 'CONTRACTOR', NULL,            'co-0001')
ON CONFLICT (event_id, user_id, role_code) DO NOTHING;


-- ============================================================================
-- 3. CMS 콘텐츠 — NOTICE 6 + PAGE 2 (전부 published). 공개 공지(status='published'
--    AND content_type='NOTICE')·/cms 목록을 채운다. V19 'cms-notice'는 draft라 공개 노출 안 됨.
-- ============================================================================
INSERT INTO cms_content (id, event_id, content_type, title, body, status, lang, signage, mailing, author_name, published_at) VALUES
  ('cms-v39-nt1','e-2026-live','NOTICE','[개막] 2026 스마트 물류·자동화 코리아 개막 안내','오늘 개막했습니다. 관람 시간 10:00~17:00, 무료 사전등록 관람객 우선 입장.', 'published','ko', true,  false, '주최 사무국', now()-interval '1 day'),
  ('cms-v39-nt2','e-2026-live','NOTICE','현장 등록 데스크 운영 안내','제1전시장 홀1 정문 등록데스크에서 QR 배지를 발급받으세요.', 'published','ko', true,  false, '주최 사무국', now()-interval '20 hour'),
  ('cms-v39-nt3',NULL,        'NOTICE','[공통] 킨텍스 주차 안내','제1·제2전시장 주차장 이용 안내 및 대중교통 노선 정보.', 'published','ko', false, false, '관리자', now()-interval '3 day'),
  ('cms-v39-nt4','e-2026-live','NOTICE','VIP 바이어 상담회 신청 안내','현장 B2B 상담 라운지에서 1:1 바이어 매칭 상담을 신청하세요.', 'published','ko', false, true,  '주최 사무국', now()-interval '2 day'),
  ('cms-v39-nt5',NULL,        'NOTICE','[안전] 전시장 내 안전수칙','장치물 최고 높이 5m 준수, 비상구·소화기 위치를 확인하세요.', 'published','ko', true,  false, '안전관리팀', now()-interval '4 day'),
  ('cms-v39-nt6','e-2026-live2','NOTICE','국제 첨단로봇 & AI 엑스포 세션 일정','키노트·기술세션 타임테이블을 공식 홈페이지에서 확인하세요.', 'published','ko', false, false, '주최 사무국', now()-interval '12 hour'),
  ('cms-v39-pg1','e-2026-live','PAGE','행사 소개 — 스마트 물류·자동화 코리아','물류 자동화·AMR·WMS·스마트팩토리 전 분야 300개사 참가. B2B 상담·컨퍼런스 동시 개최.', 'published','ko', false, false, '주최 사무국', now()-interval '5 day'),
  ('cms-v39-pg2',NULL,        'PAGE','관람 안내 & FAQ','입장·주차·편의시설·와이파이·유아동반 안내 등 자주 묻는 질문 모음.', 'published','ko', false, false, '관리자', now()-interval '6 day')
ON CONFLICT (id) DO NOTHING;


-- ============================================================================
-- 4. 공지(notice §5B) 6 — 진행중 행사(e-2026-live) + 공통(event_id NULL) 혼합.
--    /work/notice·홈 공지 위젯이 어떤 행사 컨텍스트에서도 비지 않도록 전역 공지 포함.
-- ============================================================================
INSERT INTO notice (id, event_id, category, title, content, pinned, author_id, author_name, view_count, published_at) VALUES
  ('nt-live-01','e-2026-live','EVENT', '[개막] 스마트 물류·자동화 코리아 오늘 개막','오늘 10:00 개막. 진행중 행사 워크스페이스에서 실시간 현황을 확인하세요.', true,  'demo-organizer','데모 주최자(홍길동)', 421, now()-interval '1 day'),
  ('nt-live-02','e-2026-live','GENERAL','참가업체 부스 운영 수칙','부스 운영시간·전기 사용·통로 확보 수칙을 준수해 주세요.', true,  'demo-organizer','데모 주최자(홍길동)', 245, now()-interval '20 hour'),
  ('nt-live-03','e-2026-live','EVENT',  'VIP 네트워킹 데이 안내','행사 2일차 오후 네트워킹 라운지를 운영합니다.', false, 'demo-organizer','데모 주최자(홍길동)', 132, now()-interval '15 hour'),
  ('nt-live-04',NULL,        'SYSTEM', '[공통] 관람객 앱 QR 체크인 안내','모바일 앱에서 QR 배지로 간편 체크인하세요.', false, 'demo-organizer','데모 주최자(홍길동)', 188, now()-interval '2 day'),
  ('nt-live-05',NULL,        'GENERAL','[공통] 전시장 편의시설 안내','수유실·의무실·물품보관소·푸드코트 위치 안내.', false, 'demo-organizer','데모 주최자(홍길동)', 96,  now()-interval '3 day'),
  ('nt-live-06',NULL,        'SYSTEM', '[시스템] 무선 인터넷(WiFi) 이용 안내','전시장 공용 WiFi SSID 및 접속 방법 안내.', false, 'demo-organizer','데모 주최자(홍길동)', 74,  now()-interval '5 day')
ON CONFLICT (id) DO NOTHING;

-- 홈 알림(notification) — 데모 계정에 진행중 행사 컨텍스트 알림(홈 알림센터 채움) ----------------
INSERT INTO notification (id, recipient_id, event_id, noti_type, title, message, link, read_at) VALUES
  ('no-live-01','demo-organizer', 'e-2026-live','SYSTEM', '진행중 행사 개막','스마트 물류·자동화 코리아가 개막했습니다. 대시보드에서 현황을 확인하세요.', '/events/e-2026-live/dashboard', NULL),
  ('no-live-02','demo-exhibitor', 'e-2026-live','MESSAGE','부스 배정 확정','L-102 독립부스가 배정되었습니다. 부스 홈에서 설계·유틸리티를 확인하세요.', '/booth-sales', NULL),
  ('no-live-03','demo-contractor','e-2026-live','SYSTEM', '진행중 행사 참여','스마트 물류·자동화 코리아 공사 파트너로 참여 중입니다.', '/contractor/dashboard', NULL)
ON CONFLICT (id) DO NOTHING;


-- ============================================================================
-- 99. ★데모 계정 OTP 로그인 편의 — 최소위험안(옵션 a).
-- ----------------------------------------------------------------------------
-- 문제: demo-organizer/exhibitor/contractor 는 event_member 보유 → requiresOtp()=true.
--       V38에서 otp_enabled=false 라 로그인 시 OTP_ENROLL(등록강제) 챌린지로 진입 차단됨.
-- 대안 평가:
--   (a) [채택] 데모 3계정을 'OTP 등록완료' 상태로 시드(고정·공개 base32 시크릿 + otp_enabled=true).
--       → 로그인 시 OTP_REQUIRED(챌린지) → 문서화된 시크릿을 Authenticator/oathtool에 1회 등록하면
--         이후 재배포에도 동일 코드 생성 가능(랜덤 재등록 불요). 순수 SQL·백엔드 무수정.
--   (b) 운영자가 admin 으로 대리 확인 — 데모 자율 로그인 불가(반려).
--   (c) 백엔드 데모도메인 OTP 예외 — 로직 수정 필요(범위 밖·별도 트랙).
-- 시크릿 노출 위험 평가: 데모 계정은 이미 '공개 자격'(@kintex.test·문서화된 비번 Kintex!Demo<Role>1)
--   이며 e-2026-smf/e-2026-live 데모 스코프로 한정 → 고정 시크릿 추가의 한계 위험은 미미.
--   ★운영 이관 시 반드시 제거(제거 목록 등재). 실사용자에는 절대 적용 금지.
-- SecretCipher.open(): 접두어 'enc:v1:' 없는 값은 평문으로 그대로 반환(하위호환) → 아래 평문 base32를
--   그대로 저장하면 TotpService.verify(base32, code)가 정상 검증(env 암호화키 불요).
-- 멱등/비파괴: otp_secret IS NULL 인 데모 계정에만 백필(기존 등록 시크릿 보존, 재실행 무해).
-- ----------------------------------------------------------------------------
UPDATE app_user SET otp_secret = 'ORGANIZERKINTEXDEMOTOTPSECRET234', otp_enabled = true, verify_method = 'OTP'
 WHERE id = 'demo-organizer'  AND otp_secret IS NULL;
UPDATE app_user SET otp_secret = 'EXHIBITORKINTEXDEMOTOTPSECRET234', otp_enabled = true, verify_method = 'OTP'
 WHERE id = 'demo-exhibitor'  AND otp_secret IS NULL;
UPDATE app_user SET otp_secret = 'CONTRACTORKINTEXDEMOTOTPSECRET23', otp_enabled = true, verify_method = 'OTP'
 WHERE id = 'demo-contractor' AND otp_secret IS NULL;


-- ============================================================================
-- 검증 쿼리(수동 실행용 — 마이그레이션 미포함 주석):
--   -- 진행중 전시: SELECT id,name,start_date,end_date FROM event
--   --   WHERE tenant_id='KINTEX' AND start_date<=CURRENT_DATE AND end_date>=CURRENT_DATE; -- >=3
--   -- 데모 워크스페이스(진행중 우선): SELECT em.event_id,em.role_code,e.start_date FROM event_member em
--   --   JOIN event e ON e.id=em.event_id WHERE em.user_id='demo-organizer' ORDER BY e.start_date; -- e-2026-live 선두
--   -- e-2026-live 대시보드 소스: SELECT count(*) FROM booth b JOIN layout l ON l.id=b.layout_id
--   --   WHERE l.event_id='e-2026-live'; -- 8
--   -- 공개 공지(published NOTICE): SELECT count(*) FROM cms_content WHERE status='published' AND content_type='NOTICE'; -- >=6
--   -- CMS published PAGE: SELECT count(*) FROM cms_content WHERE status='published' AND content_type='PAGE'; -- >=2(+V19)
--   -- 데모 OTP 등록완료: SELECT id,otp_enabled,(otp_secret IS NOT NULL) FROM app_user
--   --   WHERE id IN('demo-organizer','demo-exhibitor','demo-contractor'); -- otp_enabled=t, secret 존재
-- ============================================================================
