-- V43 관람객 방문가이드 + 연간/월간 전시 캘린더 (소유자 지시 2026-07-12)
-- 목적: AI 관람 도우미가 실시간 외부호출 없이 DB 근거로 답하도록 관람객 관심정보를 멱등 적재.
--   (1) visitor_guide  — 교통·주차·입장·편의시설·접근성 안내(카테고리형, 공개 조회용)
--   (2) transport_info — 교통수단 구조화(지하철·GTX·버스·자가용·공항·KTX)
--   (3) 연/월 그룹 조회 지원 — event 파생컬럼(event_year·event_month) + 인덱스 + 캘린더 뷰
-- 원천: kintex.com 공개 페이지 크롤 (_workspace/crawl_visitor_guide_raw.md). 자격증명/PII 없음.
-- 불변: V1~V42 파일 불변. 순증(additive)·멱등만 수행(단일 트랜잭션 · Flyway 기본).
-- 테넌트 표준(V31): 신규 테넌트 소유 테이블은 tenant_id DEFAULT 'KINTEX' + PRIMARY KEY (tenant_id, id) 선두.

-- ============================================================================
-- 1) 관람객 방문가이드 — 카테고리형 안내 (공개 조회 · 민감정보 없음)
--    category: TRANSPORT | PARKING | ADMISSION | FACILITY | ACCESS | OVERVIEW
-- ============================================================================
CREATE TABLE IF NOT EXISTS visitor_guide (
    tenant_id     varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id            varchar(60)  NOT NULL,
    category      varchar(20)  NOT NULL,               -- TRANSPORT|PARKING|ADMISSION|FACILITY|ACCESS|OVERVIEW
    title         varchar(200) NOT NULL,
    body          text         NOT NULL,               -- 안내 본문(마크다운/평문)
    summary       varchar(400),                        -- AI 요약 답변용 한 줄 요약
    display_order integer      NOT NULL DEFAULT 0,
    source_url    varchar(300),                         -- 출처(공개 페이지)
    use_yn        char(1)      NOT NULL DEFAULT 'Y',
    updated_at    timestamptz  NOT NULL DEFAULT now(),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_visitor_guide_cat
    ON visitor_guide (tenant_id, category, display_order);
COMMENT ON TABLE visitor_guide IS
    '관람객 방문가이드(교통/주차/입장/편의/접근성) — AI 관람도우미 근거 데이터. 공개 조회용(PII 없음).';

-- ── 시드(멱등: ON CONFLICT DO UPDATE 로 최신 원천 리프레시) ──────────────────
INSERT INTO visitor_guide (id, category, title, body, summary, display_order, source_url) VALUES
-- 교통 -----------------------------------------------------------------------
('vg-transport-subway', 'TRANSPORT', '지하철 · GTX',
 '수도권 전철 3호선 대화역에서 도보/셔틀 연계로 접근합니다. GTX-A 킨텍스역(2024 개통)이 전시장과 직접 연결되어 서울역·수서 방면에서 빠르게 도착할 수 있습니다.',
 '3호선 대화역 또는 GTX-A 킨텍스역 이용', 10,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('vg-transport-bus', 'TRANSPORT', '버스',
 '시내버스 33-1, 55, 83, 89, 97, 98, 062(마을), N007(마을). 직행·광역 1100, 6701, M7646, M7731. 공항버스 5600(김포공항~인천공항 T2 연계). 예) 83번 평일 배차 9~10분.',
 '시내·광역·공항버스 다수 정차(83·1100·M7646·5600 등)', 20,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('vg-transport-car', 'TRANSPORT', '자가용 · 주소',
 '경기도 고양시 일산서구 킨텍스로 217-60 (우편번호 10390). 자유로·수도권제1순환고속도로 이용. 내비게이션 "킨텍스" 검색. 대표전화 031-995-8114.',
 '주소 고양시 일산서구 킨텍스로 217-60, 자유로 이용', 30,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('vg-transport-ktx-air', 'TRANSPORT', 'KTX · 공항',
 'KTX는 서울역·행신역(경부/전라/중앙선) 이용 후 지하철/버스 환승. 항공은 김포공항에서 5600 공항버스, 인천공항에서 리무진/철도 연계.',
 'KTX 서울·행신역, 김포/인천공항 버스 연계', 40,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
-- 주차 -----------------------------------------------------------------------
('vg-parking-fee', 'PARKING', '주차 요금',
 '전용주차(2.5t 미만 승용/소형): 기본 20분 1,240원, 추가 10분당 620원, 일 최대 19,000원. 대형(2.5t 이상)/버스: 기본 20분 2,480원, 추가 10분당 1,240원, 일 최대 38,000원. 임시주차장: 10분당 620원(최대 6,500원).',
 '승용 기본 20분 1,240원·일 최대 19,000원', 10,
 'https://www.kintex.com/web/ko/service/parking_user.do'),
('vg-parking-lot', 'PARKING', '주차장 위치 · 운영',
 '행사 시 임시주차장 T2(대화동 2600-7)·T3(2707-1)·T4(2720) 운영(08:00~18:30). 운영 규모는 행사 규모에 따라 변동됩니다. 대규모 행사 시 대중교통 이용을 권장합니다.',
 '임시주차장 T2/T3/T4 08:00~18:30(행사별 변동)', 20,
 'https://www.kintex.com/web/ko/service/parking_user.do'),
('vg-parking-discount', 'PARKING', '주차 할인',
 '국가유공자·장애인·친환경(전기/수소)차량 50% 감면, 다일권 할인 적용. 감면은 현장 증빙 확인 후 적용됩니다.',
 '유공/장애인/친환경차 50% 감면', 30,
 'https://www.kintex.com/web/ko/service/parking_user.do'),
-- 입장 안내 -------------------------------------------------------------------
('vg-admission-prereg', 'ADMISSION', '사전등록 · 입장권',
 '대부분의 전시는 온라인 무료 사전등록 후 QR/배지를 발급받아 현장에서 빠르게 입장합니다. 일부 전문 전시는 유료 또는 바이어 인증이 필요합니다. 정확한 입장 조건은 각 행사 공지를 확인하세요.',
 '온라인 무료 사전등록→QR/배지 발급→현장 입장', 10,
 'https://www.kintex.com'),
('vg-admission-checkin', 'ADMISSION', '현장 체크인 · 운영시간',
 '현장 안내데스크 또는 무인 키오스크에서 사전등록 QR을 스캔해 배지를 수령합니다. 전시장 일반 운영시간은 09:00~18:00이며 관람 시간은 통상 10:00~17:00(행사별 공지)입니다.',
 '현장 QR 스캔 체크인·관람 10:00~17:00(행사별)', 20,
 'https://www.kintex.com'),
-- 편의시설 -------------------------------------------------------------------
('vg-facility-food', 'FACILITY', '식음시설 · 편의점',
 '전문식당: (1전시장) 소담·본도시락·본우리반상·교동DF푸드코트·일산열무 / (2전시장) 명동칼국수·가쯔레쯔·예당·나주곰탕·IL MAZZIO·파나시아 푸드몰. 카페: 공차·뚜레쥬르·디저트39·망고식스 등. 편의점: 세븐일레븐(24시간), CU 1~5호점(08:00~18:00).',
 '전시장별 전문식당·카페·편의점(세븐일레븐 24시간)', 10,
 'https://www.kintex.com/web/ko/service/facilities.do?gubun=A05001'),
('vg-facility-support', 'FACILITY', '지원시설',
 'ATM(현금인출기), 정보데스크(각 홀 부근), 의무실, 동전 보관함, 치안센터를 운영합니다. 분실물·응급 상황은 인근 정보데스크 또는 치안센터를 이용하세요.',
 'ATM·정보데스크·의무실·보관함·치안센터', 20,
 'https://www.kintex.com/web/ko/service/facilities.do?gubun=A05001'),
-- 접근성 ---------------------------------------------------------------------
('vg-access-facility', 'ACCESS', '접근성 · 유아 · 장애인',
 '다층 이동 엘리베이터, 휠체어 접근 동선(식음시설·복도), 장애인 전용 주차구역, 수유실(2전시장 2층)을 제공합니다. 휠체어 대여 및 상세 접근 안내는 정보데스크에 문의하세요.',
 '엘리베이터·휠체어 동선·장애인 주차·수유실(2전시장 2층)', 10,
 'https://www.kintex.com/web/ko/service/facilities.do?gubun=A05001'),
-- 전시장 개요 -----------------------------------------------------------------
('vg-overview-venue', 'OVERVIEW', '전시장 개요',
 '제1전시장 5개 홀(1~5, 실내 53,541㎡+옥외), 제2전시장 5개 홀(6~10, 54,470㎡). 총 약 108,011㎡로 국내 최대 규모입니다. 6홀은 이벤트홀, 그 외 홀은 이동식 칸막이로 분할/통합됩니다.',
 '국내 최대 약 108,011㎡, 제1(5홀)·제2(5홀)전시장', 10,
 'https://www.kintex.com/web/ko/html/facility/exhibition_overview.do')
ON CONFLICT (tenant_id, id) DO UPDATE
    SET category = EXCLUDED.category, title = EXCLUDED.title, body = EXCLUDED.body,
        summary = EXCLUDED.summary, display_order = EXCLUDED.display_order,
        source_url = EXCLUDED.source_url, updated_at = now();

-- ============================================================================
-- 2) 교통수단 구조화 — 지도/경로 UI 및 AI 상세 답변용
--    mode: SUBWAY | GTX | BUS | CAR | AIRPORT | KTX
-- ============================================================================
CREATE TABLE IF NOT EXISTS transport_info (
    tenant_id     varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id            varchar(60)  NOT NULL,
    mode          varchar(20)  NOT NULL,               -- SUBWAY|GTX|BUS|CAR|AIRPORT|KTX
    line_name     varchar(120),                        -- 3호선 대화역 / GTX-A / 버스 83 등
    route         varchar(400),                        -- 경로/정차/노선 설명
    from_point    varchar(120),                        -- 출발 기준점(서울역, 김포공항 등)
    travel_time   varchar(60),                         -- 소요/배차 시간
    note          varchar(300),
    display_order integer      NOT NULL DEFAULT 0,
    source_url    varchar(300),
    updated_at    timestamptz  NOT NULL DEFAULT now(),
    PRIMARY KEY (tenant_id, id)
);
CREATE INDEX IF NOT EXISTS idx_transport_info_mode
    ON transport_info (tenant_id, mode, display_order);

INSERT INTO transport_info (id, mode, line_name, route, from_point, travel_time, note, display_order, source_url) VALUES
('ti-subway-3', 'SUBWAY', '수도권 전철 3호선 대화역', '대화역 하차 후 도보/셔틀 연계', '서울(고속터미널/종로3가 환승)', '역~전시장 셔틀/도보', '3호선 서쪽 종착부', 10,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-gtx-a', 'GTX', 'GTX-A 킨텍스역', '킨텍스역 하차, 전시장 직접 연결', '서울역·수서', '수서~킨텍스 약 20분대', '2024 개통, 최속 접근', 20,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-bus-city', 'BUS', '시내버스', '33-1, 55, 83, 89, 97, 98, 062마을, N007마을', '고양/일산 일대', '83번 평일 배차 9~10분', '킨텍스 정류장 정차', 30,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-bus-express', 'BUS', '직행·광역버스', '1100(직행), 6701(직행), M7646(광역), M7731(광역)', '서울 도심/강남권', '노선별 상이', '광역 급행 연계', 40,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-airport', 'AIRPORT', '공항버스 5600', '김포공항~인천공항 T2 연계', '김포/인천공항', '노선 시간표 참조', '공항 이용객 연계', 50,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-ktx', 'KTX', 'KTX 서울역·행신역', '서울역·행신역 하차 후 지하철/버스 환승', '전국(경부/전라/중앙선)', '환승 필요', '고속철 연계', 60,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do'),
('ti-car', 'CAR', '자가용', '자유로·수도권제1순환고속도로 이용, 내비 "킨텍스" 검색', '수도권', '-', '킨텍스로 217-60(우 10390)', 70,
 'https://www.kintex.com/web/ko/html/service/parking_transportation.do')
ON CONFLICT (tenant_id, id) DO UPDATE
    SET mode = EXCLUDED.mode, line_name = EXCLUDED.line_name, route = EXCLUDED.route,
        from_point = EXCLUDED.from_point, travel_time = EXCLUDED.travel_time,
        note = EXCLUDED.note, display_order = EXCLUDED.display_order,
        source_url = EXCLUDED.source_url, updated_at = now();

-- ============================================================================
-- 3) 연간/월간 전시 캘린더 지원 — event 파생컬럼 + 인덱스 + 뷰
--    이벤트 데이터는 V10(10년 시드)·V32(2026 하반기 크롤)·V42(대량 데모)로 이미 적재됨.
--    본 절은 "올해 주요 전시", "이번 달/다음 달 일정"을 연/월로 그룹 조회하기 위한 파생/인덱스만 순증.
-- ============================================================================
-- 3-1) 파생 컬럼(STORED 생성열) — start_date 로부터 자동 산출·동기 유지(향후 시드 자동 반영).
ALTER TABLE event ADD COLUMN IF NOT EXISTS event_year  integer
    GENERATED ALWAYS AS (EXTRACT(YEAR  FROM start_date)::integer) STORED;
ALTER TABLE event ADD COLUMN IF NOT EXISTS event_month integer
    GENERATED ALWAYS AS (EXTRACT(MONTH FROM start_date)::integer) STORED;
COMMENT ON COLUMN event.event_year  IS '개최연(start_date 파생·STORED) — 연간 그룹 조회 키.';
COMMENT ON COLUMN event.event_month IS '개최월(start_date 파생·STORED) — 월간 그룹 조회 키.';

-- 3-2) 연/월 그룹 조회 가속 인덱스(tenant_id 선두 복합).
CREATE INDEX IF NOT EXISTS idx_event_calendar
    ON event (tenant_id, event_year, event_month, start_date);

-- 3-3) 캘린더 뷰 — 생명주기 상태(예정/진행/종료)를 날짜로 산출(별도 컬럼 백필 불필요).
CREATE OR REPLACE VIEW v_event_calendar AS
SELECT e.tenant_id,
       e.id,
       e.name,
       e.category,
       e.hall_label,
       e.poster_url,
       e.start_date,
       e.end_date,
       e.event_year,
       e.event_month,
       CASE
           WHEN e.start_date IS NULL              THEN 'UNKNOWN'
           WHEN CURRENT_DATE <  e.start_date      THEN 'UPCOMING'   -- 예정
           WHEN CURRENT_DATE >  COALESCE(e.end_date, e.start_date) THEN 'ENDED'  -- 종료
           ELSE 'ONGOING'                                          -- 진행중
       END AS lifecycle
  FROM event e
 WHERE e.status <> 'cancelled';
COMMENT ON VIEW v_event_calendar IS
    '연/월 캘린더 조회 뷰 — lifecycle(UPCOMING/ONGOING/ENDED)을 날짜로 산출. AI 연간/월간 일정 답변 근거.';

-- 3-4) 월별 집계 뷰 — "그 달에 몇 개 전시" 요약.
CREATE OR REPLACE VIEW v_event_monthly_summary AS
SELECT tenant_id, event_year, event_month, count(*) AS event_count
  FROM event
 WHERE start_date IS NOT NULL AND status <> 'cancelled'
 GROUP BY tenant_id, event_year, event_month;
COMMENT ON VIEW v_event_monthly_summary IS '월별 전시 건수 집계 — 연간 기획 요약(월별 개최 수) 근거.';
