package com.eactive.eai.batch.job.jobComm;

import java.io.File;

import com.eactive.eai.batch.job.jobHandle.JobFinishHandler;

import com.eactive.eai.adapter.ftp.Transfer;
import com.eactive.eai.batch.common.CalendarUtil;
import com.eactive.eai.batch.common.CommonKeys;
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.Logger;

public class OutboundFTPHandle {

	private BatchDoc            batchDoc;
	private String              logHeader;
	private String              strUUID;
	private Logger       logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
	
    public void proc( BatchDoc recvBatchDoc ){
    	batchDoc = recvBatchDoc;
    	logger = recvBatchDoc.getLogger();
    	init();
    	try {
    		callScript();
			closeAndRemove();
		} catch (Exception e) {
			handleException(e);
		}
    	
    }
    private void init()
    {
        batchDoc.getBatchMsg().getBody().setPhaseStartTime(CalendarUtil.getCurrentTimeNoDash());

		logHeader = "["+ batchDoc.getBatchMsg().getHeader().getUUID() +" / "+
		                 batchDoc.getBatchMsg().getHeader().getProcessCode() +" / "+
		                 batchDoc.getBatchMsg().getHeader().getInstitutionName() +" / "+
		                 batchDoc.getBatchMsg().getHeader().getProcessType() +" / "+
		                 batchDoc.getBatchMsg().getHeader().getFileName() +" / "+
		                 batchDoc.getBatchMsg().getHeader().getRuleCode() +"] [OutboundFTPHandle] ";

		strUUID = batchDoc.getBatchMsg().getHeader().getUUID();

        logger.info("{"+logHeader+"} start OutboundFTPHandle ... " );
        logger.info("{"+logHeader+"} [JUNGFOX]################ 요구송수신 FTP 핸들러 시작 BatchMessageDoc: \n"+ batchDoc.toString());
        logger.info("{"+logHeader+"} >> BatchRunningJobManager 등록시작 ");
        BatchRunningJobManager.getInstance().addRunningJobInfo(strUUID, null, batchDoc);
        logger.info("{"+logHeader+"} >> BatchRunningJobManager 등록완료 ");

    }
    
	public void callScript() throws Exception {
        logger.info("[OutboundFTPHandle] =========================================================================");
        String dirPath  = batchDoc.getBatchMsg().getHeader().getFilePath();
        String fileName = batchDoc.getBatchMsg().getHeader().getFileName();
        String renamedFileName = batchDoc.getBatchMsg().getHeader().getRenamedFileName();
        String processType = batchDoc.getBatchMsg().getHeader().getProcessType();
        if ( processType.equalsIgnoreCase("RS") ){
        	File file = new File( dirPath + File.separatorChar + renamedFileName);
        	if ( !file.exists()){
        		throw new Exception();
        	}
        	long fileLen = file.length();
        	batchDoc.getBatchMsg().getHeader().setFileSize( fileLen );
        	logger.info("[OutboundFTPHandle] ※ 송신 디렉토리  : [" + dirPath         +"]");
        	logger.info("[OutboundFTPHandle] ※ 송신 파일명     : [" + fileName        +"]");
        	logger.info("[OutboundFTPHandle] ※ 송신 파일크기  : [" + fileLen         +"]");
        	logger.info("[OutboundFTPHandle] =========================================================================");
        	
        	//VAN사 제공 모듈을 이용하여 로컬의 송신_Arch 에 있는 파일을 해당 밴사로 전송
        	try {
        		logger.info("FTP 스크립트가 호출되었습니다.");
        		Transfer.sendFileByEvent(batchDoc);
        	} catch (Throwable t) {
        		String errMsg = ExceptionUtil.getErrorCode(t, "BECEAIFJC008" );
        		throw new Exception(errMsg);  //VAN사 송수신 모듈 이용 전송 시 오류가 발생하였습니다.
        	}
        	new JobFinishHandler(batchDoc).handleSuccessEnd();
        } else if ( processType.equalsIgnoreCase(CommonKeys.PROCESS_REQUEST_RECEIVE) ){
        	logger.info("[OutboundFTPHandle] ※ 수신 디렉토리  : [" + dirPath         +"]");
        	logger.info("[OutboundFTPHandle] ※ 수신 파일명     : [" + fileName        +"]");
        	logger.info("[OutboundFTPHandle] =========================================================================");
        	
        	//VAN사 제공 모듈을 이용하여 로컬의 송신_Arch 에 있는 파일을 해당 밴사로 전송
        	try {
        		logger.info("FTP 스크립트가 호출되었습니다.");
        		Transfer.recvFileByEvent(batchDoc);
        	} catch (Throwable t) {
        		String errMsg = ExceptionUtil.getErrorCode(t, "BECEAIFJC008" );
        		throw new Exception(errMsg);  //VAN사 송수신 모듈 이용 전송 시 오류가 발생하였습니다.
        	}
        	new JobFinishHandler(batchDoc).handleSuccessEnd();
        } else {
        }
		
    }
    private void closeAndRemove() throws Exception
    {
        logger.info("{"+logHeader+"} >> BatchRunningJobManager 에서 Socket 연결정보 제거 시작......");
        BatchRunningJobManager.getInstance().removeRunningJobInfo(strUUID);
        logger.info("{"+logHeader+"} >> BatchRunningJobManager Socket 연결정보 제거 완료.");
    }

    private void handleException(Exception ex)
    {
        try {
            if (BatchRunningJobManager.getInstance().isSocketClosed(strUUID) == false) BatchRunningJobManager.getInstance().closeRunningSocket(strUUID);

        } catch (Exception e) {
            logger.error("{"+logHeader+"} ★★★★★ OutboundFTPHandle JPD 예외 처리 중 에러 !! ★★★★★ \r\n"+ e.getMessage());
        }
        try {
            if (BatchRunningJobManager.getInstance().isJobRunning(strUUID) == true) BatchRunningJobManager.getInstance().removeRunningJobInfo(strUUID);

        } catch (Exception e) {
            logger.error("{"+logHeader+"} ★★★★★ OutboundFTPHandle JPD 예외 처리 중 에러 !! ★★★★★  \r\n" + e.getMessage());
        }

        try {
            // 파일로그 처리
            String errMsg = ExceptionUtil.getErrorCode(ex, "BECEAIFJC005");
            logger.error("{"+errMsg+"} {"+logHeader+"} \r\n"+ex.getMessage());

            // DB로그 처리
			new JobFinishHandler(batchDoc).handleErrorEnd(errMsg);

        } catch (Exception e) {
            logger.error("{"+logHeader+"} ★★★★★ OutboundFTPHandle JPD 예외 처리 중 에러 !! ★★★★★ \r\n" + e.getMessage());
        }
    }
}