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

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

    /**
     * 생성자
     */
    public RECV_CFABT_0210() {
        //DATA응답 전문
    }

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

//        try {
//
////            String str_seq = new String ((byte[]) al_Field.get(8));
////
////            int recv_seq = Integer.parseInt(str_seq);
////            
////            this.batchDoc.getBatchMsg().getBody().setSeqNum(recv_seq);
////            if ( this.getOpCode().equals("999")){
////            	this.setConditionTxt("NOFILE");
////            }
//        } 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;
    }

    /**
     * int getCalculatedLength(int idx)
     * --------------------------------------------------------------------------------------
     * 전달된 인덱스 idx는 비정형 필드여야 한다. 즉 필드의 길이값이 FILE_NO_LENGTH("XX") 이어야 한다.
     * 해당 비정형 필드에 대해 실질적인 전문길이를 동적으로 계산해 낸다.
     * RECV : 수신 길이 계산
     */
    public int getCalculatedLength(int idx) {
        if (idx >= this.getFieldCount()) {
            String[] msgArgs = new String[2];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            msgArgs[1] = ""+idx;
            String errCode = "BECEAIFJI011";
            String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);

            return -1;
        }
        if (this.getFieldLength(idx).equalsIgnoreCase(TelegramService.FIELD_NO_LENGTH)) {
        	return 0;
        } else {

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

            return -1;
        }
    }

    public boolean doInformalField(int idx, byte[] data, int length)
    {
        return false;
    }

    public boolean doPostExecute() {
        if (!super.doPostExecute()) return false;
        try {
            long totalFileSize = batchDoc.getBatchMsg().getHeader().getFileSize();
            long curFileSize = batchDoc.getBatchMsg().getBody().getCurFileSize();
            if ( curFileSize >= totalFileSize){
            	this.setConditionTxt(TelegramKeys.EOF);
//            	LogUtil.setLogFileEnd(batchDoc);
            	//요구송신 파일 END DB로그
//        		try {
////        			LogUtil.setLogFileEnd(batchDoc);
////                    if ( checkMoreFileInDir()){
////                    	this.setConditionTxt("");
////                    } else {
////                		this.setConditionTxt(TelegramKeys.EOF);
////                    }
//
//        		} catch (Exception ex) {
//                    String[] msgArgs = new String[1];
//                    msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
//                    String errCode = "BECEAIFJI021";
//                    String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
//                    this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
//        			return false;
//        		}
            }


			//DB로그에 남길 전문 헤더 설정
            ByteArrayOutputStream baout = new ByteArrayOutputStream();
            for (int i=0; i<14; i++) {
                baout.write((byte[])this.al_Field.get(i));
            }
            batchDoc.getBatchMsg().setTelegramHeader(new String(baout.toByteArray()));

            //DB로그에 남길 전문 바디 설정
            batchDoc.getBatchMsg().setTelegramBody("");

            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;
        }
    }
    
//    private boolean checkMoreFileInDir(){
//    	
//    	String processCode = batchDoc.getBatchMsg().getHeader().getProcessCode(); 
//    	String institutionCode = batchDoc.getBatchMsg().getHeader().getInstitutionCode();
//    	try{
//
//    		//거래구분 코드 설정
//    		int bizCodeStartIndex = 0;
//    		int bizCodeEndIndex   = 0;
//    		ArrayList<OutsideVO> organList = OutsideManager.getInstance().getOutsideInfo(processCode);
//    		for (int i=0; organList!=null && i<organList.size(); i++) {
//    			OutsideVO organInfo = organList.get(i);
//    			if ( institutionCode.equals(organInfo.getOsdCode()) ) {
//    				bizCodeStartIndex = organInfo.getBizCdStartIdx();
//    				bizCodeEndIndex   = organInfo.getBizCdEndIdx();
//    				break;
//    			}
//    		}
//
//    		String strPathName = StringUtil.replaceStr(batchDoc.getBatchMsg().getHeader().getFilePath(), "Arch", "Real");
//            logger.info("{} [요구송신] PATH NAME = [" + strPathName + "]", logHeader);
//
//            File dir = new File(strPathName);
//            if (!dir.exists()) {
//                logger.warn("{} 요구송신용 디렉토리 [" + strPathName + "] 이 없습니다.", logHeader);
//                String[] msgArgs = new String [2];
//                msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
//                msgArgs[1] = dir.getName();
//                String errCode = "BECEAIFJI022";
//                String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
//                this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
//                return false;
//            }
//            File[] fileList = dir.listFiles();
//            Arrays.sort(fileList);
//            File sndRealFile = null;
//            int msgPriority = 1000;
//        	String baseYYYYMMDD = batchDoc.getBatchMsg().getHeader().getBaseDate();
//            if (fileList.length> 0) {
//                for (int inx=0; inx<fileList.length; inx++) {
//
//                	String fileName = fileList[inx].getName();
//                	// 해당 기준일자의 파일이 아니면 skip 2009.03.24
//                	if ( fileName.indexOf(baseYYYYMMDD) < 0) continue;
//            		if (bizCodeStartIndex <= 0 || bizCodeStartIndex >= fileName.length()) bizCodeStartIndex = 0;
//            		if (bizCodeEndIndex   <= 0 || bizCodeEndIndex   >  fileName.length()) bizCodeEndIndex = fileName.length();
//                    String bizCode = fileName.substring(bizCodeStartIndex, bizCodeEndIndex);
//                    BatchJobInfoVO bjvo = DirInfoManager.getInstance().getFileInfoByDstcd(processCode, bizCode);
//                    if ( bjvo != null ) {
//                    	if (bjvo.getPriority() < msgPriority ){
//                    		msgPriority = bjvo.getPriority();
//                    		sndRealFile = fileList[inx];
//                    		batchDoc.getBatchMsg().getHeader().setBizCode(bizCode);
//                            batchDoc.getBatchMsg().getHeader().setRecLen((int)bjvo.getFileRecSize());
//                    	}
//                    }
//                }
//                if ( sndRealFile == null ) {
//                	return false;
//                }
//                String strFileName = sndRealFile.getName();
//                String renamedFileName = strFileName + "_" + CalendarUtil.getCurrentTimeNoDash();
//    			File sndArchFile = new File( batchDoc.getBatchMsg().getHeader().getFilePath() + File.separator + renamedFileName );
//				logger.info("{} >>>>> 송신 대기 파일을 송신 Real 디렉토리 -> 송신 Arch 디렉토리로 이동.....", logHeader);
//				boolean isSuccessMoveFile = sndRealFile.renameTo(sndArchFile);
//				if (!isSuccessMoveFile) {
//					String errMsg = ExceptionUtil.getErrorCode("BECEAIFJI044", new String[] {sndRealFile.getAbsolutePath(), sndArchFile.getAbsolutePath()});
//					batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);	//송신 대기중인 파일을 송신 Real 디렉토리 -> 송신 Arch 디렉토리로 이동시 오류가 발생하였습니다. [Real Path: {1}] [Arch Path: {2}]
//					return false;
//				}
//
//                batchDoc.getBatchMsg().getHeader().setFileName(strFileName);
//                batchDoc.getBatchMsg().getHeader().setRenamedFileName(renamedFileName);
//
//            } else {
//            	return false;
//            }
//    		
//    	} catch ( Exception e){
//    		return false;
//    	}
//    	return true;
//    }

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