package kr.gmtc.tss.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.springframework.stereotype.Component;

@Component
public class FileUtil {
	
//	@Value("${file-zip-path}")
//	private String fileZipPath;
//	
//	@Value("${file-zip-bak-path}")
//	private String fileZipBakPath;
//	
//	@Value("${file-make-time}")
//	private int fileMakeTime;
	
//	public static String FILE_LOG_NAME;

	/**
	 * 로그파일을 압축한다.
	 * 라이브 데이터 압축을 피하기 위해 20분전 데이터를 압축하는 것으로 세팅
	 */
	public void createZipFile(String fileZipPath, String fileZipBakPath, int fileMakeTime) {
    	
		// 압축파일이 저장될 폴더가 존재하는지 확인
    	File backDir = new File(fileZipBakPath);
    	if(!backDir.exists()) {
    		backDir.mkdirs();
    	}
    	
    	SimpleDateFormat fileFormatter = new SimpleDateFormat("yyyyMMddHHmm");
        Calendar cal = Calendar.getInstance(); 
        cal.add(Calendar.MINUTE, -20); // 20분전 데이터 확인 
        
        String time20 = fileFormatter.format(cal.getTime());

        // 압축할 파일 명 확인.
        String bakFileName = "file."+time20+".log";
        
        String fileName = "";
        ZipOutputStream zip_out = null;
        
        // 압축 파일 명 세팅
        StringBuilder sb = new StringBuilder();
		sb.append(bakFileName);
		sb.append(".zip");
		fileName = sb.toString();
		
		String _path = fileZipPath+"/"+bakFileName;
        
    	File bakFile = new File(_path);
    	
    	// 파일이 존재할 경우에만 실행.
    	if(bakFile.exists()) {
    		if (fileZipPath.charAt(fileZipPath.length() - 1) != '/') {
    			_path = _path + "/";
    		}
    		
    		try {
    			zip_out = new ZipOutputStream(new FileOutputStream(fileZipBakPath+"/"+fileName));
    			zipFolder("", bakFile, zip_out);
    			zip_out.close();
    			
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    			
    		} finally {
    			
    		}
    	} else {
    		System.out.println("파일이 존재하지 않습니다.");
    	}
    }
 
    /**
     * ZipOutputStream를 넘겨 받아서 하나의 압축파일로 만든다.
     * @param parent 상위폴더명
     * @param file 압축할 파일
     * @param zout 압축전체스트림
     * @throws IOException
     */
    private void zipFolder(String parent, File file, ZipOutputStream zout) throws IOException {
        byte[] data = new byte[2048];
        
        int read;
            
        BufferedInputStream instream = new BufferedInputStream(new FileInputStream(file));
 
        ZipEntry zipEntry = new ZipEntry(parent + file.getName());
        zout.putNextEntry(zipEntry);

        while ((read = instream.read(data, 0, 2048)) != -1) {
        	zout.write(data, 0, read);
        }
 
        zout.flush();
        zout.closeEntry();
        instream.close();
        
        file.delete(); // 파일 삭제

    }
    
    private void bakFileDelete(String fileZipPath, String date) throws IOException {
        File folder = new File(fileZipPath+"/"+date); // file 생성
        
        try {
	        while(folder.exists()){
	            File[] files = folder.listFiles();
	
	            for(File file : files){
	                file.delete(); // 하위 파일 삭제
	            }

	            // 폴더 삭제
	            if(files.length == 0 && folder.isDirectory()){ // 하위 파일이 없는지와 폴더인지 확인 후 폴더 삭제
	            	folder.delete(); // 대상폴더 삭제
	            }
	        }
	        
	    } catch(Exception e) {
	        e.printStackTrace();
	    }
	}

	/**
	 * 로그파일을 생성하는 함수
	 */
	public String createLogFile(String fileZipPath, String fileZipBakPath, int fileMakeTime) {
    	File fileDir = new File(fileZipPath);
    	if(!fileDir.exists()) {
    		fileDir.mkdirs();
    	}
		// 현재 시각 중에 분을 구해온다. (minute)
		SimpleDateFormat formatter = new SimpleDateFormat("mm");
		String _path = "";
		
		Date now = new Date();
		String nowTime = formatter.format(now);
        int time = Integer.parseInt(nowTime);
        String nowT = "";
        
        // 현재 분이 설정한 값의 배수인지 확인한다.
        if(time%fileMakeTime == 0){
        	if(time == 0) {
        		nowT = "00";
        	}else{
        		nowT = String.valueOf(time);
        	}
        }else{
        	if(time < fileMakeTime) {
        		nowT = "00";
        	}else{
        		nowT = nowTime.substring(0, 1)+"0";
        	}
        }
        
        // 생성할 파일명을 설정한다.
        SimpleDateFormat fileFormatter = new SimpleDateFormat("yyyyMMddHH");
        String fileTime = fileFormatter.format(now) + nowT;
        
        try {
        	_path = fileZipPath+"/file."+fileTime+".log";
        	
        	// static 변수에 값을 세팅한다.
        	//FILE_LOG_NAME = _path;
        	
        	File file = new File(_path);
        	File parentDir = file.getParentFile();
        	if (!parentDir.exists()) {
                parentDir.mkdirs(); 
            }
        	
            if (file.createNewFile()) {
                System.out.println("파일 생성 완료");
            } else {
                System.out.println("파일 이미 존재");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return _path;
	}
	
	/**
	 * 파일에 메세지를 쓰는 함수
	 * @param msg
	 * @throws Exception
	 */
	public static void writeLogFile(String msg, String fileName) throws Exception{
		// File file = new File(FILE_LOG_NAME);
		File file = new File(fileName);
		
		// 파일이 존재할 경우에만 실행
		if(file.exists()) {
			FileWriter fw;
			try {
				fw = new FileWriter(file, true);
				fw.write(msg);
				fw.close();	
			} catch (IOException e) {
				e.printStackTrace();
			}    
		}else {
			System.out.println("파일 없음 파일명 확인 필요.");
		}
	}
}
