package com.cpp.web.utils;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.ssh.Sftp;
import com.cpp.web.domain.datafactory.SftpChannel;
import com.cpp.web.utils.sftp.SftpTool;
import com.jcraft.jsch.ChannelSftp;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.util.Properties;

@Slf4j
public class SftpUtil {

    public static final String CHARSET_NAME = "UTF-8";


    /**
     *
     * sftp 上传文件
     *
     * @param sftp
     * @param destPathName  目标路径
     * @param srcName   源路径
     * @param fileName  上传文件名称
     * @param isDel 是否删除源文件
     */
    public static void upload(
            Sftp sftp,
            String destPathName,
            String srcName,
            String fileName,
            Boolean isDel
    ) {
        try (FileInputStream fis = new FileInputStream(srcName)) {
            File file = new File(srcName);
            sftp.getClient().put(fis, destPathName + "/" + fileName);
            fis.close();
            if (isDel){
                Files.deleteIfExists(file.toPath());
            }
        } catch (Exception e) {
            log.error("上传备份文件异常", e);
        }
    }



    /**
     * 创建sftp 并解析
     *
     * @param sftpChannel sftp通道信息
     * @return sftp控制
     */
    public static SftpTool createSftp(
            SftpChannel sftpChannel
    ) {
        // SFTP方式上报
        SftpTool sftpTool = new SftpTool();

        try {
            sftpTool.setSshSession(sftpTool.getJsch().getSession(sftpChannel.getUsername(), sftpChannel.getIp(), sftpChannel.getPort()));
            sftpTool.getSshSession().setPassword(sftpChannel.getPassword());
            sftpTool.getSshSession().setTimeout(30000);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sftpTool.getSshSession().setConfig(sshConfig);
            log.info("sftp开始连接...");
            sftpTool.getSshSession().connect();
            sftpTool.setChannel((ChannelSftp) sftpTool.getSshSession().openChannel("sftp"));
            sftpTool.getChannel().connect();
            Class cl = ChannelSftp.class;
            Field f = cl.getDeclaredField("server_version");
            f.setAccessible(true);
            f.set(sftpTool.getChannel(), 2);
            sftpTool.getChannel().setFilenameEncoding(CHARSET_NAME);
            sftpTool.setSftp(new Sftp(sftpTool.getChannel(), CharsetUtil.CHARSET_UTF_8));
        } catch (Exception e) {
            log.error("sftp连接异常：" + e);
            if (sftpTool.getSftp() != null) {
                sftpTool.close();
            }
        }
        return sftpTool;
    }

}
