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;
import java.util.Map;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "다중 폴리곤 영역 탐색 응답")
public class AreaSearchResponse {

    @Schema(description = "히트된 선박의 전체 기간 항적 (기존 V2 API와 동일한 CompactVesselTrack)")
    private List<CompactVesselTrack> tracks;

    @Schema(description = "선박별 영역 히트 메타데이터 (key: vesselId)")
    private Map<String, List<PolygonHitDetail>> hitDetails;

    @Schema(description = "검색 요약 정보")
    private AreaSearchSummary summary;

    @Data
    @Builder(toBuilder = true)
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "폴리곤별 히트 상세 정보 (개별 방문 단위)")
    public static class PolygonHitDetail {

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

        @Schema(description = "폴리곤 표시명", example = "대한해협 서수도")
        private String polygonName;

        @Schema(description = "영역 진입 시각 Unix timestamp (초, 경계 보간 적용)", example = "1738368000")
        private Long entryTimestamp;

        @Schema(description = "영역 진출 시각 Unix timestamp (초, 경계 보간 적용)", example = "1738382400")
        private Long exitTimestamp;

        @Schema(description = "영역 내 포인트 수", example = "45")
        private Integer hitPointCount;

        @Schema(description = "해당 폴리곤의 방문 순번 (1-based, 동일 구역 재방문 시 증가)", example = "1")
        private Integer visitIndex;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "영역 탐색 요약 정보")
    public static class AreaSearchSummary {

        @Schema(description = "히트된 선박 수", example = "12")
        private Integer totalVessels;

        @Schema(description = "히트된 전체 포인트 수", example = "4560")
        private Long totalPoints;

        @Schema(description = "적용된 검색 모드", example = "SEQUENTIAL")
        private AreaSearchRequest.SearchMode mode;

        @Schema(description = "검색 대상 폴리곤 ID 목록", example = "[\"zone_A\", \"zone_B\"]")
        private List<String> polygonIds;

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

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

        @Schema(description = "캐시된 전체 선박 수", example = "285000")
        private Integer totalCachedVessels;
    }
}
