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

import java.io.ByteArrayOutputStream;

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 RECV_CCRSF_0620 extends DefaultTelegram implements TelegramService {

    /**
     * 생성자
     */
    public RECV_CCRSF_0620() {
        //결번확인요구
    }

    /**
     * 전문 해체하기
     */
    public boolean doExecute() {
        if (!super.doExecute()) return false;

        try {

            String _block_no =  new String ((byte[]) al_Field.get(9));   // 0 base 인덱스
            String _seq_no   =  new String ((byte[]) al_Field.get(10));   // 0 base 인덱스
            int recv_block_no = Integer.parseInt(_block_no);
            int recv_seq_no   = Integer.parseInt(_seq_no);

            int block_no = batchDoc.getBatchMsg().getBody().getBlockNum();
            int seq_no   = batchDoc.getBatchMsg().getBody().getSeqNum();

            if (recv_block_no > block_no || recv_seq_no < seq_no){
                // 0620으로 받은 BLOCK_NO가 EAIBatchMessage의 BLOCK_NO 보다 크거나
                // 0620으로 받은 SEQ_NO가 EAIBatchMessage의 SEQ_NO 보다 작으면 EEND처리 해야 함.
                this.setConditionTxt(TelegramKeys.ERROR);
                logger.debug("{}  received block_no is bigger than current block_no", logHeader);

                String[] msgArgs = new String[3];
                msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
                msgArgs[1] = _block_no;
                msgArgs[2] = ""+block_no;
                String errCode = "BECEAIFJI024";
                String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
                this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);

                return false;
            }
            // 두번째 결번확인 전문을 받은 경우에는 SeqNum 을 다시 세팅해줘야 한다.
            batchDoc.getBatchMsg().getBody().setBlockNum(recv_block_no);
            batchDoc.getBatchMsg().getBody().setSeqNum(recv_seq_no);


        } 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;
        }
        return true;
    }

    public boolean doPostExecute() {
        if (!super.doPostExecute()) return false;
        try {
            //DB로그에 남길 전문 헤더 설정
            ByteArrayOutputStream baout = new ByteArrayOutputStream();
            for (int i=0; i<8; i++) {
                baout.write((byte[])this.al_Field.get(i));
            }
            batchDoc.getBatchMsg().setTelegramHeader(new String(baout.toByteArray()));

            //DB로그에 남길 전문 바디 설정
            baout = new ByteArrayOutputStream();
            for (int i=8; i< al_Field.size(); i++) {
                baout.write((byte[])this.al_Field.get(i));
            }
            batchDoc.getBatchMsg().setTelegramBody(new String(baout.toByteArray()));

            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(4);
    }
    // 거래구분코드 필드값 리턴
    public String getTrClass()
    {
        return super.getFieldValueString(8);
    }
    //응답코드 필드값 리턴
    public String getResCode()
    {
        return super.getFieldValueString(7);
    }
}