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

import com.eactive.eai.common.exception.ExceptionUtil;
import java.util.HashMap;
import java.util.Properties;
import java.lang.String;
import java.io.ByteArrayOutputStream;
import com.eactive.eai.batch.job.jobConstant.TelegramKeys;
import com.eactive.eai.batch.job.jobHandle.JobProcessData;
import com.eactive.eai.batch.job.jobItem.DefaultTelegram;
import com.eactive.eai.batch.job.jobItem.TelegramService;

public class SEND_T0610_0001  extends DefaultTelegram implements TelegramService
{

	private Properties telegramInfo;

    public SEND_T0610_0001() {
    }

    public boolean doPreExecute() {
        try {
            if (!super.doPreExecute()) return false;
            telegramInfo = getTelegramInfo();
            return true;
        } catch (Exception ex) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI003";
            String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( ex.getMessage(), ex);
            return false;
        }
    }

    /**
     * 전문조립
     * 퇴직연금 배치처리에서 0810 전문은 0800 전문에 대한 응답전문이므로, 이전 전문을 참조하여 처리하도록 한다.
     */
    public boolean doExecute() {
        try {
            // 먼저 이전 전문을 구한다. : 전문 조립을 위해 참조...
            String  strUUID = this.batchDoc.getBatchMsg().getHeader().getUUID();
			HashMap<String, Object> hm_job  = JobProcessData.getInstance().getBatchStageData(strUUID);
            TelegramService prevTelegram = (TelegramService)hm_job.get(JobProcessData.PROCDATA_PRE_TELEGRAM);
            if (prevTelegram == null) {
                logger.debug("{} not found previous telegram instance : needed in compiling of response telegram", logHeader);
                String[] msgArgs = new String[1];
                msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
                String errCode = "BECEAIJI035";
                String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
                this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);

                return false;
            }
            //
            compileField(0, new String(prevTelegram.getFieldDataByIndex(0)), this.al_FieldProps[0]);
            compileField(1, new String(prevTelegram.getFieldDataByIndex(1)), this.al_FieldProps[1]);
            long lnLength = this.getSendLength();
            compileField(2, String.valueOf(lnLength), this.al_FieldProps[2]);
            // 자료구분 (HDB_DAT_GBN), 실테스트시에는 이 부분을 real로 바꿔야 한다.
            compileField(3, new String(prevTelegram.getFieldDataByIndex(3)), this.al_FieldProps[3]);
            // 송신기관 구분 (HDB_SND_CLS) : 1:운영, 2:기록, 3:자산, 4:상품, 5:자산운영
            compileField(4, telegramInfo.getProperty(TelegramKeys.HDB_SND_CLS), this.al_FieldProps[4]);
            // 송신기관 코드 (HDB_SND_ID)
            compileField(5, telegramInfo.getProperty(TelegramKeys.HDB_SND_ID), this.al_FieldProps[5]);
            // 수신기관 구분 (HDB_RCV_CLS)
            compileField(6, telegramInfo.getProperty(TelegramKeys.HDB_RCV_CLS), this.al_FieldProps[6]);
            // 수신기관 코드 (HDB_RSV_ID)
            compileField(7, batchDoc.getBatchMsg().getHeader().getInstitutionCode(), this.al_FieldProps[7]);
            // 전문종별코드 : 실시간 DB 결정
            compileField(8, this.getFldTelegramType(), this.al_FieldProps[8]);
            // 거래구분코드 : 실시간 DB 결정 : 0610 전문의 이전 전문을 복사해서 사용
            compileField(9, new String(prevTelegram.getFieldDataByIndex(9)), this.al_FieldProps[9]);
            // 송수신 Flag : 이경우는 수신받는 경우이다.
            compileField(10,TelegramKeys.RPS_HDB_TRA_FLAG_SERVER, this.al_FieldProps[10]);
            // STATUS : 사용안함
            compileField(11, "000", this.al_FieldProps[11]);
            // 응답코드 : --> 정상처리해도 되는지 판단 :
            compileField(12, super.getSendResponseCode(), this.al_FieldProps[12]);
            // 전문전송일
            compileField(13, TelegramKeys.getYYYYMMDD(), this.al_FieldProps[13]);
            // 전문전송시간
            compileField(14, TelegramKeys.getHHMMSS(), this.al_FieldProps[14]);
            // 송신기관전문번호, 8자리 : 이전전문에서 복사
            compileField(15, new String(prevTelegram.getFieldDataByIndex(15)), this.al_FieldProps[15]);
            // 수신기관전문번호
            // compileField(16, TelegramKeys.getRecvSequence(this.getFldTelegramType()), this.al_FieldProps[16]);
            compileField(16, "10000001", this.al_FieldProps[16]);
            // 거래발생일, 실 자료의 거래 발생일, 실 파일의 19번째부터 8자리를 읽어야 한다.
            compileField(17, new String(prevTelegram.getFieldDataByIndex(17)), this.al_FieldProps[17]);
            // 전체파일수 : 사용안함
            compileField(18, new String(prevTelegram.getFieldDataByIndex(18)),  this.al_FieldProps[18]);
            // 현재파일순번 : 사용안함
            compileField(19, new String(prevTelegram.getFieldDataByIndex(19)),  this.al_FieldProps[19]);
            // 현재 파일명
            compileField(20, new String(prevTelegram.getFieldDataByIndex(20)),  this.al_FieldProps[20]);
            // 현재 파일 전체 전문 수 : 사용안함
            compileField(21, new String(prevTelegram.getFieldDataByIndex(21)),  this.al_FieldProps[21]);
            // 현재 파일 현재 순번
            compileField(22, new String(prevTelegram.getFieldDataByIndex(22)),  this.al_FieldProps[22]);
            // 전문 CASE 명
            compileField(23, new String(prevTelegram.getFieldDataByIndex(23)),  this.al_FieldProps[23]);
            // 송신추가정의
            compileField(24, TelegramKeys.RPS_HDB_SND_EXT, this.al_FieldProps[24]);
            // 송신추가정의
            compileField(25, TelegramKeys.RPS_HDB_RSV_EXT, this.al_FieldProps[25]);
            //<< 전문 완성
            return true;
        } catch (Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI001";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( e.getMessage(), e);
        }
        return false;
    }

    /**
     * 0610 전문 처리 --> 이전문은 실질 응답 전문이다.  따라서.. 대부분의 값은 복사해서 사용하고
     *                   응답 코드만 잘 처리해주면 된다.
     */
    public String getSendResponseCode()
    {
        return TelegramKeys.RPS_HDB_RET_CODE_SUCCESS;
    }

    /**
     * 실제 송신할 전문의 총길이를 리턴해준다.
     */
    public int getSendLength() {
        int nSumFormalField = 0;
        for (int i=0; i<this.al_FieldLength.length ; i++) {
            String strFieldLength = this.al_FieldLength[i];
            if (!strFieldLength.equalsIgnoreCase(FIELD_NO_LENGTH)) {
                try {
                    int nFldCnt = Integer.parseInt(strFieldLength);
                    nSumFormalField = nSumFormalField + nFldCnt;
                } catch(Exception ex) {
                    logger.error( ex.getMessage(), ex);
                    byte[] aField = (byte[])this.al_Field.get(i);
                    nSumFormalField = nSumFormalField + aField.length;
                }
            }
        }
        return nSumFormalField;
    }

    /**
     * doPostExecute
     */
    public boolean doPostExecute() {
        try {
            if (!super.doPostExecute()) return false;
            /////////////////////////////////////////////////////////////
            ByteArrayOutputStream baout = new ByteArrayOutputStream();
            for (int i=0; i<this.al_Field.size(); i++) {
                baout.write((byte[])this.al_Field.get(i));
            }
            batchDoc.getBatchMsg().setTelegramHeader(new String(baout.toByteArray()));
            /////////////////////////////////////////////////////////////
            logger.info("{}  doPostExecute called", logHeader);
            return true;
        } catch (Exception ex) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI002";
            String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( ex.getMessage(), ex);
            return false;
        }
    }


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

}
