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

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
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.batch.osd.OutsideManager;
import com.eactive.eai.batch.osd.OutsideVO;
import com.eactive.eai.common.exception.ExceptionUtil;

public class SEND_FIUSC_0610 extends DefaultTelegram implements TelegramService {

    private int SEND_LENGTH;            //길이 필드를 제외한 전문의 총길이
    private int REAL_SEND_LENGTH;       //실제 송신할 전문의 총길이( SEND_LENGTH + 길이필드 길이)

    private Properties telegramInfo;
    
    /**
     * 생성자
     */
    public SEND_FIUSC_0610() {
        //업무개시요구 및 응답 (0600/0010, 0610/0010)
    }

    /**
     * 전문조립
     */
    public boolean doExecute() {
        try {
            boolean result = calculateSendLength();
            if (!result) return false;

            int i = -1;
            //전문송신  전체 Byte 수
            compileField(++i, ""+REAL_SEND_LENGTH, this.al_FieldProps[i]);
            
            // Transaction Code
            compileField(++i, telegramInfo.getProperty(TelegramKeys.TRANSACTION_CODE), this.al_FieldProps[i]);

            // 시스템명칭 (FIU)
            compileField(++i, telegramInfo.getProperty(TelegramKeys.BIZ_GBN), this.al_FieldProps[i]);
            
            // 참가기관코드
            compileField(++i, telegramInfo.getProperty(TelegramKeys.BANK_CODE), this.al_FieldProps[i]);
            
            //사용자ID
            byte[] userId = new byte[20];
            for ( int inx = 0; inx < userId.length; inx++ ){
            	userId[inx] = ' ';
            }
            
            System.arraycopy(batchDoc.getBatchMsg().getHeader().getUserID().getBytes(), 0, userId, 0,
            		Math.min(batchDoc.getBatchMsg().getHeader().getUserID().getBytes().length, 20));

            al_Field.set(++i, userId);
            
            //전문종별코드.
            compileField(++i, this.getFldTelegramType()+ this.getFldOpCode() + "0", this.al_FieldProps[i]);
            
            //송수신 FLAG : 전문 발생 기관을 구분하여  아래의 값을 SET한다.
            compileField(++i, getFldTrClass(), this.al_FieldProps[i]);

            //기관구분
            compileField(++i, telegramInfo.getProperty(TelegramKeys.TRA_FLAG_BANK), this.al_FieldProps[i]);
            
            //계속여부 
            compileField(++i, "Y", this.al_FieldProps[i]);
            
            //응답코드
            compileField(++i, getSendResponseCode(), this.al_FieldProps[i]);
            // 여기 까지 공통부
            
            //전문 전송일시 YYYYMMDDHHMMSS
            compileField(++i, TelegramKeys.getYYYYMMddHHmmss(), this.al_FieldProps[i]);

            if (this.getFldOpCode().endsWith("4")){
            	return true;
            }

            //파일 확인 요구 간격
//            compileField(++i, ""+batchDoc.getBatchMsg().getHeader().getPacketSize(), this.al_FieldProps[i]);
            compileField(++i, ""+this.batchDoc.getBatchMsg().getHeader().getBlockSize(), this.al_FieldProps[i]);

            //전송방법
            compileField(++i, TelegramKeys.FIUSC_DATA_FLAG_BIN, this.al_FieldProps[i]);

            //압축사용여부
            String renamedFileName = batchDoc.getBatchMsg().getHeader().getRenamedFileName();
            String compGb = "0";
            if ( ( renamedFileName.indexOf(".ZIP_") > -1 ) || ( renamedFileName.indexOf(".zip_")) > -1 ){
            	compGb = "2";
            }
            if ( renamedFileName.indexOf(".Z_") > -1 ){
            	compGb = "1";
            }
            compileField(++i, compGb, this.al_FieldProps[i]);

            //이어받기 사용여부
            compileField(++i, TelegramKeys.FIUSC_RESUME_YN, this.al_FieldProps[i]);
            
            //<< 전문 완성
            
            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;
        }
    }

    /**
     * 실제 송신할 전문의 총길이를 리턴해준다.
     */
    public int getSendLength()
    {
        try {
            return REAL_SEND_LENGTH;  //실 DATA BYTE수
        } catch (Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI013";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error(e.getMessage(),e);
            return -1;
        }
    }

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

            //BATCH작업구분코드 (processCode)에 따른 프로퍼티 정보 가져오기
            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;
        }
    }

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

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

            //송신파일 일괄 암호화를 위해 송신파일목록 저장
            if (this.batchDoc.getBatchMsg().getHeader().getProcessType().equals("RS")) {
            	addRenamedFileList();
            }
            
            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 calculateSendLength () {
        try {
            for (int i=1; i< this.al_Field.size(); i++) {
                byte[] aField = (byte[]) this.al_Field.get(i);
                SEND_LENGTH += aField.length;
            }
            REAL_SEND_LENGTH = SEND_LENGTH + ((byte[]) this.al_Field.get(0)).length;
        } catch (Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIFJI025";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error(e.getMessage(),e);
            return false;
        }
        return true;
    }
    
	private boolean addRenamedFileList() {
    	
    	boolean result = false;
        String fileDir = batchDoc.getBatchMsg().getHeader().getFilePath();
        String fileNm  = batchDoc.getBatchMsg().getHeader().getRenamedFileName();
        String processCode = batchDoc.getBatchMsg().getHeader().getProcessCode();
        String institutionCode = batchDoc.getBatchMsg().getHeader().getInstitutionCode();
        
		//거래구분 코드 설정
		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;
			}
		}
        
        if (fileDir.charAt(fileDir.length()-1) != File.separatorChar) {
            fileDir = fileDir + this.getSeparator();
        }
        
        File filePath = new File(fileDir);
        final String filePattern = fileNm.substring(bizCodeStartIndex, bizCodeEndIndex);
    	
        // 기존 거래 시 오류로 남아있는 .org 파일을 모두 삭제
//        for (File listFile : filePath.listFiles()) {// 20250827 0640 에서 지운다.
//        	if (listFile.getName().endsWith(".org")) listFile.delete();
//        }
        
        result = true;

//        String[] fileList = filePath.list(new FilenameFilter() {
//
//			@Override
//			public boolean accept(File dir, String name) {
//				return name.contains(filePattern);
//			}
//        });
//        
//        
//        if (fileList.length > 0) {
//        	this.batchDoc.getBatchMsg().setFileList(Arrays.asList(fileList));
//        	result = true;
//        }
        
        return result;
    }
    
    //---------------- 특정 필드값을 구하는 부분
    // 전문종별코드 필드값 리턴
    public String getTelegramType()
    {
    	String telegramNo = super.getFieldValueString(5);
    	if ( telegramNo.length() < 8 ) return "";
		return telegramNo.substring(0,3) + telegramNo.substring(6,7);
    }

    //응답코드 필드값 리턴
    public String getResCode()
    {
		return super.getFieldValueString(9);
    }

}
