package gc.mda.signal_batch.domain.gis.dto;

import gc.mda.signal_batch.domain.vessel.dto.CompactVesselTrack;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "비정상 접촉 선박 탐색 응답")
public class VesselContactResponse {

    @Schema(description = "접촉 선박 쌍 목록")
    private List<VesselContactPair> contacts;

    @Schema(description = "관련 선박의 전체 기간 항적 (CompactVesselTrack)")
    private List<CompactVesselTrack> tracks;

    @Schema(description = "탐색 요약 정보")
    private VesselContactSummary summary;

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "접촉 선박 쌍 상세 정보")
    public static class VesselContactPair {

        // ── 접촉 시간 정보 ──
        @Schema(description = "접촉 시작 시각 (Unix 초)", example = "1738368000")
        private Long contactStartTimestamp;

        @Schema(description = "접촉 종료 시각 (Unix 초)", example = "1738375200")
        private Long contactEndTimestamp;

        @Schema(description = "접촉 지속 시간 (분)", example = "120")
        private Long contactDurationMinutes;

        // ── 접촉 거리 정보 ──
        @Schema(description = "기간 내 최소 거리 (미터)", example = "45.2")
        private Double minDistanceMeters;

        @Schema(description = "기간 내 평균 거리 (미터)", example = "320.5")
        private Double avgDistanceMeters;

        @Schema(description = "기간 내 최대 거리 (미터)", example = "890.3")
        private Double maxDistanceMeters;

        // ── 접촉 위치 정보 ──
        @Schema(description = "접촉 구간 중심점 [경도, 위도]", example = "[129.0, 34.5]")
        private double[] contactCenterPoint;

        // ── 측정 정보 ──
        @Schema(description = "접촉 판정에 사용된 측정 포인트 수", example = "24")
        private Integer contactPointCount;

        // ── 선박 정보 ──
        @Schema(description = "선박 1 정보")
        private VesselContactInfo vessel1;

        @Schema(description = "선박 2 정보")
        private VesselContactInfo vessel2;

        // ── 환적 의심 지표 ──
        @Schema(description = "환적 의심 지표 (프론트엔드 렌더링 보조)")
        private TransshipmentIndicators indicators;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "접촉 선박 개별 정보")
    public static class VesselContactInfo {

        @Schema(description = "선박 고유 ID (MMSI)", example = "440113620")
        private String vesselId;

        @Schema(description = "선박명", example = "SAM SUNG 2HO")
        private String vesselName;

        @Schema(description = "AIS ship type 코드", example = "74")
        private String shipType;

        @Schema(description = "선종 분류 코드 (000020:어선, 000023:화물선 등)", example = "000023")
        private String shipKindCode;

        @Schema(description = "국적 MID 코드 (MMSI 앞 3자리)", example = "440")
        private String nationalCode;

        // ── 폴리곤 내 체류 정보 ──
        @Schema(description = "폴리곤 내 첫 시각 (Unix 초)", example = "1738360000")
        private Long insidePolygonStartTs;

        @Schema(description = "폴리곤 내 마지막 시각 (Unix 초)", example = "1738400000")
        private Long insidePolygonEndTs;

        @Schema(description = "폴리곤 내 체류 시간 (분)", example = "667")
        private Long insidePolygonDurationMinutes;

        // ── 접촉 구간 내 추정 속도 ──
        @Schema(description = "접촉 구간 추정 평균 속도 (knots, 좌표간 거리/시간 기반)", example = "1.2")
        private Double estimatedAvgSpeedKnots;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "환적 의심 지표 — 불법 환적(STS) 탐지 보조 데이터")
    public static class TransshipmentIndicators {

        @Schema(description = "양 선박 모두 저속 접촉 (< 3 knots, 정박/표류 중 접촉 → 화물 이전 가능성)", example = "true")
        private Boolean lowSpeedContact;

        @Schema(description = "서로 다른 선종 (어선↔화물선 등 → 환적 가능성↑)", example = "true")
        private Boolean differentVesselTypes;

        @Schema(description = "서로 다른 국적 (외국선 간 접촉)", example = "false")
        private Boolean differentNationalities;

        @Schema(description = "야간 접촉 (22:00~06:00 KST → 은밀성↑)", example = "false")
        private Boolean nightTimeContact;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "비정상 접촉 탐색 요약 정보")
    public static class VesselContactSummary {

        @Schema(description = "발견된 접촉 쌍 수", example = "3")
        private Integer totalContactPairs;

        @Schema(description = "접촉에 관련된 고유 선박 수", example = "5")
        private Integer totalVesselsInvolved;

        @Schema(description = "폴리곤 내 전체 선박 수", example = "42")
        private Integer totalVesselsInPolygon;

        @Schema(description = "처리 소요 시간 (ms)", example = "2340")
        private Long processingTimeMs;

        @Schema(description = "폴리곤 ID", example = "zone_A")
        private String polygonId;

        @Schema(description = "조회에 사용된 캐시 날짜 목록", example = "[\"2026-02-01\", \"2026-02-02\"]")
        private List<String> cachedDates;
    }
}
