package com.eactive.eai.agent.web;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eactive.eai.adapter.socket.common.CommonLib;
import com.eactive.eai.batch.common.BatchDirUtil;
import com.eactive.eai.batch.common.CalendarUtil;
import com.eactive.eai.batch.common.CommonKeys;
import com.eactive.eai.batch.common.LogUtil;
import com.eactive.eai.batch.doc.BatchDoc;
import com.eactive.eai.batch.message.EAIBatchMsgManager;
import com.eactive.eai.batch.osd.OutsideManager;
import com.eactive.eai.batch.osd.OutsideVO;
import com.eactive.eai.batch.scheduler.SchedulerMessageManager;
import com.eactive.eai.batch.scheduler.SchedulerMessageVO;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.DatetimeUtil;
import com.eactive.eai.common.util.Logger;

public class FepReqRecvFile extends HttpServlet{

	private static final long serialVersionUID = 1L;
	Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);

   /**
    * 1. 기능 :  Eai Bat Call
    * 2. 처리 개요 : 요청 메세지를 받아서 처리 후  메세지 리턴.
    * 3. 주의사항
    *
    * @param    request     HttpServletRequest
    * @param    response    HttpServletResponse
    * @return
    * @exception
    **/
    public void service(HttpServletRequest request, HttpServletResponse response) {
        try {
            logger.info("Servlet starting .......");

            String msg = request.getParameter("msg");
            logger.debug("msg["+msg+"]");
            response.setCharacterEncoding("EUC-KR");
            
            if ( msg == null || msg.getBytes().length < 140 ){
                response.setCharacterEncoding("EUC-KR");
                response.getWriter().print(getResMsg(false, "E:메시지 값이 전달되지 않았습니다."));
                return;
            }
            if ( !msg.endsWith("@@") ){
                response.setCharacterEncoding("EUC-KR");
                response.getWriter().print(getResMsg(false, "E:종료문자열이 \"@@\" 이어야 합니다."));
                return;
            }
            
            String trx_id = msg.substring(0, 19).trim();
            logger.debug("trx_id["+trx_id+"]");
            String fileName = msg.substring(38, 138).trim();
            logger.debug("fileName["+fileName+"]");
            
            if ( !trx_id.equals("FEP_REQ_RECV") ){
                response.setCharacterEncoding("EUC-KR");
                response.getWriter().print(getResMsg(false, "E:요청 시작 문자열이 \"FEP_REQ_RECV\" 이어야 합니다."));
                return;
            }
            getFileEventInfo(fileName);
            response.setCharacterEncoding("EUC-KR");
            response.getWriter().print(getResMsg(true, fileName));
            
        } catch (Exception ex) {
            logger.debug(ex.getMessage(), ex);
            try {
                response.getWriter().print(getResMsg(false, "E:" + ex.getMessage()));
                throw ex;
            } catch (Exception e) {
            }
        }
    }
    private String getResMsg( boolean flag, String msg){
        String sFlag = "1";
        if ( flag ) sFlag = "0";
    	String outStr = "FEP_REQ_RECV       " + 
                DatetimeUtil.getCurrentDate() +
                "0000000000" + sFlag + CommonLib.stringFormat(msg, false, ' ', 100) + "@@";
        return outStr;

    }
    
    private void getFileEventInfo(String reqFileName) throws Exception
    {
        // 수신한 파일 정보
        logger.info("[Req Recv File Event] =========================================================================");
        logger.info("[Req Recv File Event] ▶▶▶▶▶▶▶▶▶▶ Local 수신요청 FILE EVENT 발생 !! ◀◀◀◀◀◀◀◀◀◀");
        logger.info("[Req Recv File Event] ※ Event 파일명    : [" + reqFileName        +"]");
        logger.info("[Req Recv File Event] =========================================================================");
        
        String processCode     = reqFileName.substring(0, 5);
        String institutionCode = reqFileName.substring(6, 10);

        logger.info("processCode     = " + processCode);

        logger.info("institutionCode = " + institutionCode);

		//거래구분 코드 설정
		int bizCodeStartIndex = 0;
		int bizCodeEndIndex   = 0;
		OutsideVO organInfo    = OutsideManager.getInstance().getOutsideInfo(processCode, institutionCode);
		if ( organInfo == null ){
			throw new Exception("미등록 업무구분/기관코드:" + processCode + "/" + institutionCode);
		}
		String institutionName = organInfo.getOsdName();
		String processName     = organInfo.getBatchName();
		bizCodeStartIndex      = organInfo.getBizCdStartIdx();
		bizCodeEndIndex        = organInfo.getBizCdEndIdx();
        logger.info("processName     = " + processName);
        
        String fileName = reqFileName.substring(11);

		if (bizCodeStartIndex <= 0 || bizCodeStartIndex >= fileName.length()) bizCodeStartIndex = 0;
		if (bizCodeEndIndex   <= 0 || bizCodeEndIndex   >  fileName.length()) bizCodeEndIndex = fileName.length();
		String bizCode = fileName.substring(bizCodeStartIndex, bizCodeEndIndex);
        
		logger.info("[Req Recv File Event] -------------------------------------------------------------------------");
		logger.info("[Req Recv File Event] ■ File Event 파싱 정보");
		logger.info("[Req Recv File Event] - 업무구분명  : [" + processName      +"] (업무구분코드: "+ processCode     +")");
		logger.info("[Req Recv File Event] - 대외기관명  : [" + institutionName  +"] (대외기관코드: "+ institutionCode +")");
		logger.info("[Req Recv File Event] - 수신파일명  : [" + fileName         +"]");
		logger.info("[Req Recv File Event] - 거래구분코드: [" + bizCode          +"]");
		logger.info("[Req Recv File Event] -------------------------------------------------------------------------");


        /*
         * FileEvent가 SchedulerProcess로 전달할 기본 EAIBatchMsg를 생성한다.
         * FileEventListener가 입력가능한 값들은 EAIBatchMsg의 항목 중 다음과 같다.
         *  - UUID
         *  - Layer 구분 코드 (한시적)
         *  - ProcessCode: 수신한 서브디렉토리와 동일
         *  - FileName : 송수신 원 파일명
         *  - FilePath : 파일이 실재 존재하는 디렉토리
         *  - RenamedFileName : 저장후 이름이 변경된 파일명
         */
        // BatchMsgDoc 생성
		BatchDoc batchMsgDoc = EAIBatchMsgManager.createBatchMsgWithUUID(false);  //UUID 생성, false:초기화안함
		EAIBatchMsgManager.updateBatchMsgWithStageTime(batchMsgDoc, CommonKeys.LAYER_FILE_EVENT, CommonKeys.SUB_LAYER_FILE_EVENT);  // layer, flowPahse, 시작시간 설정
        batchMsgDoc.getBatchMsg().getHeader().setProcessCode(processCode);                     // 업무코드
        batchMsgDoc.getBatchMsg().getHeader().setProcessName(processName);                     // 업무명
        batchMsgDoc.getBatchMsg().getHeader().setProcessType(CommonKeys.PROCESS_REQUEST_RECEIVE); // 업무유형 (요구송신 설정)
        batchMsgDoc.getBatchMsg().getHeader().setInstitutionCode(institutionCode);             // 대외기관코드
        batchMsgDoc.getBatchMsg().getHeader().setInstitutionName(institutionName);             // 대외기관명
        batchMsgDoc.getBatchMsg().getHeader().setFileName(fileName);                           // 원 파일명
        batchMsgDoc.getBatchMsg().getHeader().setBizCode(bizCode);                              // 거래구분코드
        SchedulerMessageVO info = SchedulerMessageManager.getInstance().getRecvScheduleInfo(bizCode, processCode, institutionCode);
		if ( info == null ){
			String errMsg = ExceptionUtil.getErrorCode("BECEAISSC016", new String[] {processCode, institutionCode, bizCode});
			throw new Exception(errMsg);	//해당 정보에 대한 스케쥴 정보가 존재하지 않습니다. (업무코드: {1}, 대외기관코드: {2}, 거래구분코드: {3})
		}
		
		info.setFileName(fileName);
		//1. 요구수신 스케쥴러 단계 DB로그를 위한 BatchMsg 객체 생성
		EAIBatchMsgManager.updateBatchMsgWithStageTime(batchMsgDoc, CommonKeys.LAYER_SCHEDULER, CommonKeys.SUB_LAYER_SCHEDULER_QUEUE);  // layer, flowPahse, 시작시간 설정

		//2. 요구수신 디렉토리 설정 (수신_Real/업무구분/대외기관/..)
		//요구수신 기준 디렉토리 --> 배치업무유형코드(ProcessCode) 와 대외기관코드 (InstitutionCode) 로 계산.
		String strPathName = BatchDirUtil.getResponseRealDir();
		if ( strPathName.charAt(strPathName.length()-1) != '/' ) {
			strPathName = strPathName + '/';
		}


		StringBuffer sb = new StringBuffer();
		sb.append(processCode);
		sb.append("/");
		sb.append(institutionCode);
		strPathName = strPathName + sb.toString();
		info.setFilePath(strPathName);


		//3. UUID 설정 및 스케쥴 송수신 시각 설정
		info.setUUID           (batchMsgDoc.getBatchMsg().getHeader().getUUID());
		info.setSubUUID        (batchMsgDoc.getBatchMsg().getBody().getSubUUID());
		info.setStartTime(DatetimeUtil.getCurrentDate() + "000000000");
		info.setEndTime  (DatetimeUtil.getCurrentDate() + "235900000");

		//4. Job_Queue 테이블에 등록
		logger.info("[요구수신 스케쥴러] =========================================================================");
		logger.info("[요구수신 스케쥴러] ■ 요구수신 스케쥴 정보를 Job_Queue 테이블에 추가......");
		int resultCnt = SchedulerMessageManager.getInstance().insertJobToQueue(info);
		logger.info("[요구수신 스케쥴러] ==> 배치 Job_Queue 테이블 INSERT 건수: "+ resultCnt);
		logger.info("[요구수신 스케쥴러] =========================================================================");

        // 단계 종료시간을 추가한다.
        batchMsgDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());

        // 요구송신에 대한 최초 DB로그. StartLog 호출.
        LogUtil.setStartLog (batchMsgDoc);
        logger.info("[Req Recv File Event] ※ Event 파일명  : [" + fileName        +"]");
		
    }

}