package com.eactive.eai.batch.scheduler;

import java.util.ArrayList;
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.flowController.BatchTargetVO;
import com.eactive.eai.batch.flowController.FlowControllerManager;
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 ScheduleRecvProcess{

	//파일로거
    private static Logger logger = Logger.getLogger(Logger.LOGGER_SCHEDULER);

	public BatchDoc clientRequestwithReturn(
			BatchDoc batchDoc) throws Exception {
		return null;
	}

	public void clientRequest() throws Exception {
		try {
			logger.info("[요구수신 스케쥴러] ============================================================================================");
			logger.info("[요구수신 스케쥴러] ■ Schedule 테이블에서 현재시간에 진행할 요구수신 스케쥴 정보를 조회......");

			//Schedule 테이블 에서 현재시간에 걸리는 요구수신 작업을 조회
			//대기 및 진행목록에 존재하거나 재시도 회수가 초과된 작업은 걸러짐
			ArrayList<SchedulerMessageVO> executeJobList = SchedulerMessageManager.getInstance().getExecutableRecvScheduleList();
			logger.info("[요구수신 스케쥴러] ※ 요구수신 진행 작업 건수: "+ ((executeJobList == null)? 0 : executeJobList.size()));
			logger.info("[요구수신 스케쥴러] ============================================================================================");
			
			for (SchedulerMessageVO info : executeJobList) {
				BatchDoc batchDoc = regJobQueue(info);
				loggingToDB(batchDoc);
			}
			

		} catch (Exception e) {
			catchException(e);
		}

	}

    private BatchDoc regJobQueue(SchedulerMessageVO info) throws Exception
    {
    	//1. 요구수신 스케쥴러 단계 DB로그를 위한 BatchMsg 객체 생성
    	BatchDoc batchMsgDoc = EAIBatchMsgManager.createBatchMsgWithUUID(false);  //UUID 생성, false:초기화안함
    	try {
    		
			logger.info("[요구수신 스케쥴러] =========================================================================");
			logger.info("[요구수신 스케쥴러] ■ 요구수신 스케쥴 정보.");
			logger.info("[요구수신 스케쥴러] - 스케쥴코드    : " + info.getScheduleCode());
			logger.info("[요구수신 스케쥴러] - 시작시간(시분): " + info.getStartTime());
			logger.info("[요구수신 스케쥴러] - 종료시간(시분): " + info.getEndTime());
			logger.info("[요구수신 스케쥴러] =========================================================================");
	
			EAIBatchMsgManager.updateBatchMsgWithStageTime(batchMsgDoc, CommonKeys.LAYER_SCHEDULER, CommonKeys.SUB_LAYER_SCHEDULER_QUEUE);  // layer, flowPahse, 시작시간 설정
	
	        batchMsgDoc.getBatchMsg().getHeader().setProcessCode(info.getProcessCode());
			batchMsgDoc.getBatchMsg().getHeader().setProcessType(info.getProcessType());
	        batchMsgDoc.getBatchMsg().getHeader().setInstitutionCode(info.getInstitutionCode());
			batchMsgDoc.getBatchMsg().getHeader().setJobCode(info.getJobCode());
			batchMsgDoc.getBatchMsg().getHeader().setBizCode(info.getBizCode());
			batchMsgDoc.getBatchMsg().getHeader().setScheduleCode(info.getScheduleCode());
			batchMsgDoc.getBatchMsg().getHeader().setScheduleSTime(info.getStartTime());
			batchMsgDoc.getBatchMsg().getHeader().setScheduleETime(info.getEndTime());
			batchMsgDoc.getBatchMsg().getBody().setRetryCount(info.getRecvFailCnt());  //요구수신 재시도회수
	
			//2. 요구수신 디렉토리 설정 (수신_Real/업무구분/대외기관/..)
			//요구수신 기준 디렉토리 --> 배치업무유형코드(ProcessCode) 와 대외기관코드 (InstitutionCode) 로 계산.
			String strPathName = BatchDirUtil.getResponseRealDir();
			if ( strPathName.charAt(strPathName.length()-1) != '/' ) {
				strPathName = strPathName + '/';
			}
	
			//해당 업무구분코드의 대외가관 목록 조회
			ArrayList<OutsideVO> osd_array = OutsideManager.getInstance().getOutsideInfo(info.getProcessCode());
			logger.debug("배치유형코드 [" + info.getInstitutionCode() + "] 대외기관 코드 개수 ["+ osd_array.size() + "]");
			int i=0;
			for (i=0; i<osd_array.size(); i++) {
				OutsideVO tmpVO = (OutsideVO) osd_array.get(i);
				if (tmpVO.getOsdCode().equalsIgnoreCase(info.getInstitutionCode())) {
					break;
				}
			}
	
			//요구수신 작업의 대외기관 정보가 없는 경우
			if (i==osd_array.size()) {
				String errMsg = "[ScheduleRecvProcess] 대외기관 정보를 구할 수  없습니다.  배치업무코드 [" + info.getProcessCode()+"] ";
				logger.error(errMsg);
				batchMsgDoc.getBatchMsg().getBody().setErrorCode(99);
				batchMsgDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
				//<------------------ 에러로그 기록
	
			//요구수신 작업의 대외기관 정보가 있는 경우, 요구수신 디렉토리 설정
			} else {
				
					OutsideVO outside = (OutsideVO) osd_array.get(i);
					BatchTargetVO btVO = FlowControllerManager.getInstance().getBatchTargetInfo(outside.getBatchCode(), outside.getOsdCode());
					StringBuffer sb = new StringBuffer();
					sb.append(btVO.getProcessCode());
					sb.append("/");
					sb.append(btVO.getOrganCode());
					strPathName = strPathName + sb.toString();
	
	
			}
	
			info.setFilePath(strPathName);
	
	
			//3. UUID 설정 및 스케쥴 송수신 시각 설정
			info.setUUID           (batchMsgDoc.getBatchMsg().getHeader().getUUID());
			info.setSubUUID        (batchMsgDoc.getBatchMsg().getBody().getSubUUID());
			if (!info.getStartTime().equals("")) info.setStartTime(DatetimeUtil.getCurrentDate() + info.getStartTime() +"00" + "000");
			if (!info.getEndTime()  .equals("")) info.setEndTime  (DatetimeUtil.getCurrentDate() + info.getEndTime()   +"00" + "000");
	
			//4. Job_Queue 테이블에 등록
			logger.info("[요구수신 스케쥴러] =========================================================================");
			logger.info("[요구수신 스케쥴러] ■ 요구수신 스케쥴 정보를 Job_Queue 테이블에 추가......");
			int resultCnt = SchedulerMessageManager.getInstance().insertJobToQueue(info);
			logger.info("[요구수신 스케쥴러] ==> 배치 Job_Queue 테이블 INSERT 건수: "+ resultCnt);
			logger.info("[요구수신 스케쥴러] =========================================================================");
	
			//logger.debug("=========================================================================");
			//logger.debug("[요구수신 스케쥴러] 생성된 EAIBatchMsgDoc 디버깅용 Printing......\n"+ batchMsgDoc);
			//logger.debug("=========================================================================");
			return batchMsgDoc;
		
		}catch(Exception e){
			logger.error("[요구수신 스케쥴러 큐] ★★★★★ 큐 스케쥴러 예외 처리 중 에러 !! ★★★★★", e);
			 return batchMsgDoc;
		}
    }
    
    private void loggingToDB(BatchDoc batchMsgDoc) throws Exception
    {
        //요구수신에 대한 최초 DB로그. StartLog 호출.
		batchMsgDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());
        LogUtil.setStartLog(batchMsgDoc);
    }

    private void catchException(Exception ex)
    {
		logger.error("[요구수신 스케쥴러] ★★★★★ 예외 발생 !! ★★★★★", ex);
        try {
            // 파일로그 처리
			String errMsg = ExceptionUtil.getErrorCode(ex, "BECEAISSC027");
            logger.error(errMsg, ex);  //요구수신 Scheduler JPD 에서 에서 오류가 발생하였습니다.

            // DB로그 처리
            //batchMsgDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);
			//batchMsgDoc.getEAIBatchMessage().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash16());
            //LogUtil.setErrorLog(batchMsgDoc, errMsg);

        } catch (Exception e) {
            logger.error("[요구수신 스케쥴러] ★★★★★ 요구수신 스케쥴러 예외 처리 중 에러 !! ★★★★★", e);
        }

    }

	
}
