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

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 플로어플랜 공간 매퍼 — PostGIS ST_* 함수를 XML로 바인딩한다.
 * <b>TODO(kintex-db-engineer)</b>: resources/mybatis/mapper/BoothMapper.xml 구현 (M2-1).
 * 부스는 geometry(POLYGON) 컬럼, 트렌치는 geometry(POINT), 통로 검증은 ST_Buffer/ST_Distance/ST_Intersects.
 */
@Mapper
public interface BoothMapper {

    /** 배치안 헤더 조회(layoutId, version, name, status, updatedAt). */
    Map<String, Object> findLayout(@Param("eventId") String eventId,
                                   @Param("hallId") String hallId,
                                   @Param("version") Integer version);

    /** 배치안의 부스 목록 조회(폴리곤은 ST_AsGeoJSON 또는 좌표 배열로 반환). */
    List<Map<String, Object>> findBooths(@Param("layoutId") String layoutId);

    /** 배치안 헤더 upsert → layoutId 반환. */
    String upsertLayout(@Param("params") Map<String, Object> params);

    /** 부스 폴리곤 저장(ST_GeomFromText / ST_MakePolygon). 배치안 단위로 교체 저장. */
    void replaceBooths(@Param("layoutId") String layoutId,
                       @Param("booths") List<Map<String, Object>> booths);

    /** 판매 면적 합계(㎡) — SUM(ST_Area(geom)). */
    Double sumSalesArea(@Param("layoutId") String layoutId);

    /** 최소 통로 폭(m) — 인접 부스 폴리곤 간 ST_Distance 최소값(비상구·통로 제약 검증). */
    Double minAisleWidth(@Param("layoutId") String layoutId);

    /** 비상구를 차단하는 부스 수 — ST_Intersects(booth, exit_buffer). */
    Integer countExitsBlocked(@Param("layoutId") String layoutId,
                              @Param("hallId") String hallId);

    /**
     * 폴리곤 내부가 겹치는 부스 쌍의 수 — 부스는 서로 겹칠 수 없다(배치 무결성).
     * ST_Overlaps(경계 교차)뿐 아니라 포함·동일도 무효이므로 "내부 교차(ST_Intersects AND NOT ST_Touches)"로 판정한다.
     */
    Integer countOverlappingBooths(@Param("layoutId") String layoutId);
}
