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

import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import java.time.ZonedDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public class ModelMngDto {

  @Schema(name = "ModelMng Basic", description = "모델관리 엔티티 기본 정보")
  @Getter
  public static class Basic {

    private final Long id;
    private final String modelNm;
    private final String modelCate;
    private final String modelPath;

    @JsonFormatDttm private final ZonedDateTime createdDttm;
    private final Long createdUid;

    @JsonFormatDttm private final ZonedDateTime updatedDttm;
    private final Long updatedUid;
    private final String modelCntnt;

    public Basic(
        Long id,
        String modelNm,
        String modelCate,
        String modelPath,
        ZonedDateTime createdDttm,
        Long createdUid,
        ZonedDateTime updatedDttm,
        Long updatedUid,
        String modelCntnt) {
      this.id = id;
      this.modelNm = modelNm;
      this.modelCate = modelCate;
      this.modelPath = modelPath;
      this.createdDttm = createdDttm;
      this.createdUid = createdUid;
      this.updatedDttm = updatedDttm;
      this.updatedUid = updatedUid;
      this.modelCntnt = modelCntnt;
    }
  }

  @Schema(name = "FinalModelDto", description = "최종 등록 모델")
  @Getter
  public static class FinalModelDto {
    private final Long modelUid;
    private final String modelNm;
    private final String modelCate;
    private final Long modelVerUid;
    private final String modelVer;
    private final String usedState;
    private final String modelState;
    private final Double qualityProb;
    private final String deployState;
    private final String modelPath;

    public FinalModelDto(
        Long modelUid,
        String modelNm,
        String modelCate,
        Long modelVerUid,
        String modelVer,
        String usedState,
        String modelState,
        Double qualityProb,
        String deployState,
        String modelPath) {
      this.modelUid = modelUid;
      this.modelNm = modelNm;
      this.modelCate = modelCate;
      this.modelVerUid = modelVerUid;
      this.modelVer = modelVer;
      this.usedState = usedState;
      this.deployState = deployState;
      this.modelState = modelState;
      this.qualityProb = qualityProb;
      this.modelPath = modelPath;
    }
  }

  @Schema(name = "ModelAddReq", description = "모델 버전 등록 req")
  @Getter
  @Setter
  @NoArgsConstructor
  @AllArgsConstructor
  public static class AddReq {

    private String modelNm;
    private String modelCate;
    private String modelPath;

    @NotEmpty private String modelVer;
    private String modelCntnt;
  }

  @Schema(name = "searchReq", description = "등록이력보기 검색 요청")
  @Getter
  @Setter
  @NoArgsConstructor
  @AllArgsConstructor
  public static class searchReq {

    // 페이징 파라미터
    private int page = 0;
    private int size = 20;
    private String sort;

    public Pageable toPageable() {
      if (sort != null && !sort.isEmpty()) {
        String[] sortParams = sort.split(",");
        String property = sortParams[0];
        Sort.Direction direction =
            sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC;
        return PageRequest.of(page, size, Sort.by(direction, property));
      }
      return PageRequest.of(page, size);
    }
  }

  @Schema(name = "ModelRegHistory", description = "모델 등록 이력")
  @Getter
  @Setter
  @NoArgsConstructor
  @AllArgsConstructor
  public static class ModelRegHistory {
    private String modelNm;
    private String modelCate;
    private String modelVer;
    private String strCreatedDttm;
    private String usedState;
    private String deployState;
    private String strDeployDttm;
  }

  @Schema(name = "ModelDmlReturn", description = "모델 등록/수정/삭제 리턴")
  @Getter
  @Setter
  @NoArgsConstructor
  @AllArgsConstructor
  public static class ModelDmlReturn {
    private String execStatus;
    private String message;
  }
}
