package incheon.ags.mrb.upload.service;

import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;

import org.geotools.api.feature.simple.SimpleFeatureType;
import org.geotools.api.feature.type.GeometryDescriptor;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.databind.JsonNode;

import incheon.ags.mrb.upload.vo.FileUploadRequestDTO;


public interface FileProcessUtilService {
    // ✅ 성능 개선: 1000 → 5000 (SpatialAnalysis 참고)
    public int BATCH_COMMIT_INTERVAL = 5000;
    
    /**
     * 레이어 정보를 생성합니다.
     */
    Map<String, Object> createLayerInfo(FileUploadRequestDTO dto, int srid, String userId, 
                                       String workspacePrefix, String tableName, 
                                       String lyrClsfCd, String spceTy);
    
    /**
     * 고유한 테이블명을 생성합니다.
     */
    String generateUniqueTableName();
    
    /**
     * 좌표계 문자열에서 SRID를 추출합니다.
     */
    int extractSridFromCoordinate(String filecoordinate);
    
    /**
     * 컬럼들을 SQL 문자열로 빌드합니다.
     */
    String buildColumnsSql(List<String> columns);
    
    /**
     * MultipartFile에서 데이터 행들을 추출합니다.
     */
    List<Map<String, String>> extractRowsFromMultipartFile(MultipartFile file, String encoding, 
                                                           List<String> columns, boolean isWKT) throws IOException;
    
    /**
     * WKT에서 공간 타입을 추출합니다.
     */
    String extractSpaceType(String wkt);
    
    /**
     * 임시 디렉토리를 생성합니다.
     */
    Path createTempDirectory() throws IOException;
    
    /**
     * ZIP 파일을 지정된 디렉토리에 압축해제합니다.
     */
    void extractZipFile(MultipartFile zipFile, Path destDir) throws IOException;
    
    /**
     * 디렉토리에서 Shape 파일을 찾습니다.
     */
    Path findShapeFile(Path directory) throws IOException;
    
    /**
     * GeometryDescriptor에서 지오메트리 타입을 가져옵니다.
     */
    String getGeometryType(GeometryDescriptor geomDesc);
    
    /**
     * SimpleFeatureType 스키마에서 컬럼 SQL을 생성합니다.
     */
    String generateColumnsSqlFromSchema(SimpleFeatureType schema);
    
    /**
     * Java 타입을 PostgreSQL 타입으로 변환합니다.
     */
    String getPostgreSQLType(Class<?> javaType);
    
    /**
     * 밀리초를 사람이 읽기 쉬운 시간 형식으로 포맷합니다.
     */
    String formatDuration(long milliseconds);
    
    /**
     * 임시 디렉토리를 정리합니다.
     */
    void cleanupTempDirectory(Path tempDir);
    
    /**
     * MultipartFile을 임시 파일로 저장합니다.
     */
    Path saveMultipartFileToTemp(MultipartFile file, Path tempDir) throws IOException;
    
    /**
     * 첫 번째 Feature에서 컬럼들을 생성합니다.
     */
    String generateColumnsFromFirstFeature(JsonNode firstFeature);
    
    /**
     * GeoJSON에서 지오메트리 타입을 추출합니다.
     */
    String extractGeometryTypeFromGeoJson(JsonNode geometryNode);
    
    /**
     * GeoJSON 지오메트리를 WKT로 변환합니다.
     */
    String convertGeoJsonGeometryToWKT(JsonNode geometryNode);

	List<String> parseCsvLineWithQuotes(String line);
	
	/**
     * CSV 파일의 상위 행을 분석하여 컬럼 타입을 추론하고 CREATE TABLE용 SQL을 생성합니다.
     */
    String detectCsvColumnTypesAndBuildSql(MultipartFile file, String encoding, List<String> targetColumns) throws IOException;
}
