package com.eactive.eai.batch.job.jobItem.pension;

import com.eactive.eai.batch.job.jobConstant.TelegramKeys;
import com.eactive.eai.batch.job.jobItem.DefaultTelegram;
import com.eactive.eai.batch.job.jobItem.TelegramService;

import com.eactive.eai.batch.rule.nodeinfo.NodeInfoManager;
import com.eactive.eai.batch.rule.nodeinfo.NodeInfoVO;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.util.DatetimeUtil;

public class RECV_T_RTMPS extends DefaultTelegram implements TelegramService
{

	/**
     * 생성자 : 퇴직연금용 길이결정용 텔레그램 클래스 이다.
     */
    public RECV_T_RTMPS() {
    }

    /**
     * 전문 Validation
     */
    public boolean doValidation()
    {
        if (!super.doValidation()) return false;

		//1. 퇴직연금 수신 전문의 전문필드 개수 체크
		logger.info("{} >>>>> 수신 전문의 전문필드 개수 Checking......", logHeader);
		if (al_FieldProps == null || al_Field == null || al_FieldProps.length != al_Field.size()) {
			String errMsg = "전문필드 값 Validation 체크를 위한 데이터 불량.";
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
			return false;
		}

		//2. 퇴직연금 수신 전문의 전체 전문필드 타입 체크
		logger.info("{} >>>>> 수신 전문의 전체 전문필드 타입 Checking......", logHeader);
        for(int i=0; i<al_Field.size(); i++) {
			if ( !this.checkType(al_FieldProps[i], new String((byte[])al_Field.get(i))) ) {
				String errMsg = ExceptionUtil.getErrorCode("BECEAIMTM010", new String[] {al_FieldNames[i], (i+1)+"", new String((byte[])al_Field.get(i)), al_FieldProps[i]});
				batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 정의된 타입 '{4}' 에 맞지 않습니다.
				super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
				return false;
			}
        }

		//3. 퇴직연금 수신 전문의 Header 필드 값 체크
		int    currFiledIndex = 0;
		String currFieldValue = "";


//		//3-1. SYSTEM_ID 필드 값 체크
//		logger.info("{} >>>>> 수신 전문의 'SYSTEM_ID' 전문필드 값 Checking......", logHeader);
//		currFiledIndex = 1;
//		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
//		if (!currFieldValue.equals(TelegramKeys.RPS_SYSTEM_ID)) {
//			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR006", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, TelegramKeys.RPS_SYSTEM_ID});
//			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 이 아닙니다.
//			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
//			return false;
//		}

		//3-2. 자료구분 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '자료구분' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 3;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		/*
		if (!currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_TEST) &&
		    !currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_REAL) &&
		    !currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_PASS)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR007", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, "T,R,B"});
			batchDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 값들 중 하나이어야 합니다.
			super.setResolveResponseCode(TelegramKeys.BAN_RET_CODE_DATAGBN_ERROR);
			return false;
		*/	
//    	boolean _SYSTEMTEST = ( EAIServerManager.getInstance().isTEAIServer() || EAIServerManager.getInstance().isDEAIServer() );
//        if(_SYSTEMTEST){
//            if( (!currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_PASS) ) &&
//            	(!currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_TEST) ) ){
//            	logger.error("RECV_T_RTMPS ] getSendResponseCode - 자료구분(T:TEST/R:REAL/P:PASS) : ["+currFieldValue+"]");
//            	String errMsg = ExceptionUtil.getErrorCode("BICEAIFJI001", new String[] {currFieldValue});
//    			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
//            	super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_OTHER_ERROR);
//            	return false;
//            }
//        }
//        else {
//            if( (!currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_PASS) ) &&
//                (!currFieldValue.equals(TelegramKeys.RPS_HBD_DAT_GBN_REAL) ) ){
//                logger.error("RECV_T_RTMPS ] getSendResponseCode - 자료구분(T:TEST/R:REAL/P:PASS) : ["+currFieldValue+"]");
//                String errMsg = ExceptionUtil.getErrorCode("BICEAIFJI001", new String[] {currFieldValue});
//        		batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
//                super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_OTHER_ERROR);
//                return false;
//            }
//        }
		
		/*
		//3-3. 송신기관구분코드 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '송신기관구분코드' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 4;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!currFieldValue.equals(batchDoc.getEAIBatchMessage().getHeader().getInstituaionType())) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR006", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, batchDoc.getEAIBatchMessage().getHeader().getInstituaionType()});
			batchDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 이 아닙니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_CODE_ERROR);
			return false;
		}
		*/

		//3-4. 송신기관코드 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '송신기관코드' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 5;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!currFieldValue.equals(batchDoc.getBatchMsg().getHeader().getInstitutionCode())) {
			//String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR006", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, batchDoc.getEAIBatchMessage().getHeader().getInstitutionCode()});
			//batchDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 이 아닙니다.
			//super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_CODE_ERROR);
			//return false;
		}

		/*
		//3-5. 수신기관구분코드 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '수신기관구분코드' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 6;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!currFieldValue.equals(TelegramKeys.RPS_HBD_RSV_CLS_JASAN)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR006", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, TelegramKeys.RPS_HBD_RSV_CLS_JASAN});
			batchDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 이 아닙니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_CODE_ERROR);
			return false;
		}
		*/

		//3-6. 수신기관코드 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '수신기관코드' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 7;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
//		if (!currFieldValue.equals(TelegramKeys.RPS_HBD_SND_ID_KB)) {
//			//String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR006", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, TelegramKeys.RPS_HBD_SND_ID_KB});
//			//batchDoc.getEAIBatchMessage().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 이 아닙니다.
//			//super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_CODE_ERROR);
//			//return false;
//		}

		//3-7. 송수신FLAG 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '송수신FLAG' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 10;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!currFieldValue.equals(TelegramKeys.RPS_HDB_TRA_FLAG_CLIENT) &&
		    !currFieldValue.equals(TelegramKeys.RPS_HDB_TRA_FLAG_SERVER)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR007", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, "1,2"});
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 값들 중 하나이어야 합니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
			return false;
		}

		//3-8. 전문전송일 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '전문전송일' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 13;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!DatetimeUtil.isDateValue(currFieldValue)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR008", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue});
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 의 형식이 잘못되었습니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
			return false;
		}

		//3-9. 전문전송시간 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '전문전송시간' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 14;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!DatetimeUtil.isTimeValue(currFieldValue)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR008", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue});
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 의 형식이 잘못되었습니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
			return false;
		}

		//3-10. 거래발생일 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '거래발생일' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 17;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!DatetimeUtil.isDateValue(currFieldValue)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR008", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue});
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 의 형식이 잘못되었습니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_FORMAT_ERROR);
			return false;
		}

		//3-11. 응답코드 필드 값 체크
		logger.info("{} >>>>> 수신 전문의 '응답코드' 전문필드 값 Checking......", logHeader);
		currFiledIndex = 12;
		currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
		if (!currFieldValue.equals(TelegramKeys.RPS_HDB_RET_CODE_SUCCESS)) {
			String errMsg = ExceptionUtil.getErrorCode("BECEAIFAR034", new String[] {al_FieldNames[currFiledIndex], (currFiledIndex+1)+"", currFieldValue, TelegramKeys.getName_RPS_HDB_RET_CODE(currFieldValue) });
			batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//수신전문의 {1} 필드(Index:{2}) 값 '{3}' 이 '{4}' 입니다. 거래를 종료합니다.
			super.setResolveResponseCode(TelegramKeys.RPS_HDB_RET_CODE_OTHER_ERROR);
			return false;
		}

        return true;
    }

    //---------------- 특정 필드값을 구하는 부분
    // 전문종별코드 필드값 리턴
    public String getTelegramType()
    {
		return super.getFieldValueString(8);
    }
    // 거래구분코드 필드값 리턴
    public String getTrClass()
    {
		return super.getFieldValueString(9);
    }
    //응답코드 필드값 리턴
    public String getResCode()
    {
		return super.getFieldValueString(12);
    }

    /**
     *  20060417 add by khs : 원치 않는 전문종별 도착시, 소켓에 있는 garvage 데이터를 없애기 위해 사용한다.
     *
     *  return value :      <0 계산 할 수 없거나 장애이다.
     *                      >0 해당 데이터를 소켓에서 더 읽어들인다.
     */
    public int getRemainDataLength()
    {
        try {
            int     idx;
            String  strLength;
    
            String  strRuleCode   = batchDoc.getBatchMsg().getHeader().getRuleCode();
            String  strPhaseCode  = batchDoc.getBatchMsg().getBody().getFlowPhaseCode();
            NodeInfoVO  vo = NodeInfoManager.getInstance().getNodeInfo(strRuleCode, strPhaseCode);
    
            idx = vo.getLengthField();
            if (idx == 0) return -1;
    
            strLength = new String((byte[])this.al_Field.get(idx-1));
            int     nDocLen = Integer.parseInt(strLength);
            int     nReceivedLen = 0;
            for (int i=2; i<this.al_FieldLength.length ; i++) {
                nReceivedLen = nReceivedLen + Integer.parseInt(this.al_FieldLength[i]);
            }
    
            return (nDocLen-nReceivedLen);
            
        } catch (Exception ex) {
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(ex.toString());
            return -1;
        }
    }
}
