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

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import gc.mda.signal_batch.global.config.FlexibleLocalDateTimeDeserializer;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "비정상 접촉 선박 탐색 요청")
public class VesselContactRequest {

    @NotNull(message = "시작 시간은 필수입니다")
    @JsonDeserialize(using = FlexibleLocalDateTimeDeserializer.class)
    @Schema(description = "조회 시작 시간", example = "2026-02-01T00:00:00", requiredMode = Schema.RequiredMode.REQUIRED)
    private LocalDateTime startTime;

    @NotNull(message = "종료 시간은 필수입니다")
    @JsonDeserialize(using = FlexibleLocalDateTimeDeserializer.class)
    @Schema(description = "조회 종료 시간", example = "2026-02-07T23:59:59", requiredMode = Schema.RequiredMode.REQUIRED)
    private LocalDateTime endTime;

    @NotNull(message = "폴리곤은 필수입니다")
    @Valid
    @Schema(description = "탐색 대상 폴리곤 영역", requiredMode = Schema.RequiredMode.REQUIRED)
    private SearchPolygon polygon;

    @NotNull(message = "최소 접촉 지속 시간은 필수입니다")
    @Min(value = 30, message = "최소 접촉 지속 시간은 30분 이상이어야 합니다")
    @Max(value = 360, message = "최소 접촉 지속 시간은 360분(6시간) 이하여야 합니다")
    @Schema(description = "최소 접촉 지속 시간 (분, 30~360)", example = "60", requiredMode = Schema.RequiredMode.REQUIRED)
    private Integer minContactDurationMinutes;

    @NotNull(message = "최대 접촉 판정 거리는 필수입니다")
    @DecimalMin(value = "50.0", message = "최대 접촉 판정 거리는 50m 이상이어야 합니다")
    @DecimalMax(value = "5000.0", message = "최대 접촉 판정 거리는 5000m(5km) 이하여야 합니다")
    @Schema(description = "최대 접촉 판정 거리 (미터, 50~5000)", example = "1000", requiredMode = Schema.RequiredMode.REQUIRED)
    private Double maxContactDistanceMeters;

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "탐색 대상 폴리곤 영역")
    public static class SearchPolygon {

        @Schema(description = "클라이언트 지정 영역 식별자", example = "zone_A")
        private String id;

        @Schema(description = "영역 표시명", example = "동해 남부 해역")
        private String name;

        @NotNull(message = "폴리곤 좌표는 필수입니다")
        @Size(min = 4, message = "폴리곤은 최소 4개 좌표 필요 (첫점==끝점)")
        @Schema(description = "폴리곤 좌표 배열 [[lon,lat],...] 첫점과 끝점이 동일해야 함",
                example = "[[128.5,34.0],[129.5,34.0],[129.5,35.0],[128.5,35.0],[128.5,34.0]]",
                requiredMode = Schema.RequiredMode.REQUIRED)
        private List<double[]> coordinates;
    }
}
