package com.eactive.eai.adapter.ftp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPFile;

import com.eactive.eai.adapter.socket.config.ConfigurationContext;
import com.eactive.eai.adapter.socket.service.SocketService;
import com.eactive.eai.batch.common.CalendarUtil;
import com.eactive.eai.batch.common.LogUtil;
import com.eactive.eai.batch.common.StringUtil;
import com.eactive.eai.batch.doc.BatchDoc;
import com.eactive.eai.batch.running.BatchRunningJobManager;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.DatetimeUtil;

// 신용회복 위원회 파일 수신 ( FTP )
// IP : 114.108.166.14 PORT : 21 PASSIVE 방식
// ID : kjbk_ccrs PWD: ccrskjbk!@#
// 파일명: SNTFTP.${YYYYMMDD}.tar.gz

public class FTPCC extends Transfer implements SocketService{

	public void sendFile(BatchDoc batchDoc) throws Exception {
		throw new Exception("해당 Component 에 의한 FTP 송신이 구현되지 않았습니다.");
	}

	public void recvFile(BatchDoc batchDoc) throws Exception {
		logger.info("[FTPCC] ■ 대외기관→FEP 파일 수신 시작...... ");
		firstActivity = System.currentTimeMillis();
		setLastActivity();
		BatchRunningJobManager.getInstance().addRunningJobInfo( batchDoc.getBatchMsg().getHeader().getUUID(), this, batchDoc);
		//2. System FTP Shell 명령어를 Runtime 으로 실행
		try {
			
			String ipaddress = batchDoc.getBatchMsg().getHeader().getRemoteIP();
			String port      = batchDoc.getBatchMsg().getHeader().getPort();
			String userid    = batchDoc.getBatchMsg().getHeader().getUserID();
			String passwd    = batchDoc.getBatchMsg().getHeader().getUserPassword();
			if (ftpClient == null || !ftpClient.isConnected()) this.connect(ipaddress, Integer.parseInt(port) );
			ftpClient.login(userid, passwd);
			ftpClient.enterLocalPassiveMode();
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			setLastActivity();
			
			logger.debug( "[FTPCC]FileName:" + batchDoc.getBatchMsg().getHeader().getFileName());
			String reqFileName = batchDoc.getBatchMsg().getHeader().getFileName();
			String baseDate = DatetimeUtil.getCurrentDate();
			if ( reqFileName != null && reqFileName.length() > 8 ){
				if ( DatetimeUtil.isRightDate(reqFileName.substring(reqFileName.length() - 8 )) ){
					baseDate = reqFileName.substring(reqFileName.length() - 8 );
					batchDoc.getBatchMsg().getHeader().setBaseDate(baseDate);
				}
			}
			
			reqFileName = batchDoc.getBatchMsg().getHeader().getBizCode() + "." + baseDate + ".tar.gz";

			ftpClient.setDataTimeout(600*1000);
			ftpClient.setConnectTimeout(300);
			
			FTPFile[] files = ftpClient.listFiles();
			setLastActivity();
			
			for (int inx = 0; inx < files.length; inx++) {
				
				if ( !files[inx].isFile() || !files[inx].getName().equals(reqFileName) ) continue;
				FileOutputStream fos = null;

	            batchDoc.getBatchMsg().getHeader().setFileName(reqFileName);
				batchDoc.getBatchMsg().getHeader().setFileSize(files[inx].getSize());
				
				batchDoc.getBatchMsg().getHeader().setTotRecCnt(1);
				String recvFile = batchDoc.getBatchMsg().getHeader().getFilePath() + File.separator +  reqFileName;
				File rcvRealFile = new File( recvFile );
				File rcvChkFile = new File( StringUtil.realToRootDir(recvFile) );
				
    			batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash());
				LogUtil.setLogFileStart(batchDoc);
				try {
					fos = new FileOutputStream( rcvRealFile );
					ftpClient.retrieveFile(reqFileName, fos);
					setLastActivity();
				} catch (Exception e) {
					setLastActivity();
					logger.error(e.getMessage(), e);
					throw new Exception("파일수신에 실패하였습니다. -" + e.getMessage());
				} finally {
					fos.close();
				}
				
				try {
					File rcvArchFile = new File( StringUtil.realToArchDir(recvFile) );
		            if (rcvRealFile.exists() && rcvRealFile.length() == batchDoc.getBatchMsg().getHeader().getFileSize() ) {
		                rcvRealFile.renameTo(rcvArchFile);
		    			rcvChkFile.createNewFile();
		            }else{
		            	throw new Exception("파일수신에 실패하였습니다.");
		            }
		           
				} catch (Exception e) {
					throw e;
					
				}
                //File 종료시간 설정
    			batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
				LogUtil.setLogFileEnd(batchDoc);
				break;
			}
        } catch(Exception ex) {
            String[] msgArgs = new String[1];
            msgArgs[0] = batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI002";
            String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
            batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
			batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
            LogUtil.setErrorLog(batchDoc, ex.getMessage());
            logger.error( errMsg, ex );
            throw ex;
		} finally {
			this.disconnect();
        }
		logger.info("[FTPCC] ■ VAN사 → FEP 파일 수신 완료.");		
	}

	@Override
	public void shutdown() {
		disconnect();
	}

	@Override
	public Socket getCurrentSocket() {
		return null;
	}

	@Override
	public boolean connect() {
		return false;
	}

	@Override
	public ConfigurationContext getContext() {
		return null;
	}

	@Override
	public void setControl(Object control) {
		
	}

	@Override
	public void notifyMessage() {
		
	}

	@Override
	public boolean idle(long timeout) {
		return false;
	}

	@Override
	public int getCurrentState() {
		return 0;
	}

	@Override
	public boolean isConnected() throws IOException {
		return false;
	}

	@Override
	public boolean isActive() {
		return false;
	}

	@Override
	public void checkActivity() {
		
	}

	@Override
	public String getRemoteIPAddress() {
		return null;
	}

	@Override
	public void setLastActivity() {
		lastActivity = System.currentTimeMillis();
	}

	@Override
	public long getFirstActivity() {
		return firstActivity;
	}

	@Override
	public long getLastActivity() {
		return lastActivity;
	}
}