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

import java.io.ByteArrayOutputStream;
import java.util.Properties;

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.common.exception.ExceptionUtil;

public class SEND_INSBT_0610  extends DefaultTelegram implements TelegramService
{

	private Properties telegramInfo;

    public SEND_INSBT_0610() {
    }

    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  strFileName = batchDoc.getBatchMsg().getHeader().getFileName();
            logger.info("{} [0610] telegram : filename [" + strFileName + "]", logHeader);
            //
            compileField(0, telegramInfo.getProperty(TelegramKeys.TRANSACTION_CODE), this.al_FieldProps[0]);
            compileField(1, telegramInfo.getProperty(TelegramKeys.BIZ_GBN), this.al_FieldProps[1]);
            long lnLength = this.getSendLength();
            compileField(2, String.valueOf(lnLength), this.al_FieldProps[2]);
            // 자료구분 (HDB_DAT_GBN), "T"
            compileField(3, telegramInfo.getProperty(TelegramKeys.DAT_GBN), this.al_FieldProps[3]);
            // ins_id	보험사기관 ID	char	3	AN	MY_INST_CODE	false	0		0	KHG
            compileField(4, telegramInfo.getProperty(TelegramKeys.HDB_SND_ID), this.al_FieldProps[4]);
            // bak_cls	은행 구분	char	2	AN	INST_TYPE	false	0		0	bak_cls
            compileField(5, telegramInfo.getProperty(TelegramKeys.HDB_SND_CLS), this.al_FieldProps[5]);
            // bak_id	은행  ID	char	3	AN	OTHER_INST_CODE	false	0		0	bak_id
            compileField(6, telegramInfo.getProperty(TelegramKeys.BANK_CODE), this.al_FieldProps[6]);
            // doc_code	전문종별 코드	char	4	AN	KIND_CODE	false	0		0	doc_code
            compileField(7, this.getFldTelegramType(), this.al_FieldProps[7]);
            // biz_code	거래구분 코드	char	6	AN	TX_CODE	false	0		0	biz_code
            compileField(8, batchDoc.getBatchMsg().getHeader().getBizCode(), this.al_FieldProps[8]);
            // tra_flag	송수신 FLAG	numeric	1	NN	SNR_TYPE	false	0		0	tra_flag  5
            compileField(9, telegramInfo.getProperty(TelegramKeys.TRA_FLAG_SEND), this.al_FieldProps[9]);
            // doc_status	STATUS	numeric	3	NN		false	0		0	000
            compileField(10, "000", this.al_FieldProps[10]);
            // ret_code	응답코드	char	3	AN	RESPONSE_CODE	false	0		0	ret_code
            compileField(11, TelegramKeys.RPS_HDB_RET_CODE_SUCCESS, this.al_FieldProps[11]);
            // snd_date	전문전송일	numeric	8	NN		false	0		0	$DATE(YYYYMMDD)
            compileField(12, TelegramKeys.getYYYYMMDD(), this.al_FieldProps[12]);
            // snd_time	전문전송시간	numeric	6	NN		false	0		0	$TIME(hhmmss)
            compileField(13, TelegramKeys.getHHMMSS(), this.al_FieldProps[13]);
            // bak_docseq	은행 전문번호	numeric	8	NN		false	0		0	00000000
            compileField(14, "0000000", this.al_FieldProps[14]);
            // ins_docseq	보험사 전문번호	numeric	8	NN		false	0		0	00000000
            compileField(15, TelegramKeys.RPS_HDB_RSV_DOCSEQ, this.al_FieldProps[15]);
            // txn_date	거래발생일	numeric	8	NN	TX_DATE	false	0		0	txn_date
            compileField(16, TelegramKeys.getYYYYMMDD(), this.al_FieldProps[16]);
            // tot_file	전체 파일 수	numeric	2	NN		false	0		0	01
            compileField(17, "01", this.al_FieldProps[17]);
            // cur_file	현재 파일 순번	numeric	2	NN		false	0		0	01
            compileField(18, "01", this.al_FieldProps[18]);
            // doc_name	현재 파일명	char	30	AN	FILE_NAME	false	0		0	doc_name
            compileField(19, strFileName, this.al_FieldProps[19]);
            // cur_tot	현재파일전체전문수	numeric	2	NN	TOT_BLOCK_NO	false	0		0	cur_tot
            compileField(20, "01", this.al_FieldProps[20]);
            // cur_now	현재파일현재순번	numeric	2	NN	CUR_BLOCK_NO	false	0		0	cur_now
            compileField(21, "01", this.al_FieldProps[21]);
            // doc_case	전문CASE명	char	6	AN		false	0		0	doc_case
            compileField(22, "", this.al_FieldProps[22]);
            // bak_ext	은행추가정의	char	30	AN		false	0		0	bak_ext
            compileField(23, TelegramKeys.RPS_HDB_SND_EXT, this.al_FieldProps[23]);
            // ins_ext	보험사추가정의	char	30	AN		false	0		0	ins_ext
            compileField(24, TelegramKeys.RPS_HDB_RSV_EXT, this.al_FieldProps[24]);
            //<< 전문 완성
            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(7);
    }
    // 거래구분코드 필드값 리턴
    public String getTrClass()
    {
		return super.getFieldValueString(8);
    }
    //응답코드 필드값 리턴
    public String getResCode()
    {
		return super.getFieldValueString(11);
    }

}
