package cokr.xit.fims.cmmn.ftp;

import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class SFTPUtil {

	private ChannelSftp channelSftp = null;
	private Session session = null;

	public boolean connect(RemoteSystemInfo rs) {

		JSch jsch = new JSch();
		Channel channel = null;

		//세션객체 생성
		try {

			session = jsch.getSession(rs.getId(), rs.getIp(), Integer.parseInt(rs.getPort()));

			session.setPassword(rs.getPw());

			//세션관련 설정정보 설정
			java.util.Properties config = new java.util.Properties();
			String kex = session.getConfig("kex");
			String oldKex = "diffie-hellman-group1-sha1,diffie-hellman-group14-sha1";


			config.put("StrictHostKeyChecking", "no"); //호스트 정보 검사하지 않는다.
			config.put("kex", oldKex+","+kex);
			session.setConfig(config);

			session.setTimeout(10000);
			session.connect(); //접속
			channel = session.openChannel("sftp");	//sftp 채널 접속
			channel.connect();
		} catch (NumberFormatException e) {
			throw new RuntimeException("[F] FTP 접속 오류");
		} catch (JSchException e) {
			e.printStackTrace();
			throw new RuntimeException("[F] FTP 접속 오류");
		}
		channelSftp = (ChannelSftp) channel;


		String remoteWorkPath = rs.getWorkPath();
		try {
			channelSftp.cd(remoteWorkPath);
		} catch (SftpException e) {
			throw new RuntimeException("[F] FTP 경로 이동 오류");
		}

		return true;
	}

	public byte[] getBytesObj(String path) {
		InputStream is;
		try {
			is = channelSftp.get(path);
		} catch (SftpException e) {
			if(e.getMessage().equals("No such file")) {
				return null;
			} else {
				throw new RuntimeException("[F] FTP 파일 읽기 오류");
			}
		}

		if(is == null) {
			return null;
		}

		byte[] bytesOfFile;
		try {
			bytesOfFile = is.readAllBytes();
		} catch (IOException e) {
			throw new RuntimeException("[F] FTP 파일 읽기 오류");
		}

		try {
			is.close();
		} catch (IOException e) {
			throw new RuntimeException("[F] FTP 파일 읽기 오류");
		}

		return bytesOfFile;
	}

	public boolean disconnect() {

		session.disconnect();

		return true;
	}
}
