package com.kamco.cd.kamcoback.postgres.core;

import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto;
import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.YearSearchReq;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngEntity;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity;
import com.kamco.cd.kamcoback.postgres.entity.YearEntity;
import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngRepository;
import jakarta.persistence.EntityNotFoundException;
import jakarta.validation.Valid;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class MapSheetMngCoreService {

  private final MapSheetMngRepository mapSheetMngRepository;

  @Value("{spring.profiles.active}")
  private String activeEnv;

  public List<MapSheetMngDto.MngDto> findMapSheetMngList() {
    return mapSheetMngRepository.findMapSheetMngList();
  }

  public List<Integer> findMapSheetMngYyyyList() {
    return mapSheetMngRepository.findMapSheetMngYyyyList();
  }

  /**
   * 영상등록이 가능한 연도리스트
   *
   * @param req
   * @return
   */
  @Transactional(readOnly = true)
  public Page<YearEntity> getListMapListYYYYWithPaging(YearSearchReq req) {

    return mapSheetMngRepository.getYears(req);
  }

  public MapSheetMngDto.MngDto findMapSheetMng(int mngYyyy) {
    return mapSheetMngRepository.findMapSheetMng(mngYyyy);
  }

  public void MapSheetMngComplete(@Valid int mngYyyy) {
    mapSheetMngRepository.MapSheetMngComplete(mngYyyy);
  }

  public void deleteByHstUidMngFile(@Valid Long hstUid) {
    mapSheetMngRepository.deleteByHstUidMngFile(hstUid);
  }

  public int findByYearFileNameFileCount(int mngYyyy, String fileName) {
    return mapSheetMngRepository.findByYearFileNameFileCount(mngYyyy, fileName);
  }

  public MapSheetMngDto.DmlReturn mngFileSave(@Valid MapSheetMngDto.MngFileAddReq addReq) {

    mapSheetMngRepository.mngFileSave(addReq);

    return new MapSheetMngDto.DmlReturn("success", "파일정보저장되었습니다.");
  }

  public void updateMapSheetMngHstSyncCheckState(MapSheetMngDto.SyncCheckStateReqUpdateDto reqDto) {
    mapSheetMngRepository.updateMapSheetMngHstSyncCheckState(reqDto);
  }

  public Page<MapSheetMngDto.ErrorDataDto> findMapSheetErrorList(
      MapSheetMngDto.@Valid ErrorSearchReq searchReq) {
    return mapSheetMngRepository.findMapSheetErrorList(searchReq);
  }

  public MapSheetMngDto.ErrorDataDto findMapSheetError(Long hstUid) {
    return mapSheetMngRepository.findMapSheetError(hstUid);
  }

  public List<MapSheetMngDto.MngFilesDto> findByHstUidMapSheetFileList(Long hstUid) {
    return mapSheetMngRepository.findByHstUidMapSheetFileList(hstUid);
  }

  public MapSheetMngDto.MngFilesDto findYyyyToMapSheetFilePathRefer(int mngYyyy) {
    return mapSheetMngRepository.findYyyyToMapSheetFilePathRefer(mngYyyy);
  }

  public MapSheetMngDto.MngFilesDto findByFileUidMapSheetFile(Long fileUid) {
    return mapSheetMngRepository.findByFileUidMapSheetFile(fileUid);
  }

  public MapSheetMngDto.DmlReturn updateExceptUseInference(@Valid List<Long> hstUidList) {
    if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) {
      for (Long hstUid : hstUidList) {
        Optional<MapSheetMngHstEntity> entity =
            Optional.ofNullable(
                mapSheetMngRepository
                    .findMapSheetMngHstInfo(hstUid)
                    .orElseThrow(EntityNotFoundException::new));

        // entity.get().updateUseInference(true);
      }
    }
    return new MapSheetMngDto.DmlReturn("success", hstUidList.size() + "개 추론제외 업데이트 하였습니다.");
  }

  public int mngDataSave(@Valid MapSheetMngDto.AddReq addReq) {

    MapSheetMngEntity entity = new MapSheetMngEntity();
    entity.setMngYyyy(addReq.getMngYyyy());
    entity.setMngPath(addReq.getMngPath());

    mapSheetMngRepository.deleteByMngYyyyMngAll(addReq.getMngYyyy());

    MapSheetMngEntity saved = mapSheetMngRepository.save(entity);
    int hstCnt =
        mapSheetMngRepository.insertMapSheetOrgDataToMapSheetMngHst(
            saved.getMngYyyy(), saved.getMngPath());
    mapSheetMngRepository.updateYearState(saved.getMngYyyy(), "DONE");

    return hstCnt;
  }

  public List<MapSheetMngDto.MngFilesDto> findHstUidToMapSheetFileList(Long hstUid) {
    return mapSheetMngRepository.findHstUidToMapSheetFileList(hstUid);
  }

  public void deleteByFileUidMngFile(Long fileUid) {
    mapSheetMngRepository.deleteByFileUidMngFile(fileUid);
  }

  public void updateByHstUidSyncCheckState(MapSheetMngDto.SyncCheckStateReqUpdateDto reqDto) {
    mapSheetMngRepository.updateMapSheetMngHstSyncCheckState(reqDto);
  }

  public void updateByFileUidFileState(Long fileUid, String fileState) {
    mapSheetMngRepository.updateByFileUidMngFileState(fileUid, fileState);
  }

  public void deleteByNotInFileUidMngFile(Long hstUid, List<Long> fileUids) {
    mapSheetMngRepository.deleteByNotInFileUidMngFile(hstUid, fileUids);
  }
}
