package io.renren.common.utils;

import com.jcraft.jsch.*;
import org.apache.commons.net.ftp.FTPClient;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;


public class FTPUtils {

    private static String host;

    private static String username;

    private static String password;

    private static String basePath;

    private static int port;

    private static ChannelSftp sftp;

    private static Channel channel;

    private static boolean key_needed;

    private static String key_location;

    public FTPUtils(String host,String username,String password,String basePath,int port,boolean key_needed,String key_location){
        FTPUtils.host=host;
        FTPUtils.username=username;
        FTPUtils.password=password;
        FTPUtils.basePath=basePath;
        FTPUtils.port=port;
        FTPUtils.key_needed=key_needed;
        FTPUtils.key_location=key_location;
        initFTPUtil();
    }

    public void initFTPUtil(){
        FTPClient ftp=new FTPClient();
        try {
            JSch jsch=new JSch();
            System.out.println("是否需要秘钥"+key_needed);
            if(key_needed){
                jsch.addIdentity(key_location);
            }
            //获取sshSession  账号-ip-端口
            Session sshSession=jsch.getSession(username,host,port);
            //添加密码
            sshSession.setPassword(password);
            Properties sshConfig=new Properties();

            //严格主机密钥检查
            sshConfig.put("StrictHostKeyChecking","no");

            sshSession.setConfig(sshConfig);

            //开启sshSession连接
            sshSession.connect();
            //获取sftp通道
            channel=sshSession.openChannel("sftp");
            channel.connect();

            sftp=(ChannelSftp) channel;

            ftp.enterLocalPassiveMode();
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * Description: 在服务器创建文件夹
     * @param filePath 要创建的文件夹名，创建位置在basePath下
     * @return 成功返回true，否则false
     */
    public static boolean mkdir(String filePath){
        boolean result=false;
        try {
            sftp.cd("/");
            sftp.cd(basePath);
            sftp.mkdir(filePath);

            return true;
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Description: 向FTP服务器上传文件
     * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true，否则false
     */
    public static boolean uploadFile(String filePath,String filename, InputStream input){
        boolean result=false;
        try {
            sftp.cd("/");
            sftp.cd(basePath);
            sftp.cd(filePath);
            sftp.put(input,filename);
            return true;
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Description: 从FTP服务器下载文件
     * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath
     * @return 成功返回true，否则false
     */
    public static InputStream downloadFile(String filePath){
        try {
            InputStream inputStream=sftp.get(filePath);
            return inputStream;
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Description: 判断目录是否存在
     * @param filePath
     * @return
     */
    public static boolean isDirExist(String filePath){
        boolean isDirExistFlag=false;
        try {
            SftpATTRS sftpATTRS=sftp.lstat(basePath+"/"+filePath);
            isDirExistFlag=true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
            if (e.getMessage().toLowerCase().equals("no such file")) {
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }

    /**
     * Description: 删除指定文件夹
     * @param filePath 要删除的文件夹
     * @return 成功返回true，否则false
     */
    public static boolean removeDir(String filePath){
        boolean result=false;
        FTPClient ftp=new FTPClient();
        try {
            JSch jsch=new JSch();
            //获取sshSession  账号-ip-端口
            Session sshSession=jsch.getSession(username,host,port);
            //添加密码
            sshSession.setPassword(password);
            Properties sshConfig=new Properties();

            //严格主机密钥检查
            sshConfig.put("StrictHostKeyChecking","no");
            sshSession.setConfig(sshConfig);

            //开启sshSession连接
            sshSession.connect();
            ChannelExec channelExec = (ChannelExec) sshSession.openChannel("exec");

            String cmd="rm -rf "+basePath+"/"+filePath;
            ((ChannelExec) channelExec).setCommand(cmd);
            channelExec.setInputStream(null);
            ((ChannelExec) channelExec).setErrStream(System.err);
            channelExec.connect(); // 建立连接

            Thread.sleep(2000);

            channelExec.disconnect();
            sshSession.disconnect();


            ftp.enterLocalPassiveMode();
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Description: 显示目标地址下的文件 地址为basePath+filePath
     * @param filePath
     * @return
     */
    public static Vector<ChannelSftp.LsEntry> showFiles(String filePath){
        Vector vector=new Vector();
        try {
            vector=sftp.ls(basePath+"/"+filePath);
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return vector;
    }

}
