-- 킨텍스 — F005 부스 판매 인벤토리 + F006 온라인 셀프 선택·판매 스키마 (멱등)
-- PLANNING/FEATURE_GAP F005/F006: 행사×홀의 부스 "판매 상태" 오버레이(available|held|sold|blocked).
--   기존 M2 공간 데이터(booth POLYGON·layout)를 판매 단위로 소비(읽기만) — 본 마이그레이션은 M2 스키마 불변.
--   가격은 서버 권위: 기본 = ST_Area(booth.geom) × 요율(master_data RATE.exhibitionHallPerM2), 주최자 override 가능.
--   hold 동시성: UPDATE ... WHERE status='available'(또는 만료 held) 원자 전이 + (event_id, booth_id) 유니크.
-- 보안 불변: 본 마이그레이션은 V27 단독. V1~V26 및 타 팀 마이그레이션을 변경하지 않는다.
-- 멀티테넌시 표준(소유자 지시 2026-07-12): tenant_id = PK 선두 복합키 + DEFAULT 'KINTEX'.

-- 부스 판매 오버레이(BoothSale) — booth(booth_id) 1행 대응. booth_id 는 M2 booth 소프트 참조(FK 미설정:
-- 배치 재저장 시 booth 교체 가능성). status 전이는 서비스 원자 UPDATE 로 제어. --------------------
CREATE TABLE IF NOT EXISTS booth_sale (
    tenant_id       varchar(40)  NOT NULL DEFAULT 'KINTEX',
    id              varchar(40)  NOT NULL,
    event_id        varchar(40)  NOT NULL REFERENCES event(id) ON DELETE CASCADE,
    hall_id         varchar(20)  NOT NULL REFERENCES hall(id),
    booth_id        varchar(40)  NOT NULL,                       -- M2 booth.id 소프트 참조
    booth_no        varchar(40),                                 -- 표시용 부스 번호(스냅샷)
    status          varchar(20)  NOT NULL DEFAULT 'available',   -- available|held|sold|blocked
    unit_price      bigint,                                      -- 주최자 override(원). null = 면적×요율 파생
    area_m2         numeric(10,2),                               -- 판매면적 스냅샷(참고)
    held_by         varchar(40),                                 -- hold 점유 사용자
    held_until      timestamptz,                                 -- hold 만료(TTL) — 경과 시 lazy available
    sold_to_company varchar(200),                                -- 구매 확정 참가업체명(표시용, 민감정보 아님)
    sold_by         varchar(40),
    sold_at         timestamptz,
    blocked_reason  varchar(300),
    created_by      varchar(40),
    created_at      timestamptz  NOT NULL DEFAULT now(),
    updated_at      timestamptz  NOT NULL DEFAULT now(),
    UNIQUE (event_id, booth_id),                                 -- 부스당 1 판매 상태(동시 hold 이중 방지)
    UNIQUE (id),                                                 -- 단일 id 조회·FK 대상 보존
    PRIMARY KEY (tenant_id, id)                                  -- ★표준: tenant_id 선두 복합 PK
);
CREATE INDEX IF NOT EXISTS idx_booth_sale_scope  ON booth_sale (tenant_id, event_id, hall_id, status);
CREATE INDEX IF NOT EXISTS idx_booth_sale_held   ON booth_sale (status, held_until);
CREATE INDEX IF NOT EXISTS idx_booth_sale_booth  ON booth_sale (event_id, booth_id);

COMMENT ON TABLE  booth_sale            IS 'F005/F006 부스 판매 인벤토리 — M2 booth 좌표를 소비하는 판매 상태 오버레이(available|held|sold|blocked)';
COMMENT ON COLUMN booth_sale.unit_price IS '서버 권위 판매가(원). null 이면 면적×요율(rates-v1.0) 파생';
COMMENT ON COLUMN booth_sale.held_until IS 'hold TTL 만료 시각 — 경과분은 조회 시 available 로 lazy 만료';
