package com.zioinfo.kintex.module.m2;

import com.zioinfo.kintex.module.m2.dto.ApplyOptionRequest;
import com.zioinfo.kintex.module.m2.dto.AutoLayoutOption;
import com.zioinfo.kintex.module.m2.dto.AutoLayoutRequest;
import com.zioinfo.kintex.module.m2.dto.LayoutDto;
import com.zioinfo.kintex.module.m2.dto.LayoutInterpretResult;
import com.zioinfo.kintex.module.m2.dto.LayoutSaveRequest;
import com.zioinfo.kintex.rules.ComplianceReport;

import java.util.List;

/** M2 플로어플랜 스튜디오 서비스 계약. */
public interface FloorplanService {

    /** 배치안 조회(version=null이면 최신). */
    LayoutDto getLayout(String eventId, String hallId, Integer version);

    /** 배치 저장 → 저장된 배치안. 저장 시 규정 검증도 함께 산출해 summary에 반영. */
    LayoutDto saveLayout(String eventId, String hallId, LayoutSaveRequest request);

    /** 규정 검증 실행(통로 폭·바닥하중·비상구·복층 등) — 차단/경고 리포트. */
    ComplianceReport validate(String eventId, String hallId, Integer version);

    /**
     * 자연어 조건 해석 — 문장을 {@link AutoLayoutRequest} 로 파싱(AI, 설명·조건해석 전용) + 서버 권위 클램핑.
     * AI 미가용/파싱 실패는 예외가 아니라 degraded=true 결과로 강등(프론트 수동 폼 폴백).
     */
    LayoutInterpretResult interpret(String eventId, String hallId, String text);

    /**
     * AI 자동배치 — 조건 입력 → 정확히 optionCount개 배치안 후보(제약 기반 배치 + S7 발행).
     * @param ai true 면 각 안에 엔진 metrics 근거 AI 장단점 요약을 부가(실패 시 요약만 생략, 배치는 항상 성공).
     */
    List<AutoLayoutOption> autoGenerate(String eventId, String hallId, AutoLayoutRequest request, boolean ai);

    /** 자동배치 안 적용/병합 → 새 배치안 버전으로 저장 후 규정 재검증(선택/병합→검증 흐름 마감). */
    LayoutDto applyOption(String eventId, String hallId, ApplyOptionRequest request);
}
