-- 킨텍스 — 신원·마스터 스키마 (PLANNING §7-3 ERD / §5B UIWS 인증 이식)
-- 보안 불변(계약 §0-3): password_hash·otp_secret 컬럼은 API 응답에서 완전 제외한다.

-- 사용자 (UIWS TB_USER 이식 대응) --------------------------------------------
CREATE TABLE IF NOT EXISTS app_user (
    id                 varchar(40)  PRIMARY KEY,
    email              varchar(200) NOT NULL UNIQUE,
    display_name       varchar(120) NOT NULL,
    password_hash      varchar(120) NOT NULL,   -- BCrypt. 응답 제외(민감정보).
    hall_manager       boolean      NOT NULL DEFAULT false,
    otp_secret         varchar(96),             -- TOTP(RFC6238) 시크릿, 암호화 저장. 응답 제외.
    failed_login_count integer      NOT NULL DEFAULT 0,   -- 로그인 실패 잠금(§5B-3)
    locked_until       timestamptz,
    status             varchar(20)  NOT NULL DEFAULT 'ACTIVE',
    created_at         timestamptz  NOT NULL DEFAULT now(),
    updated_at         timestamptz  NOT NULL DEFAULT now()
);
COMMENT ON COLUMN app_user.password_hash IS 'BCrypt 해시 — API 응답/로그/메신저 노출 금지(계약 §0-3)';
COMMENT ON COLUMN app_user.otp_secret    IS 'TOTP 시크릿(암호화) — API 응답 노출 금지';

-- 등록업체 (킨텍스 등록업체 DB 739 / M7·M15 응찰 게이트) ----------------------
CREATE TABLE IF NOT EXISTS company (
    id              varchar(40)  PRIMARY KEY,
    registration_no varchar(20)  NOT NULL UNIQUE,   -- 사업자등록번호(초대 수락 검증 키)
    name            varchar(200) NOT NULL,
    category        varchar(40),                    -- 14개 분류(전시디자인설치·리깅·전기시설 …)
    region          varchar(40),
    registered      boolean      NOT NULL DEFAULT true,  -- 킨텍스 등록 여부(미등록 응찰 차단)
    phone           varchar(40),
    created_at      timestamptz  NOT NULL DEFAULT now()
);

-- 행사 -----------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS event (
    id         varchar(40)  PRIMARY KEY,
    name       varchar(200) NOT NULL,
    start_date date,
    end_date   date,
    status     varchar(20)  NOT NULL DEFAULT 'active',
    created_at timestamptz  NOT NULL DEFAULT now()
);

-- 홀 마스터 (PLANNING §7-1 / floorplans README 실측) --------------------------
CREATE TABLE IF NOT EXISTS hall (
    id                  varchar(20) PRIMARY KEY,     -- 'H1'..'H10','OUTDOOR'
    exhibition_center   integer     NOT NULL,        -- 1=제1전시장, 2=제2전시장
    label               varchar(60) NOT NULL,        -- '제1전시장 홀1' 등(워크스페이스 hallLabel)
    width_m             numeric(8,2),
    depth_m             numeric(8,2),
    height_m            numeric(6,2),
    area_m2             numeric(10,2),
    floor_load_t_per_m2 numeric(5,2),                -- 홀6 2t/㎡, 그 외 5t/㎡ (규정 FLOOR_LOAD)
    floor_type          varchar(30),                 -- concrete_polished | carpet | outdoor
    booth_capacity      integer,
    has_gas             boolean     NOT NULL DEFAULT false,  -- 홀1·7 가스 공급
    is_assumed_trench   boolean     NOT NULL DEFAULT true,   -- 트렌치 좌표 실측 여부(PLANNING R4)
    created_at          timestamptz NOT NULL DEFAULT now()
);

-- 홀 배정 (Event 1─N HallAssignment) -----------------------------------------
CREATE TABLE IF NOT EXISTS hall_assignment (
    id         varchar(40) PRIMARY KEY,
    event_id   varchar(40) NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    hall_id    varchar(20) NOT NULL REFERENCES hall(id),
    is_primary boolean     NOT NULL DEFAULT false,
    UNIQUE (event_id, hall_id)
);

-- 행사 단위 RBAC 멤버십 (계약 §0-5: ORGANIZER·EXHIBITOR·CONTRACTOR·HALL_MANAGER)
CREATE TABLE IF NOT EXISTS event_member (
    id         varchar(40) PRIMARY KEY,
    event_id   varchar(40) NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    user_id    varchar(40) NOT NULL REFERENCES app_user(id) ON DELETE CASCADE,
    role_code  varchar(20) NOT NULL,           -- ORGANIZER|EXHIBITOR|CONTRACTOR|HALL_MANAGER
    booth_id   varchar(40),                    -- EXHIBITOR 부스 스코프(선택)
    company_id varchar(40) REFERENCES company(id),  -- CONTRACTOR 소속 등록업체(선택)
    created_at timestamptz NOT NULL DEFAULT now(),
    UNIQUE (event_id, user_id, role_code)
);
CREATE INDEX IF NOT EXISTS idx_event_member_user ON event_member(user_id);

-- 부스 표준 사양 (PLANNING §7-1 / rates-v1.json boothStandard) -----------------
CREATE TABLE IF NOT EXISTS booth_standard (
    code       varchar(40)  PRIMARY KEY,   -- assembled | premium
    name       varchar(100),
    spec       jsonb,
    updated_at timestamptz  NOT NULL DEFAULT now()
);

-- 마스터데이터 참조(M18: 요율·유틸 요금·규정 룰셋 버전) -----------------------
-- 권위 룰셋은 classpath rulesets/*.json(룰 엔진 로드). 본 테이블은 M18 백오피스 조회·버전 추적용 사본.
CREATE TABLE IF NOT EXISTS master_data (
    category        varchar(40)  NOT NULL,   -- RATE | UTILITY_FEE | COMPLIANCE
    code            varchar(80)  NOT NULL,
    name            varchar(200),
    value_json      jsonb,
    ruleset_version varchar(40),
    updated_at      timestamptz  NOT NULL DEFAULT now(),
    PRIMARY KEY (category, code)
);
