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

import java.io.File;
import java.io.FileOutputStream;

import com.eactive.eai.batch.common.CalendarUtil;
import com.eactive.eai.batch.common.LogUtil;
import com.eactive.eai.batch.common.StringUtil;
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_DAC25_120  extends DefaultTelegram implements TelegramService
{
    private String strFullPathName = "";
    private FileOutputStream fout = null;

    private File rcvRealFile = null;
    private File rcvArchFile = null;
    private File rcvErrorFile = null;

    public RECV_DAC25_120() { // 다른 전문과 달리 전문 번호가 없어 편의상 120번을 부여함
    }

    public boolean doPreExecute()
    {
        if (!super.doPreExecute())  return false;
        //1. 수신파일 저장 경로 설정
        //저장 디렉토리는 Inbound Server 에서 설정됨 (응답수신 Real 또는 응답송신 Real)
        strFullPathName = batchDoc.getBatchMsg().getHeader().getFilePath();
        if (strFullPathName.charAt(strFullPathName.length()-1) != File.separatorChar) {
            strFullPathName = strFullPathName + File.separator;
        }
        strFullPathName = strFullPathName + batchDoc.getBatchMsg().getHeader().getFileName();

        logger.info("{}  응답수신 파일 저장 경로 : [" + this.strFullPathName + "]", logHeader);
        rcvRealFile  = new File( this.strFullPathName );  //응답수신_Real 또는 응답송신_Real 디렉토리
        rcvArchFile  = new File( StringUtil.realToArchDir(this.strFullPathName) );
        rcvErrorFile = new File( StringUtil.realToErrorDir(this.strFullPathName) );

        //2. 응답수신 파일 생성
        logger.info("{} >>>>> 응답수신 파일 생성...... ("+ this.strFullPathName +")", logHeader);
        try {
//        	boolean append = true;
//        	if ( batchDoc.getBatchMsg().getBody().getCurFileSize() < 1){
//        		append = false;
//        	}
            fout = new FileOutputStream(rcvRealFile, true);

        } catch (Exception ex) {
            logger.error("{} ★★★★★ 응답수신 파일 생성 시 오류 발생 !! ★★★★★", logHeader, ex);
            String errMsg = ExceptionUtil.getErrorCode(ex, "BECEAIFJI041", new String[] {rcvRealFile.getAbsolutePath()});
            batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);  //수신 파일을 해당 경로에 생성시 오류가 발생하였습니다. [Path : {1}]
            super.setResolveResponseCode(TelegramKeys.MAGIC_RES_CODE_SYSTEM_ERROR);
            return false;
        }

        return true;
    }

    /**
     * int getCalculatedLength(int idx)
     * --------------------------------------------------------------------------------------
     * 전달된 인덱스 idx는 비정형 필드여야 한다. 즉 필드의 길이값이 FILE_NO_LENGTH("XX") 이어야 한다.
     * 해당 비정형 필드에 대해 실질적인 전문길이를 동적으로 계산해 낸다.
     * SEND : 송신 길이 계산
     * RECV : 수신 길이 계산
     */
    public int getCalculatedLength(int idx) {
        try {
            return Integer.parseInt(new String ((byte[]) al_Field.get(0)));
        } catch(Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI005";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( e.getMessage(), e);
            return -1;
        }
    }

    public boolean doInformalField(int idx, byte[] data, int length)
    {
        try {
            //파일 끝에 append
            fout.write(data, 0, length);

            //읽어 들인 파일 사이즈 저장
            long lnCurSize = batchDoc.getBatchMsg().getBody().getCurFileSize() + length;
            batchDoc.getBatchMsg().getBody().setCurFileSize(lnCurSize);

            return true;

        } catch (Exception ex) {
            super.setResolveResponseCode(TelegramKeys.MAGIC_RES_CODE_SYSTEM_ERROR);
            logger.error("{} ★★★★★ 수신 파일 데이터 WRITE 시 오류 발생 !! ★★★★★", logHeader, ex);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(ex.toString());
            return false;
        }
    }

    public boolean doExecute() {
        if (!super.doExecute())  return false;
        return true;
    }

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

    public boolean doPostExecute() {
        if (!super.doPostExecute()) return false;

        try {
            //1. 수신 파일 Close ===========================================================
            if (fout != null) fout.close();

            if ( batchDoc.getBatchMsg().getBody().getCurFileSize() < batchDoc.getBatchMsg().getHeader().getFileSize() ){
            	return true;
            }

        	setConditionTxt(TelegramKeys.EOF);
            //2. 수신 파일 End DB로그 ======================================================
            //수신 파일 (Real 디렉토리)
            if (rcvRealFile.exists()) {
                //사이즈 비교
                long recvSize = rcvRealFile.length();
                if  ( recvSize != batchDoc.getBatchMsg().getHeader().getFileSize() ){
                    super.setResolveResponseCode(TelegramKeys.MAGIC_RES_CODE_SEND_BYTE_ERROR);
                    logger.debug(this.getClass().getName() + "[doPostExecute]recvSize-->" + recvSize );
                    logger.debug(this.getClass().getName() + "[doPostExecute]batchDoc.getBatchMsg().getHeader().getFileSize()-->" + batchDoc.getBatchMsg().getHeader().getFileSize() );
                    return false;
                }
                super.setFileHeaderAndTrailer(rcvRealFile);
            }

            //DB로그에 남길 변경 파일명 설정 (파일명 변경 안함)
            batchDoc.getBatchMsg().getHeader().setRenamedFileName(batchDoc.getBatchMsg().getHeader().getFileName());

            //File 종료시간 설정
            batchDoc.getBatchMsg().getBody().setPhaseEndTime(CalendarUtil.getCurrentTimeNoDash());

            //수신 파일 End DB로그
            LogUtil.setLogFileEnd(batchDoc);

            //응답코드가 000 (성공) 이 아니면 Error 디렉토리로 옮기고 리턴
            if ( !super.getResolveResponseCode().equals(TelegramKeys.RPS_HDB_RET_CODE_SUCCESS) ) {
                //3. 수신 파일을 수신 Real 디렉토리 -> 수신 Error 디렉토리로 이동 (파일명 변경 안함)
                logger.info("{} >>>>> 수신 파일을 수신 Real 디렉토리 -> 수신 Error 디렉토리로 이동.....", logHeader);
                boolean isSuccessMoveFile = rcvRealFile.renameTo(rcvErrorFile);
                if (!isSuccessMoveFile) {
                    String errMsg = ExceptionUtil.getErrorCode("BECEAIFJI042", new String[] {rcvRealFile.getAbsolutePath(), rcvArchFile.getAbsolutePath()});
                    if (!batchDoc.getBatchMsg().getBody().getErrorMsg().equals("")) {
                        errMsg += "\n caused by..." + batchDoc.getBatchMsg().getBody().getErrorMsg();
                    }
                    batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);    //수신 파일을 수신 Real 디렉토리에서 수신 Error 디렉로 이동시 오류가 발생하였습니다. [Real Path: {1}] [Error Path: {2}]
                }
                logger.debug(this.getClass().getName() + "[doPostExecute]super.getResolveResponseCode()-->" + super.getResolveResponseCode() );
                return false;
            }

            //3. 수신 파일을 수신 Real 디렉토리 -> 수신 Arch 디렉토리로 이동 (파일명 변경 안함)
            logger.info("{} >>>>> 수신 파일을 수신 Real 디렉토리 -> 수신 Arch 디렉토리로 이동.....", logHeader);
            boolean isSuccessMoveFile = rcvRealFile.renameTo(rcvArchFile);
            if (!isSuccessMoveFile) {
                String errMsg = ExceptionUtil.getErrorCode("BECEAIFJI030", new String[] {rcvRealFile.getAbsolutePath(), rcvArchFile.getAbsolutePath()});
                batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);    //수신 파일을 수신 Real 디렉토리에서 수신 Arch 디렉로 이동시 오류가 발생하였습니다. [Real Path: {1}] [Arch Path: {2}]
                super.setResolveResponseCode(TelegramKeys.MAGIC_RES_CODE_SYSTEM_ERROR);
                logger.debug(this.getClass().getName() + "[doPostExecute](1)super.getResolveResponseCode()-->" + super.getResolveResponseCode() );
                return false;
            }

            try {
                File rcvRootFile = new File( StringUtil.realToRootDir(this.strFullPathName) );
                rcvRootFile.createNewFile();
            } catch (Exception ex) {
                String errMsg = ExceptionUtil.getErrorCode(ex, "BECEAIFJI031", new String[] { StringUtil.realToRootDir(this.strFullPathName) });
                batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);    //수신 Root 디렉토리에 0 Byte 파일을 생성할 수 없습니다. [Path: {1}]
                super.setResolveResponseCode(TelegramKeys.MAGIC_RES_CODE_SYSTEM_ERROR);
                logger.debug(this.getClass().getName() + "[doPostExecute](2)super.getResolveResponseCode()-->" + super.getResolveResponseCode() );
                return false;
            }

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