package com.kamco.cd.kamcoback.inference.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/** DTO classes for learning model result processing */
public class LearningModelResultDto {

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 결과 처리 요청")
  public static class ProcessRequest {

    @Schema(
        description = "GeoJSON 파일 경로",
        example =
            "src/main/resources/db/migration/sample-results_updated/캠코_2021_2022_35813023.geojson")
    private String filePath;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 결과 처리 응답")
  public static class ProcessResponse {

    @Schema(description = "처리 성공 여부")
    private boolean success;

    @Schema(description = "처리 결과 메시지")
    private String message;

    @Schema(description = "처리된 feature 개수")
    private int processedFeatures;

    @Schema(description = "처리된 파일 경로")
    private String filePath;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 결과 일괄 처리 요청")
  public static class BatchProcessRequest {

    @Schema(description = "GeoJSON 파일 경로 목록")
    private List<String> filePaths;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 결과 일괄 처리 응답")
  public static class BatchProcessResponse {

    @Schema(description = "처리 성공 여부")
    private boolean success;

    @Schema(description = "처리 결과 메시지")
    private String message;

    @Schema(description = "전체 처리된 feature 개수")
    private int totalProcessedFeatures;

    @Schema(description = "처리된 파일 개수")
    private int processedFileCount;

    @Schema(description = "처리된 파일 경로 목록")
    private List<String> filePaths;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 처리 상태")
  public static class ProcessingStatus {

    @Schema(description = "처리 ID")
    private String processingId;

    @Schema(description = "처리 상태 (PENDING, PROCESSING, COMPLETED, FAILED)")
    private String status;

    @Schema(description = "진행률 (0-100)")
    private int progressPercentage;

    @Schema(description = "현재 처리 중인 파일")
    private String currentFile;

    @Schema(description = "전체 파일 개수")
    private int totalFiles;

    @Schema(description = "처리 완료된 파일 개수")
    private int completedFiles;

    @Schema(description = "시작 시간")
    private String startTime;

    @Schema(description = "예상 완료 시간")
    private String estimatedEndTime;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "학습모델 데이터 요약")
  public static class DataSummary {

    @Schema(description = "전체 데이터 개수")
    private long totalRecords;

    @Schema(description = "연도별 데이터 개수")
    private List<YearDataCount> yearDataCounts;

    @Schema(description = "분류별 데이터 개수")
    private List<ClassDataCount> classDataCounts;

    @Schema(description = "지도 영역별 데이터 개수")
    private List<MapSheetDataCount> mapSheetDataCounts;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "연도별 데이터 개수")
  public static class YearDataCount {

    @Schema(description = "비교 연도 (예: 2021_2022)")
    private String compareYear;

    @Schema(description = "데이터 개수")
    private long count;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "분류별 데이터 개수")
  public static class ClassDataCount {

    @Schema(description = "분류명")
    private String className;

    @Schema(description = "변화 전 개수")
    private long beforeCount;

    @Schema(description = "변화 후 개수")
    private long afterCount;
  }

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  @Builder
  @Schema(description = "지도 영역별 데이터 개수")
  public static class MapSheetDataCount {

    @Schema(description = "지도 영역 번호")
    private String mapSheetNum;

    @Schema(description = "데이터 개수")
    private long count;

    @Schema(description = "평균 변화 탐지 확률")
    private double avgChangeDetectionProb;
  }
}
