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

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
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.common.LogUtil;
import com.eactive.eai.common.exception.ExceptionUtil;


public class SEND_INSBT_0600 extends DefaultTelegram implements TelegramService
{
	private Properties telegramInfo;
    private String filename;
    private File f;
    private FileInputStream fin ;
    private long fileSize = 0;

    public SEND_INSBT_0600() {
    }


    /**
     * 지정된 전문의 구성 필드 배열 선언, 요구송신 파일 Start DB로그
     */
    public boolean doPreExecute() {
		if (!super.doPreExecute()) return false;

		//요구송신 파일 Start DB로그
		try {
			telegramInfo = getTelegramInfo();
			LogUtil.setLogFileStart(batchDoc);
		} 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;
		}
		return true;
	}

    public boolean doExecute() {
        try {

        	String  strFileName = batchDoc.getBatchMsg().getHeader().getFileName();
            logger.info("{} [0600] telegram : filename [" + strFileName + "]", logHeader);
            //
            compileField(0, telegramInfo.getProperty(TelegramKeys.TRANSACTION_CODE), this.al_FieldProps[0]);
            compileField(1, telegramInfo.getProperty(TelegramKeys.BIZ_GBN), this.al_FieldProps[1]);
            long lnLength = this.getSendLength();
            compileField(2, String.valueOf(lnLength), this.al_FieldProps[2]);
            // 자료구분 (HDB_DAT_GBN), "T"
            compileField(3, telegramInfo.getProperty(TelegramKeys.DAT_GBN), this.al_FieldProps[3]);
            // ins_id	보험사기관 ID	char	3	AN	MY_INST_CODE	false	0		0	KHG
            compileField(4, telegramInfo.getProperty(TelegramKeys.HDB_SND_ID), this.al_FieldProps[4]);
            // bak_cls	은행 구분	char	2	AN	INST_TYPE	false	0		0	bak_cls
            compileField(5, telegramInfo.getProperty(TelegramKeys.HDB_SND_CLS), this.al_FieldProps[5]);
            // bak_id	은행  ID	char	3	AN	OTHER_INST_CODE	false	0		0	bak_id
            compileField(6, telegramInfo.getProperty(TelegramKeys.BANK_CODE), this.al_FieldProps[6]);
            // doc_code	전문종별 코드	char	4	AN	KIND_CODE	false	0		0	doc_code
            compileField(7, this.getFldTelegramType(), this.al_FieldProps[7]);
            // biz_code	거래구분 코드	char	6	AN	TX_CODE	false	0		0	biz_code
            compileField(8, batchDoc.getBatchMsg().getHeader().getBizCode(), this.al_FieldProps[8]);
            // tra_flag	송수신 FLAG	numeric	1	NN	SNR_TYPE	false	0		0	tra_flag  5
            compileField(9, telegramInfo.getProperty(TelegramKeys.TRA_FLAG_SEND), this.al_FieldProps[9]);
            // doc_status	STATUS	numeric	3	NN		false	0		0	000
            compileField(10, "000", this.al_FieldProps[10]);
            // ret_code	응답코드	char	3	AN	RESPONSE_CODE	false	0		0	ret_code
            compileField(11, TelegramKeys.RPS_HDB_RET_CODE_SUCCESS, this.al_FieldProps[11]);
            // snd_date	전문전송일	numeric	8	NN		false	0		0	$DATE(YYYYMMDD)
            compileField(12, TelegramKeys.getYYYYMMDD(), this.al_FieldProps[12]);
            // snd_time	전문전송시간	numeric	6	NN		false	0		0	$TIME(hhmmss)
            compileField(13, TelegramKeys.getHHMMSS(), this.al_FieldProps[13]);
            // bak_docseq	은행 전문번호	numeric	8	NN		false	0		0	00000000
            compileField(14, "0000000", this.al_FieldProps[14]);
            // ins_docseq	보험사 전문번호	numeric	8	NN		false	0		0	00000000
            compileField(15, TelegramKeys.RPS_HDB_RSV_DOCSEQ, this.al_FieldProps[15]);
            // txn_date	거래발생일	numeric	8	NN	TX_DATE	false	0		0	txn_date
            compileField(16, TelegramKeys.getYYYYMMDD(), this.al_FieldProps[16]);
            // tot_file	전체 파일 수	numeric	2	NN		false	0		0	01
            compileField(17, "01", this.al_FieldProps[17]);
            // cur_file	현재 파일 순번	numeric	2	NN		false	0		0	01
            compileField(18, "01", this.al_FieldProps[18]);
            // doc_name	현재 파일명	char	30	AN	FILE_NAME	false	0		0	doc_name
            compileField(19, strFileName, this.al_FieldProps[19]);
            // cur_tot	현재파일전체전문수	numeric	2	NN	TOT_BLOCK_NO	false	0		0	cur_tot
            compileField(20, "01", this.al_FieldProps[20]);
            // cur_now	현재파일현재순번	numeric	2	NN	CUR_BLOCK_NO	false	0		0	cur_now
            compileField(21, "01", this.al_FieldProps[21]);
            // doc_case	전문CASE명	char	6	AN		false	0		0	doc_case
            compileField(22, "", this.al_FieldProps[22]);
            // bak_ext	은행추가정의	char	30	AN		false	0		0	bak_ext
            compileField(23, TelegramKeys.RPS_HDB_SND_EXT, this.al_FieldProps[23]);
            // ins_ext	보험사추가정의	char	30	AN		false	0		0	ins_ext
            compileField(24, TelegramKeys.RPS_HDB_RSV_EXT, this.al_FieldProps[24]);
            //<< 전문 완성
            return true;
        } catch (Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIJI001";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( e.getMessage(), e);
        }
        return false;
    }

    /**
     * 실제 송신할 전문의 총길이를 리턴해준다.
     */
    public int getSendLength()
    {
        try {
            int nSumFormalField = 0;
            for (int i=0; i<this.al_FieldLength.length ; i++) {
                String strFieldLength = this.al_FieldLength[i];
                if (!strFieldLength.equalsIgnoreCase(FIELD_NO_LENGTH)) {
                    try {
                        int nFldCnt = Integer.parseInt(strFieldLength);
                        nSumFormalField = nSumFormalField + nFldCnt;
                    } catch(Exception ex) {
                        logger.error( ex.getMessage(), ex);
                        byte[] aField = (byte[])this.al_Field.get(i);
                        nSumFormalField = nSumFormalField + aField.length;
                    }
                }
            }

            // 전체 전문의 길이를 여기에서...
            String fileDir = batchDoc.getBatchMsg().getHeader().getFilePath();
            String fileNm  = batchDoc.getBatchMsg().getHeader().getRenamedFileName();

            this.filename = fileDir+ File.separator + fileNm;
            this.f = new File(this.filename);
            if (!f.exists()) // 파일이 없으면 리턴 False
            {
                logger.debug("{}  the File does not exist!!! ["+this.filename+"]", logHeader);
                String[] msgArgs = new String[1];
                msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
                String errCode = "BECEAIJI022";
                String errMsg = ExceptionUtil.getErrorCode (errCode, msgArgs);
                this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
                return -1;
            }
            this.fileSize = f.length();
            int nLength = (int)f.length() + nSumFormalField;
            fin = new FileInputStream(f);

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

    /**
     * 비정형 필드에 대한 송수신 길이를 계산해서 리턴해준다.
     * 필드(idx)가 비정형 필드(XX)인지 점검하고 , 해당 필드에 대한 예상 길이를 계산하여 리턴하도록 한다
     * 비정형 필드를 가지고 있는 개별 Telegram Class 에서 오버라이드 필요.
     */
    public int getCalculatedLength(int idx)
    {
         try {
            //  여기서는 전송대상인 파일의 크기를 리턴해준다.
            logger.info("{} batch transefet job : Target file size = ["+this.fileSize+"]", logHeader);

            batchDoc.getBatchMsg().getHeader().setFileSize(this.fileSize);


            return (int)this.fileSize;
         } catch(Exception e) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIJI005";
            String errMsg = ExceptionUtil.getErrorCode (e, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( e.getMessage(), e);
            return -1;
         }
    }

    /**
     * 여기서는 파일을 닫는다.
     */
    public boolean doPostExecute() {
        try {
            if (!super.doPostExecute()) return false;

			//DB로그에 남길 파일 헤더,트레일러 내용 설정
			super.setFileHeaderAndTrailer(f);

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

            fin.close();
            logger.info("{}  doPostExecute called : file close", logHeader);
            return true;

        } catch (Exception ex) {
            String[] msgArgs = new String[1];
            msgArgs[0] = this.batchDoc.getBatchMsg().getHeader().getProcessCode();
            String errCode = "BECEAIJI002";
            String errMsg = ExceptionUtil.getErrorCode (ex, errCode, msgArgs);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(errMsg);
            logger.error( ex.getMessage(), ex);
            return false;
        }
    }

    /**
     * OffSet은 FileInputStream 에 의해 자동관리 된다.
     */
    public int getInformalFieldSendData(int idx, byte[] data) {
        try {
            int rc = fin.read(data, 0, data.length);
            
            long lnCurSize = batchDoc.getBatchMsg().getBody().getCurFileSize() + rc;
            batchDoc.getBatchMsg().getBody().setCurFileSize(lnCurSize);  //파일사이즈 설정 (전송 진행상태 확인용)
            return rc;
            
        } catch (Exception ex) {
            logger.error("{} ★★★★★ 송신 파일 데이터 READ 시 오류 발생 !! ★★★★★", logHeader, ex);
            this.batchDoc.getBatchMsg().getBody().setErrorMsg(ex.toString());
            return -1;
        }
    }

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

}
