package com.zioinfo.kintex.module.m2.dto;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.List;

/**
 * 홀 마스터 정보 — 캔버스 축척·경계·트렌치/비상구 오버레이 원천(계약 확장, 프론트 gap #2 해소).
 * {@link LayoutDto}에 additive 필드로 포함되며(NON_NULL), 이전 계약과 호환된다.
 *
 * @param hallId        홀 식별자
 * @param label         홀 표기(예: "제2전시장 홀7")
 * @param dimsM         [폭, 깊이] (미터) — 캔버스 경계·축척
 * @param ceilingM      천장 높이(미터)
 * @param targetBoothCount 목표 부스 수(홀 booth_capacity)
 * @param floorLoadTPerM2  홀 바닥하중 상한(t/㎡)
 * @param assumedTrench 트렌치 좌표가 실측이 아닌 가정 그리드인지(PLANNING R4 배지)
 * @param trenches      트렌치 포인트 목록(가정 그리드 포함)
 * @param exits         비상구 포인트 목록
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public record HallInfo(
        String hallId,
        String label,
        List<Double> dimsM,
        Double ceilingM,
        Integer targetBoothCount,
        Double floorLoadTPerM2,
        boolean assumedTrench,
        List<Trench> trenches,
        List<Exit> exits,
        List<Pillar> pillars,
        List<Obstacle> obstacles
) {

    /**
     * 벽·계단·엘리베이터·문 장애물(V63 hall_obstacle, CAD 실측 스트립) — 자동배치 회피·캔버스 표시.
     *
     * @param obstacleId 장애물 식별자
     * @param kind       stair | elevator | door | wall
     * @param x0,y0,x1,y1 홀 로컬 사각 영역(m, y=0 도면 상단)
     */
    public record Obstacle(String obstacleId, String kind, double x0, double y0, double x1, double y1) {
    }

    /**
     * 기둥(구조 장애물) — 자동배치 회피·캔버스 표시 근거(V62 hall_pillar, CAD/공식 도면 실측).
     *
     * @param pillarId 기둥 식별자
     * @param x        홀 로컬 X(m)
     * @param y        홀 로컬 Y(m, 도면 상단=0)
     * @param radiusM  기둥 반경(m)
     */
    public record Pillar(String pillarId, double x, double y, double radiusM) {
    }

    /**
     * 트렌치 포인트(홀 로컬 미터) + 공급 매트릭스.
     *
     * @param trenchId 트렌치 식별자
     * @param x        홀 로컬 X(미터)
     * @param y        홀 로컬 Y(미터)
     * @param assumed  가정 그리드 여부
     * @param supplies 공급 종류 목록(power/water/air/network/gas)
     */
    public record Trench(String trenchId, double x, double y, boolean assumed, List<String> supplies) {
    }

    /**
     * 비상구 포인트 + 접근 확보 버퍼.
     *
     * @param x          홀 로컬 X(미터)
     * @param y          홀 로컬 Y(미터)
     * @param clearanceM 비상구 접근 확보 버퍼(미터)
     */
    public record Exit(double x, double y, double clearanceM) {
    }
}
