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

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;

/**
 * TSEAIBR03 의 각 노드 정보에 지정되는 클래스 이다.
 * RECV 액션을 수행하는 노드에 대해, 해당 노드에서 수행할 전문수신작업의 수신길이를 결정하기 위해 사용된다.
 */
public class RECV_LGCNS extends DefaultTelegram implements TelegramService
{
    /**
     * 생성자 : CMS쪽 길이 결정용 텔레그램 클래스 이다.
     */
    public RECV_LGCNS() {
    }

    public boolean doValidation()
    {
        if (!super.doValidation()) return false;
        
        try {
			logger.info("{} >>>>> 응답코드  Checking......", logHeader);
			int currFiledIndex = 8;
			String currFieldValue = new String((byte[])al_Field.get(currFiledIndex));
			if (!currFieldValue.equals(TelegramKeys.RES_CODE_SUCESS))  {
				String errMsg = "정상거래 응답코드를 수신하지 못했습니다. 수신된 응답코드 ["+currFieldValue+"]-"+TelegramKeys.getCmsRetDescription(currFieldValue);
				batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//
				super.setConditionTxt(TelegramKeys.ERROR);
				return false;
			}
        }catch (Exception e){
        	logger.error( e.getMessage(), e);
        	this.batchDoc.getBatchMsg().getBody().setErrorMsg(e.toString());
        	super.setConditionTxt(TelegramKeys.ERROR);
        	return false;
        }
        return true;
    }

    public boolean doExecute() {

        return true;
    }

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

    /**
     * int getCalculatedLength(int idx)
     * --------------------------------------------------------------------------------------
     * 전달된 인덱스 idx는 비정형 필드여야 한다. 즉 필드의 길이값이 FILE_NO_LENGTH("XX") 이어야 한다.
     * 해당 비정형 필드에 대해 실질적인 전문길이를 동적으로 계산해 낸다.
     */
    public int getCalculatedLength(int idx) {

        if (idx >= this.getFieldCount()) {
        	logger.debug("{} getCalculatedLength> parameter is bigger than field count", logHeader);
            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = ""+idx;
            String errCode = "BECEAIFJI011";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            return -1;
        }
        if (!this.getFieldLength(idx).equalsIgnoreCase(TelegramService.FIELD_NO_LENGTH)) {
            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = ""+idx;
            String errCode = "BECEAIFJI012";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            return -1;
        }
        String propKey = "";
        switch (idx) {

        case 1:
            propKey = TelegramKeys.TRCD_LEN;
            break;

        case 3:
            propKey = TelegramKeys.ORGN_CD_LEN;
            break;

        default:
            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = ""+idx;
            String errCode = "BECEAIFJI012";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            return -1;
        }

        try {
            return Integer.parseInt( getTelegramInfo().getProperty(propKey) );
        } catch (Exception e) {
            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = propKey;
            String errCode = "BECEAIFJI012";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            return -1;
        }
    }

    /**
     *  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=1; i<this.al_FieldLength.length ; i++) {
                if (!this.al_FieldLength[i].equals("XX") ){
                    nReceivedLen = nReceivedLen + Integer.parseInt(this.al_FieldLength[i]);
                } else {
                    nReceivedLen = nReceivedLen + getCalculatedLength(i);
                }
            }
            return (nDocLen-nReceivedLen);
        } catch (Exception ex) {
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(ex.toString());
            return -1;
        }
    }
}