package incheon.ags.mrb.upload.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

@org.egovframe.rte.psl.dataaccess.mapper.Mapper @incheon.com.config.annotation.MainDB public interface IncheonServiceMapper {
	/**
     * user_layers 테이블의 모든 활성 레이어 조회
     */
    List<Map<String, Object>> selectAllUserLayers();
    
    /**
     * layer_id를 기반으로 layer_name 조회
     */
    String selectLayerNameById(Long id);
    
    /**
     * layer_id를 기반으로 layer_type 조회
     */
    String selectLayerTypeById(Long id);
    
    /**
     * layer_id를 기반으로 srid 조회
     */
    String selectSridById(Long id);
    
    /**
     * layer_name을 기반으로 geom 제외한 속성 컬럼 조회
     */
    List<Map<String, Object>> selectColumnsExcludeGeomByLayerName(String layerName);

    /**
     * layer_id를 기반으로 레이어 메타데이터 삭제
     */
    void deleteLayerNameById(Long id);
    
    /**
     * 실제 물리 테이블 DROP (주의: 테이블명은 $ 사용)
     */
    void dropLayerTable(@Param("tableName") String tableName);
    
    // 전체 레이어 수 조회 (페이징용)
    int selectUserLayerCount();

    // 페이징 처리된 레이어 조회 (검색어 없이)
    List<Map<String, Object>> selectUserLayersWithPaging(@Param("offset") int offset, @Param("pageSize") int pageSize);

    // 검색어 포함된 레이어 수 조회
    int selectUserLayerCountByKeyword(@Param("keyword") String keyword);

    // 검색어 포함된 레이어 페이징 조회
    List<Map<String, Object>> selectUserLayersByKeywordWithPaging(@Param("keyword") String keyword, @Param("offset") int offset, @Param("pageSize") int pageSize);
    
    /**
     * 사용자별 레이어 이름 중복 확인
     */
    boolean checkLayerNameExistsForUser(@Param("userId") String userId, @Param("layerName") String layerName);
    
    // ========== 사용자별 레이어 조회 메소드 ==========
    
    /**
     * 특정 사용자의 레이어 수 조회
     */
    int selectUserLayerCountByUserId(@Param("userId") String userId);
    
    /**
     * 특정 사용자의 레이어 페이징 조회
     */
    List<Map<String, Object>> selectUserLayersByUserIdWithPaging(
        @Param("userId") String userId, 
        @Param("offset") int offset, 
        @Param("pageSize") int pageSize
    );
    
    /**
     * 특정 사용자의 레이어 중 검색어 포함된 레이어 수 조회
     */
    int selectUserLayerCountByUserIdAndKeyword(
        @Param("userId") String userId, 
        @Param("keyword") String keyword
    );
    
    /**
     * 특정 사용자의 레이어 중 검색어 포함된 레이어 페이징 조회
     */
    List<Map<String, Object>> selectUserLayersByUserIdAndKeywordWithPaging(
        @Param("userId") String userId, 
        @Param("keyword") String keyword,
        @Param("offset") int offset, 
        @Param("pageSize") int pageSize
    );
    

    
    /**
     * 사용자 레이어 필터링 조회 (그룹, 타입, 검색어 포함)
     */
    List<Map<String, Object>> selectUserLayersWithFilters(Map<String, Object> filterParams);
    
    /**
     * 사용자 레이어 필터링 개수 조회 (그룹, 타입, 검색어 포함)
     */
    int selectUserLayerCountWithFilters(Map<String, Object> filterParams);

    /**
     * 삭제할 테이블의 시퀀스를 참조하는 다른 테이블 목록 조회
     */
    List<Map<String, String>> selectDependentTables(@Param("tableName") String tableName);

    /**
     * 특정 컬럼의 Default 제약조건 삭제 (시퀀스 의존성 제거용)
     */
    void dropColumnDefault(@Param("schema") String schema, @Param("tableName") String tableName, @Param("columnName") String columnName);
}
