package com.zioinfo.kintex.rules;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.List;

/**
 * 규정 위반/확인 항목 — 도면 위 번호 핀과 1:1 연결(design.md ViolationFlag).
 *
 * @param pin              도면 하이라이트 핀 번호(1부터)
 * @param code             규칙 코드(HEIGHT_MAX 등)
 * @param group            규칙 그룹(height/rigging/egress ...)
 * @param label            규칙 원문 요약(한글)
 * @param severity         "block"(차단·제출 불가) | "warn"(경고·확인 후 진행)
 * @param measured         측정값 요약(예: "5.4m — 0.4m 초과"). 값 미제공 시 null
 * @param requiresDocument 부속 제출 요구(예: STRUCTURAL_CALC_D7). 없으면 null
 * @param boothId          위반 부스 식별자(부스 단위 규칙만) — 캔버스 하이라이트 매핑(계약 확장, NON_NULL)
 * @param anchor           도면 하이라이트 앵커 좌표 [x,y] (미터) — 핀 위치(계약 확장, NON_NULL)
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public record Violation(
        int pin,
        String code,
        String group,
        String label,
        String severity,
        String measured,
        String requiresDocument,
        String boothId,
        List<Double> anchor
) {

    /** 룰 엔진용 — 위치(부스/앵커) 미상 위반 생성. 서비스가 이후 {@link #withLocation}로 좌표를 채운다. */
    public Violation(int pin, String code, String group, String label,
                     String severity, String measured, String requiresDocument) {
        this(pin, code, group, label, severity, measured, requiresDocument, null, null);
    }

    /** 부스/앵커 좌표를 부여한 사본(도면 핀 매핑). */
    public Violation withLocation(String boothId, List<Double> anchor) {
        return new Violation(pin, code, group, label, severity, measured, requiresDocument, boothId, anchor);
    }
}
