package com.chinacreator.process.util.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.Calendar;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;


public class FtpUtil {
	
	private Log logger = LogFactory.getLog(FtpUtil.class);   
	
	private FTPClient ftpClient = null;
	
	private String errorcode="0000";
	private String errorinfo="OK";
	
	 /**
     * 获取FTPClient对象
     * 
     * @param ftpHost
     *            FTP主机服务器
     * @param ftpPassword
     *            FTP 登录密码
     * @param ftpUserName
     *            FTP登录用户名
     * @param ftpPort
     *            FTP端口 默认为21
     * @return
     */
    private FTPClient connectFTP(String host, String user, String pwd, int port) {
        try {
        	ftpClient = new FTPClient();
            ftpClient.connect(host, port);// 连接FTP服务器
            ftpClient.login(user, pwd);// 登陆FTP服务器
            int reply = ftpClient.getReplyCode();   
            //ftpClient.setDataTimeout(120000); 
            if (!FTPReply.isPositiveCompletion(reply)) {
            	logger.debug("FTP服务"+host+"拒绝连接！");   
                ftpClient.disconnect();
            } else {
                return ftpClient;
            }
        } catch (SocketException e) {
            e.printStackTrace();
            logger.info("登录ftp服务器 " + host + " 失败,连接超时！");   
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("登录ftp服务器 " + host + " 失败，FTP服务器无法打开！");   
        }
        return null;
    }
    
    /**  
    * 关闭连接  
    */   
   private void closeConnect() {   
       try {   
           if (ftpClient != null) {   
               ftpClient.logout();   
               ftpClient.disconnect();   
           }   
       } catch (Exception e) {   
           e.printStackTrace();   
       }   
   }   
    
   
   /**
    * 上传对账文件
    * 
    * @param url
    * @param user
    * @param pwd
    * @param port
    * @param ftppath
    * @param filepath
    * @param filenames
    * @return
    */
   public boolean UpBillFiles(String url,String user,String pwd,String port,String ftppath,String filepath,String filenames){
	   try {
		   //链接FTP
		   int p = Integer.parseInt(port);
		   FTPClient client = this.connectFTP(url, user, pwd, p);
		   if(client == null){
			   errorcode = "0101";
			   errorinfo = "FTP服务器连接失败";
			   return false;
		   }
		   
		   
		   //进入对应目录
		   if(ftppath!=null && !"".equals(ftppath.trim())){
			   String paths [] = ftppath.split("/");
			   for(String fpath:paths){
				   boolean dirFlag = client.changeWorkingDirectory(fpath);
				   if(!dirFlag){
					   dirFlag = client.makeDirectory(fpath);   
					   if(dirFlag){
						   dirFlag = client.changeWorkingDirectory(fpath);
					   }
					   if(!dirFlag){
						   logger.info("FTP服务器 " + url + "目录"+ftppath+"不存在，且创建失败！");   
						   errorcode = "0201";
						   errorinfo = "进入FTP服务器目录"+ftppath+"失败";
						   return false;
					   }
				   }
			   }
		   }
		   
		   //对账文件保存路径
		   if(filepath == null || "".equals(filepath.trim()) || filenames == null || "".equals(filenames.trim())){
			   logger.info("文件目录或文件名异常");   
			   errorcode = "0301";
			   errorinfo = "文件目录或文件名异常";
			   return false;
		   }
		   
		   //上传文件
		   client.setFileType(FTP.BINARY_FILE_TYPE);
		   String [] fnames = filenames.split(",");
		   for(String fname :fnames){
			   File billfile = new File(filepath+fname);
			   if(!billfile.exists()){
				   logger.info("文件"+filepath+fname+"不存在");   
				   errorcode = "0302";
				   errorinfo = "文件"+filepath+fname+"不存在";
				   return false;
			   }
			   FileInputStream input=new FileInputStream(billfile);
			   client.enterLocalPassiveMode();
			   boolean flag = client.storeFile(fname, input);
			   if(!flag){
				   logger.info("上传文件"+filepath+fname+"失败");   
				   errorcode = "0303";
				   errorinfo = "上传文件"+filepath+fname+"失败";
				   return false;
			   }
		   }
		   
		   //关闭ftp
		   this.closeConnect();
		   
		   return true;
	   } catch (Exception e) {
		   e.printStackTrace();
	   }
	   
	   errorcode = "8888";
	   errorinfo = "系统异常";
	   return false;
   }
   
   
   
   public String getErrorcode() {
	   return errorcode;
   }
   
   public void setErrorcode(String errorcode) {
	   this.errorcode = errorcode;
   }
   
   public String getErrorinfo() {
	   return errorinfo;
   }
   
   public void setErrorinfo(String errorinfo) {
	   this.errorinfo = errorinfo;
   }
   
	public static void main(String[] args) {  
    	try {
//    		 String paths [] = "tencents/201905".split("/");
//    		 System.out.println(paths[0]);
//    		 System.out.println(paths[1]);
    		
//    		Calendar cal = Calendar.getInstance();
//    		int day = cal.get(Calendar.DAY_OF_MONTH);
//    		int hour = cal.get(Calendar.HOUR_OF_DAY);
//    		
//    		 System.out.println(day);
//    		 System.out.println(hour);
    		
    		
    		 String AppSecret = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAp8iizhCSw53AIbIpRN6LQ2IAybTtYaBA0C/1mqmifd+IrAPbTuPh/6R/6f4Y9Vu0b/s8oECIwJ7yCy0NFLEcAwIDAQABAkBPidGEFl881J+sWaUuvMEQJHlzJY4S5cFT8ChiNWCOgpAey5sfh3I0JLvr8IMLu2FJr5RzzCQuCvezf8CB845hAiEA4tot/J3V9D/hLwotQ2GzZQORH/15g3wzobvepB28qk0CIQC9V4X1ij1HI84gUZcH55YkEoaJ5zr5UVi1vX71wW1njwIhALJA8MvEln9zxpU48PI2jkl8sQerHFWWPdgDkOHyv/ItAiAT6VxhEgSXsqA+rdXgMu6LJJeZcQO2rGNT2XW8inbi6QIhAKEG9c5ftAkikKmS8gXy4yc/4AY2+M/yzDGuf+cgO9Xd";
    		String AppSecret2= "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAp8iizhCSw53AIbIpRN6LQ2IAybTtYaBA0C/1mqmifd+IrAPbTuPh/6R/6f4Y9Vu0b/s8oECIwJ7yCy0NFLEcAwIDAQABAkBPidGEFl881J+sWaUuvMEQJHlzJY4S5cFT8ChiNWCOgpAey5sfh3I0JLvr8IMLu2FJr5RzzCQuCvezf8CB845hAiEA4tot/J3V9D/hLwotQ2GzZQORH/15g3wzobvepB28qk0CIQC9V4X1ij1HI84gUZcH55YkEoaJ5zr5UVi1vX71wW1njwIhALJA8MvEln9zxpU48PI2jkl8sQerHFWWPdgDkOHyv/ItAiAT6VxhEgSXsqA+rdXgMu6LJJeZcQO2rGNT2XW8inbi6QIhAKEG9c5ftAkikKmS8gXy4yc/4AY2+M/yzDGuf+cgO9Xd";
    		
    		 System.out.println(AppSecret.equals(AppSecret2));
    		
    	} catch (Exception e) {
			e.printStackTrace();
		}
    }  
}
