-- ============================================================================
-- V90 — 관람객 주차 연계(F-C2): 주차장 마스터 + 사전 주차권(mock 결제)
-- 담당: kintex-backend-dev · 작성: 2026-07-23
-- ----------------------------------------------------------------------------
-- 목적: 관람객 앱/공개 사이트의 ①주차 현황(잔여·요금·혼잡) ②사전 주차권 구매(mock 결제)
--       ③내 주차권 조회를 위한 최소 스키마.
-- 원칙: 표준 tenant_id='KINTEX'(대문자)·복합 PK 선두. FK 최소화(컬럼만, 제약 없음).
--       실시간 잔여/점유는 외부(iparking 등) 미연동 → ParkingService 시뮬레이션 어댑터가 산출.
--       DB에는 주차장 정착 마스터 + 발급된 주차권만 저장한다(실시간 점유 미보관).
--   PII(§0-3): 차량번호 원문 미보관 — vehicle_plate_masked(12가**56)만 저장. 소유자는 내부 user_id.
--   전부 멱등(ON CONFLICT DO NOTHING / IF NOT EXISTS) — 재실행 안전.
-- ============================================================================

-- ── 1) 주차장 마스터 ─────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS parking_lot (
    tenant_id         varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id                varchar(64)  NOT NULL,
    code              varchar(32)  NOT NULL,
    name              varchar(120) NOT NULL,
    exhibition_center integer,                              -- 1=제1전시장, 2=제2전시장 (null=공용)
    total_capacity    integer      NOT NULL DEFAULT 0,      -- 총 주차면
    hourly_rate       numeric(10,0) NOT NULL DEFAULT 0,     -- 시간당 요금(원)
    daily_max         numeric(10,0),                        -- 1일 상한(원, null=상한없음)
    pass_price        numeric(10,0) NOT NULL DEFAULT 0,     -- 사전 주차권(1일권) 가격(원)
    note              varchar(300),
    status            varchar(16)  NOT NULL DEFAULT 'active',  -- active/closed
    sort_order        integer      NOT NULL DEFAULT 0,
    created_at        timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_parking_lot PRIMARY KEY (tenant_id, id),
    CONSTRAINT uq_parking_lot_code UNIQUE (tenant_id, code)
);
CREATE INDEX IF NOT EXISTS ix_parking_lot_active ON parking_lot (tenant_id, status, sort_order);

-- ── 2) 사전 주차권(발급) ─────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS parking_pass (
    tenant_id            varchar(32)  NOT NULL DEFAULT 'KINTEX',
    id                   varchar(64)  NOT NULL,
    pass_no              varchar(40)  NOT NULL,
    event_id             varchar(64),                       -- 연계 행사(선택)
    lot_id               varchar(64)  NOT NULL,
    lot_name             varchar(120) NOT NULL,             -- 구매 시점 스냅샷
    user_id              varchar(64)  NOT NULL,             -- 소유자(인증 관람객)
    use_date             date         NOT NULL,             -- 이용일(1일권)
    vehicle_plate_masked varchar(24),                       -- 차량번호 마스킹(원문 미보관)
    amount               numeric(10,0) NOT NULL DEFAULT 0,
    status               varchar(16)  NOT NULL DEFAULT 'PAID',  -- PAID/CANCELLED/USED
    pay_method           varchar(24),                       -- card/easy/bank/free
    pay_approval_no      varchar(64),
    created_at           timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT pk_parking_pass PRIMARY KEY (tenant_id, id),
    CONSTRAINT uq_parking_pass_no UNIQUE (pass_no),
    CONSTRAINT ck_parking_pass_amount CHECK (amount >= 0)
);
CREATE INDEX IF NOT EXISTS ix_parking_pass_user ON parking_pass (tenant_id, user_id, use_date DESC);
CREATE INDEX IF NOT EXISTS ix_parking_pass_lot_date ON parking_pass (tenant_id, lot_id, use_date, status);

-- ============================================================================
-- 시드 — 킨텍스 주차장 마스터(최소). 실시간 점유는 시뮬레이션 어댑터가 산출.
-- ============================================================================
INSERT INTO parking_lot
    (tenant_id, id, code, name, exhibition_center, total_capacity, hourly_rate, daily_max, pass_price, note, status, sort_order) VALUES
  ('KINTEX','pl-w1','W1','제1전시장 서측 주차장', 1, 1800, 1200, 12000, 10000, '제1전시장 최근접 · 대형 주차장', 'active', 0),
  ('KINTEX','pl-e1','E1','제1전시장 동측 주차장', 1, 1200, 1200, 12000, 10000, '제1전시장 동문 인접',           'active', 1),
  ('KINTEX','pl-w2','W2','제2전시장 서측 주차장', 2, 2000, 1200, 12000, 10000, '제2전시장 최근접',             'active', 2),
  ('KINTEX','pl-e2','E2','제2전시장 동측 주차장', 2, 1500, 1200, 12000, 10000, '제2전시장 동문 인접',           'active', 3),
  ('KINTEX','pl-out','OUT','야외 임시 주차장',    NULL, 900, 1000, 10000,  8000, '성수기 임시 개방(도보 이동)',  'active', 4)
ON CONFLICT (tenant_id, id) DO NOTHING;
