package incheon.cmm.g2f.layer.service;

import incheon.cmm.g2f.layer.vo.*;
import org.geotools.ows.ServiceException;
import org.geotools.ows.wmts.WebMapTileServer;

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * G2F 레이어 서비스 인터페이스
 */
public interface G2FLayerService {

    /**
     * 레이어 편집 처리 (통합)
     * Added/Modified/Deleted 처리
     * 
     * @param request       편집 요청 데이터
     * @param currentUserId 현재 사용자 ID (권한 검증용)
     * @return 편집 결과 (처리 개수 포함)
     */
    LayerEditResultVO editLayer(LayerEditRequestDTO request, String currentUserId);

    /**
     * 업무 레이어 목록을 조회한다.
     *
     * @param request 업무 레이어 조회 조건
     * @param removedGroupCd 조회 제외할 레이어 그룹 코드
     * @return 조회된 업무 레이어 목록
     */
    List<TaskLayerVO> selectTaskLayerList(TaskLayerSearchRequestDTO request, Set<String> removedGroupCd);

    /**
     * 업무 레이어 목록의 전체 건수를 조회한다.
     *
     * @param request        업무 레이어 조회 조건
     * @param removedGroupCd 조회 제외할 레이어 그룹 코드
     * @return 조건에 해당하는 업무 레이어 총 개수
     */
    long selectTaskLayerListTotCnt(TaskLayerSearchRequestDTO request, Set<String> removedGroupCd);

    /**
     * 업무 레이어를 조회한다.
     *
     * @param taskLyrId 업무 레이어 ID
     * @return 업무 레이어
     */
    TaskLayerVO selectTaskLayerById(int taskLyrId);

    /**
     * 항공 사진 레이어 목록을 조회한다.
     *
     * @param request 항공 사진 레이어 조회 조건
     * @return 조회된 항공 사진 레이어 목록
     */
    List<FlightPhotoLyrVO> selectFlightPhotoLayerList(FlightPhotoLayerSearchRequestDTO request, Boolean hasPermission);

    /**
     * 항공 사진 레이어 목록의 전체 건수를 조회한다.
     *
     * @param request 항공 사진 레이어 조회 조건
     * @return 조건에 해당하는 항공 사진 레이어 총 개수
     */
    long selectFlightPhotoLayerListTotCnt(FlightPhotoLayerSearchRequestDTO request, Boolean hasPermission);

    /**
     * 항공 사진 레이어를 조회한다.
     *
     * @param flightLyrId 항공 사진 레이어 ID
     * @return 항공 사진 레이어
     */
    FlightPhotoLyrVO selectFlightPhotoLayerById(int flightLyrId);

    /**
     * 항공 사진 레이어의 사진 압축 파일을 생성하기 전에 검증한다.
     *
     * @param request 항공 사진 레이어 다운로드 요청
     */
    void validateFlightPhotoLayer(FlightPhotoLayerDownloadRequestDTO request);

    /**
     *  WebMapTileServer를 생성하고 검증한다.
     *
     */
    WebMapTileServer createWebMapTileServer() throws ServiceException, IOException;

    /**
     * 항공 사진 레이어의 사진 압축 파일을 생성한다.
     *
     * @param out     OutputStream
     * @param request 항공 사진 레이어 다운로드 요청
     * @param hasPermission 내부 공개 항공 사진 보기 권한 유무
     * @return 압축 파일 InputStream
     */
    void writeFlightPhotoLayerZip(OutputStream out, FlightPhotoLayerDownloadRequestDTO request, Boolean hasPermission, WebMapTileServer wmts) throws IOException, ServiceException;

    /**
     * 등록이력 저장
     * @param schemaName
     * @param tableName
     * @param params
     */
    void insertHistoryAdded(String schemaName, String tableName, Map<String, Object> params);

    /**
     * 수정이력 저장
     * @param schemaName
     * @param tableName
     * @param params
     */
    void insertHistoryModified(String schemaName, String tableName, Map<String, Object> params);

    /**
     * 삭제이력 저장
     * @param schemaName
     * @param tableName
     * @param params
     */
    void insertHistoryDeleted(String schemaName, String tableName, Map<String, Object> params);
}
