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

import java.io.ByteArrayOutputStream;
import java.io.File;

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.common.CommonKeys;
import com.eactive.eai.batch.common.LogUtil;
import com.eactive.eai.common.exception.ExceptionUtil;

public class RECV_LGCNS_0610 extends DefaultTelegram implements TelegramService
{
    //>> 업무관리정보
    private final String OpCode_start       = "001";    //업무개시
    private final String OpCode_end         = "002";    //업무종료
    private final String OpCode_exsist      = "003";    //추가송신파일 있음
    private final String OpCode_noexsist    = "004";    //추가송신파일 없음

    /**
     * 생성자
     */
    public RECV_LGCNS_0610() {
        //업무개시요구 및 업무개시통보
    }

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

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

        //업무관리정보 유효성 확인
        if (this.getOpCode().equalsIgnoreCase(this.OpCode_start)) {
            logger.info("{} BATCH JOB : start request received", logHeader);
        }
        else if(this.getOpCode().equalsIgnoreCase(this.OpCode_end)) {
            logger.info("{} BATCH JOB : end request received", logHeader);
        }
        else if(this.getOpCode().equalsIgnoreCase(this.OpCode_exsist)) {
        }
        else if(this.getOpCode().equalsIgnoreCase(this.OpCode_noexsist)) {
        }
        else {
            logger.info("{} 0610 telegram : unknown  Operation code received >> "+this.getOpCode(), logHeader);
            this.setResolveResponseCode(TelegramKeys.RES_CODE_NOT_REGISTERED);

            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = this.getOpCode();
            String errCode = "BECEAIFJI008";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
        }
        return true;
    }

    public boolean doPostExecute() {
        if (!super.doPostExecute()) return false;
        try {
            String fileDir = batchDoc.getBatchMsg().getHeader().getFilePath();
            String fileNm  = batchDoc.getBatchMsg().getHeader().getRenamedFileName();
            if (fileDir.charAt(fileDir.length()-1) != File.separatorChar) {
                fileDir = fileDir + File.separator;
            }
            String fileName = fileDir + fileNm;
            // File Open LOG
            File ff = new File(fileName);

            //응답송신이 아니고 0610/0004를 수신하면 (응답송신의 경우 recv0300일경우에 파일을 이동시키므로 이단계에서는 파일이 존재하지 않음
            if (!CommonKeys.PROCESS_RESPONSE_SEND.equalsIgnoreCase(this.batchDoc.getBatchMsg().getHeader().getProcessType())){
                if (ff.exists() && OpCode_noexsist.equals(this.getOpCode())) {
                	logger.info("{}  FILE SIZE ("+ ff.length() + "]", logHeader);
                    //DB로그에 남길 파일 헤더,트레일러 내용 설정
                    super.setFileHeaderAndTrailer(ff);
                }
            }

            //DB로그에 남길 전문 헤더 설정
            ByteArrayOutputStream baout = new ByteArrayOutputStream();
            for (int i=0; i<9; i++) { //CMS전문의 헤더는 응답코드까지 임.
                byte[] barr = (byte[])this.al_Field.get(i);
                if ( barr[0] != '\0') {
                    baout.write((byte[])this.al_Field.get(i));
                }
            }
            batchDoc.getBatchMsg().setTelegramHeader(new String(baout.toByteArray()));

            //DB로그에 남길 전문 바디 설정
            baout = new ByteArrayOutputStream();
            for (int i=9; i< al_Field.size(); i++) {
                baout.write((byte[])this.al_Field.get(i));
            }
            batchDoc.getBatchMsg().setTelegramBody(new String(baout.toByteArray()));
            if (OpCode_noexsist.equals(this.getOpCode()) && fileNm != null && !fileNm.trim().equals("")) {
                    //응답수신 파일 Start DB로그
                    LogUtil.setLogFileEnd(batchDoc);
            }
            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(5);
    }
    //응답코드 필드값 리턴
    public String getResCode()
    {
        return super.getFieldValueString(8);
    }
    //업무관리코드 필드값 리턴
    public String getOpCode()
    {
        return super.getFieldValueString(10);
    }
}