package pwc.taxtech.atms.common.ftp;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pwc.taxtech.atms.exception.ServiceException;

import java.io.IOException;

public class WrapFtpClient implements AutoCloseable {
    private static Logger logger = LoggerFactory.getLogger(WrapFtpClient.class);
    FTPClient ftpClient;
    GenericObjectPool<FTPClient> pool;

    public WrapFtpClient(FtpConfig config) throws Exception {
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(config.getFtpHost(), config.getFtpPort());
        int reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftpClient.disconnect();
            logger.warn("FTPServer refused connection");
            throw new ServiceException("FTPServer refused connection");
        }
        boolean result = ftpClient.login(StringUtils.defaultString(config.getFtpUser()),
                StringUtils.defaultString(config.getFtpPwd()));
        if (!result) {
            throw new ServiceException("ftpClient登陆失败! userName:" + config.getFtpUser() + " ; password:" + config.getFtpPwd());
        }
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.setBufferSize(1024);
        ftpClient.setControlEncoding("UTF-8");
        ftpClient.enterLocalPassiveMode();
        this.ftpClient = ftpClient;
    }


    @Override
    public void close() throws Exception {
        try {
            if (ftpClient != null && ftpClient.isConnected()) {
                logger.debug("destroy ftp client {}", ftpClient.toString());
                ftpClient.logout();
            }
        } finally {
            try {
                if (ftpClient != null && ftpClient.isConnected())
                    ftpClient.disconnect();
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
    }
}