-- V26 멀티테넌시(다중 전시관 SaaS) 1단계 — 기반 스키마 (PLANNING §1A · §8-2)
-- 목표: 테넌트 마스터 신설 + 핵심 테이블 tenant_id 순증(공유 스키마 + tenant_id 논리 격리).
-- 규칙(불변): V1~V25 불변. 전부 멱등(CREATE/ALTER ... IF NOT EXISTS + DEFAULT 백필)으로 재실행 안전.
--             기존 데이터는 DEFAULT 'kintex'(테넌트 #1)로 자동 백필 → 단일 테넌트 운영 무중단·회귀 0.
-- 범위(1단계): 테넌트 마스터 + 핵심 경로 테이블(event·hall·app_user). 나머지 도메인 매퍼 스윕은 2단계.

-- 1) 테넌트 마스터 = 전시관(Venue) (§1A-1) --------------------------------------
--    id = tenant_id 값(불변 코드, 소문자 slug) / name = 표시 코드·명칭 / domain = 컨텍스트 해소 키(§1A-3).
CREATE TABLE IF NOT EXISTS tenant (
    id         varchar(40)  PRIMARY KEY,          -- 'kintex','coex' … (tenant_id 전파 값)
    name       varchar(120) NOT NULL,             -- 'KINTEX','COEX' 등 표시명
    domain     varchar(200),                      -- 접속 서브도메인(호스트 매칭 키)
    status     varchar(20)  NOT NULL DEFAULT 'active',  -- active | onboarding | suspended
    created_at timestamptz  NOT NULL DEFAULT now()
);
COMMENT ON TABLE  tenant       IS '전시관(Venue) 테넌트 마스터 — 최상위 격리 스코프(§1A-1). KINTEX=테넌트 #1.';
COMMENT ON COLUMN tenant.id     IS '테넌트 식별 코드(불변) — 전 도메인 tenant_id 전파 값';
COMMENT ON COLUMN tenant.domain IS '컨텍스트 해소용 접속 도메인(§1A-3, 호스트 헤더 매칭)';

CREATE INDEX IF NOT EXISTS idx_tenant_domain ON tenant (domain);

-- 기준 테넌트 #1 시드(멱등). 기존 데이터의 DEFAULT 'kintex' 백필 대상과 일치.
INSERT INTO tenant (id, name, domain, status)
VALUES ('kintex', 'KINTEX', 'kintex.zioinfo.co.kr', 'active')
ON CONFLICT (id) DO NOTHING;

-- 2) 핵심 테이블 tenant_id 순증 (§1A-2 · §8-2 공유 스키마) -------------------------
--    NOT NULL DEFAULT 'kintex' → 기존 전 행이 테넌트 #1로 안전 백필(회귀 0).
ALTER TABLE event    ADD COLUMN IF NOT EXISTS tenant_id varchar(40) NOT NULL DEFAULT 'kintex';
ALTER TABLE hall     ADD COLUMN IF NOT EXISTS tenant_id varchar(40) NOT NULL DEFAULT 'kintex';
ALTER TABLE app_user ADD COLUMN IF NOT EXISTS tenant_id varchar(40) NOT NULL DEFAULT 'kintex';

-- 3) 테넌트 선두 복합 인덱스 (§8-2 성능 — 격리 쿼리는 tenant_id 선행 조건) ----------
CREATE INDEX IF NOT EXISTS idx_event_tenant    ON event    (tenant_id, start_date);
CREATE INDEX IF NOT EXISTS idx_hall_tenant     ON hall     (tenant_id, id);
CREATE INDEX IF NOT EXISTS idx_app_user_tenant ON app_user (tenant_id);
