package incheon.product.geoview3d.traffic.mapper;

import incheon.com.config.annotation.ExternalDB;
import incheon.product.geoview3d.traffic.vo.CctvRowVO;
import incheon.product.geoview3d.traffic.vo.TrafficRowVO;
import org.apache.ibatis.annotations.Param;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

/**
 * 교통/CCTV 정보 매퍼.
 * 외부 DB(ExternalDB)를 통해 교통 스냅샷 및 CCTV 데이터를 관리한다.
 */
@Mapper("productTrafficMapper")
@ExternalDB
public interface TrafficMapper {

    // ========== 교통 정보 ==========

    /** 최신 교통 스냅샷 수집 시각 조회 */
    Timestamp findLatestCreatedTs();

    /** bbox 범위 내 링크별 교통 등급 조회 */
    List<Map<String, Object>> selectLinkGradesInBbox(@Param("roadType") String roadType,
                                                      @Param("minX") double minX,
                                                      @Param("minY") double minY,
                                                      @Param("maxX") double maxX,
                                                      @Param("maxY") double maxY);

    /** 교통 스냅샷 일괄 upsert */
    void upsertSnapshotBatch(@Param("rows") List<TrafficRowVO> rows,
                             @Param("LOGIN_USER_ID") String loginUserId);

    /** 최신 교통 정보 일괄 upsert */
    void upsertLatestBatch(@Param("rows") List<TrafficRowVO> rows,
                           @Param("LOGIN_USER_ID") String loginUserId);

    /** 오래된 교통 스냅샷 삭제 */
    void deleteOldSnapshots();

    // ========== CCTV 정보 ==========

    /** 최신 CCTV 스냅샷 수집 시각 조회 */
    Timestamp findLatestCreatedCctvTs();

    /** bbox 범위 내 CCTV 목록 조회 */
    List<Map<String, Object>> selectCctvList(@Param("gid") Long gid,
                                              @Param("minX") double minX,
                                              @Param("minY") double minY,
                                              @Param("maxX") double maxX,
                                              @Param("maxY") double maxY);

    /** CCTV 스냅샷 일괄 upsert */
    void upsertCctvSnapshotBatch(@Param("rows") List<CctvRowVO> rows,
                                 @Param("LOGIN_USER_ID") String loginUserId);

    /** 최신 CCTV 정보 일괄 upsert */
    void upsertCctvLatestBatch(@Param("rows") List<CctvRowVO> rows,
                               @Param("LOGIN_USER_ID") String loginUserId);

    /** 오래된 CCTV 스냅샷 삭제 */
    void deleteOldCctvSnapshots();

    // ========== 도로명 검색 ==========

    /** 도로명 목록 조회 (페이징) */
    List<Map<String, Object>> selectRoadNames(@Param("roadType") String roadType,
                                               @Param("searchName") String searchName,
                                               @Param("offset") int offset,
                                               @Param("size") int size);

    /** 도로명 검색 건수 */
    int selectRoadNameCount(@Param("roadType") String roadType,
                            @Param("searchName") String searchName);

    /** 도로명에 해당하는 링크 목록 조회 */
    List<Map<String, Object>> selectLinksByRoadName(@Param("roadName") String roadName);
}
