/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatCKNaiHuryoCstInfAdd
 *	ソースファイル名	：JBSbatCKNaiHuryoCstInfAdd.java
 *	作成者				：富士通　
 *	作成日				：2012年01月28日
 *＜機能概要＞
 *　内部不良顧客情報登録部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/01/28	FAP)神吉	新規作成
 *	v3.00.00	2012/06/10  FAP)神吉	【IT2-2012-0000731】障害対応(ファイルパラメータ不正エラー)
 *	v3.01.00	2012/07/17	FAP)神吉	【ST2-2012-0001365】顧客電子ファイル管理登録対応
 *	v3.02.00	2012/09/06	FAP)神吉	【ST1-2012-0000524】顧客電子ファイル管理登録対応
 *	v3.03.00	2012/11/23	FJ)柳		【TAI-2012-0000095】対応
 *	v3.04.00	2012/12/04	FJ)柳		【ST4_2012_0000139】圧縮解凍対応
 *	v8.00.00	2014/05/16	FJ)江藤		【ANK-2023-00-00】【ＮＯ．１４０２】【MVNO】TCA不払者情報交換対応
 *                                       CKIFM005002.csv(加入者交換情報)の電子ファイル管理登録処理を削除
 *
 *********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JCCCompressFileUtil;
import eo.common.util.JCCFileUtil;
import eo.common.util.JCCFrameworkException;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.application.JCCbatFrameworkException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.log.JBSbatLogUtil;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatCKNaiHuryoCstInfAdd extends JBSbatBusinessService {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */

	/** テーブル(顧客電子ファイル管理) */
	private static final String D_TBL_NAME_CK_T_CUST_EFILE_KNRI = "CK_T_CUST_EFILE_KNRI";

	/** テーブルアクセスクラス(顧客電子ファイル管理) */
	private JBSbatSQLAccess db_CK_T_CUST_EFILE_KNRI = null;

	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	public static final String S_LINE_SEPARAOR_LF = "\n";

	/**
	 * 出力ファイル格納先パス
	 */
	private String file_path = "";

	/**
	 * 出力ファイル格納先パス１
	 */
	private String mid_dir_ck_path1 = "";
	// 20140516 ANK-2023-00-00 DEL START
//	/**
//	 * 出力ファイル格納先パス２
//	 */
//	private String mid_dir_ck_path2 = "";
	// 20140516 ANK-2023-00-00 DEL END
	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		// DBアクセスクラスを生成します
		db_CK_T_CUST_EFILE_KNRI = new JBSbatSQLAccess(commonItem,
				D_TBL_NAME_CK_T_CUST_EFILE_KNRI);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */

		// フリー項目から格納先を取得します
		file_path = commonItem.getFreeItem();

		// 取得出来なかった場合、エラーとします。
		if (file_path.length() == 0) {
			throw new JBSbatBusinessException(
					JPCBatchMessageConstant.EKKB0130CE,
					new String[] { "フリー項目：送信ファイル格納パス名" });
		}

		mid_dir_ck_path1 = file_path + "CKIFM005001.csv";
		// 20140516 ANK-2023-00-00 DEL START
//		mid_dir_ck_path2 = file_path + "CKIFM005002.csv";
		// 20140516 ANK-2023-00-00 DEL END
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */
		super.logPrint.printDebugLog("execute_START");

		BufferedReader br = null;
		// 20140516 ANK-2023-00-00 DEL START
//		BufferedReader br2 = null;
		// 20140516 ANK-2023-00-00 DEL END
		String zipPath =  null;
		String zipFileNm = null;
		// 圧縮ファイル格納作業ディレクトリの取得とチェック
		 String outDirPath = getCompTempDir();
		// 圧縮レベル
		String compLevel =  getCompLevel();
		try {

			// 1行ずつ読込む
			br = new BufferedReader(new FileReader(mid_dir_ck_path1));
			
			String line1 = "";
			// ファイルの入力行数分の繰り返し
			while ((line1 = br.readLine()) != null) {
				// ログレベルがデバッグモードの場合
				if (super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG)) {
					super.logPrint.printDebugLog("line1：" + line1);
				}
				
				//圧縮処理実行
				zipPath = JCCCompressFileUtil.compressFile(file_path + line1, outDirPath, "", "0", compLevel);

				// 電子ファイル管理登録部品呼び出し。返却値に電子ファイル管理番号をもらう。
				String[] denshiFile = JCCBatCommon.createDenshiFile(commonItem,
						"0000",zipPath, "20991231");
				
				//圧縮ファイル名
				zipFileNm = zipPath.substring( zipPath.lastIndexOf(File.separator)+1,zipPath.length());
				
				// 顧客電子ファイル管理登録
				insertCustEfileKnri(denshiFile, zipFileNm);
				
				//zipファイル削除
				removeDir(zipPath);
				zipPath = null;
				
			}
		} catch (IOException e) {
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{mid_dir_ck_path1});
			
		} finally {
			if (br != null) {
				br.close();
			}
			//zipファイル削除
			if(zipPath != null) {
				removeDir(zipPath);
			}
		}
		// 20140516 ANK-2023-00-00 DEL START
//		zipPath = null;
//		try{
//			// 1行ずつ読込む
//			br2 = new BufferedReader(new FileReader(mid_dir_ck_path2));
//
//			String line2 = "";
//			File file = null;
//			// ファイルの入力行数分の繰り返し
//			while ((line2 = br2.readLine()) != null) {
//				// ログレベルがデバッグモードの場合
//				if (super.logPrint.chkLogLevel(JBSbatLogUtil.MODE_DEBUG)) {
//					super.logPrint.printDebugLog("line2：" + line2);
//				}
//				
//				//圧縮処理実行
//				zipPath = JCCCompressFileUtil.compressFile(file_path + line2, outDirPath, "", "0", compLevel);
//				
//				// 電子ファイル管理登録部品呼び出し。返却値に電子ファイル管理番号をもらう。
//				String[] denshiFile2 = JCCBatCommon.createDenshiFile(
//						commonItem, "0000",zipPath, "20991231");
//				
//				file = new File(zipPath);
//				zipFileNm = file.getName();
//
//				// 顧客電子ファイル管理登録
//				insertCustEfileKnri(denshiFile2, zipFileNm);
//				
//				//zipファイル削除
//				removeDir(zipPath);
//				zipPath = null;
//				
//			}
//		} catch (IOException e) {
//			throw new JBSbatBusinessException("EKKB0020CE", new String[]{mid_dir_ck_path2});
//			
//		} finally {
//
//			if (br2 != null) {
//				br2.close();
//			}
//			
//			//zipファイル削除
//			if(zipPath != null) {
//				removeDir(zipPath);
//			}
//		}
		// 20140516 ANK-2023-00-00 DEL END

		super.logPrint.printDebugLog("execute_END");
		return null;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_CK_T_CUST_EFILE_KNRI.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数で設定項目マップを作ります。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 * 	 	電子ファイル管理番号				EFILE_KANRI_NO
	 * 	 	世代登録年月日時分秒				GENE_ADD_DTM
	 * 	 	電子ファイル作成年月日時分秒				EFILE_SAKSEI_DTM
	 * 	 	顧客電子ファイル種別コード				CUST_EFILE_SBT_CD
	 * 	 	電子ファイル種別番号				EFILE_SBT_NO
	 * 	 	電子ファイル名				EFILE_NM
	 * 	 	電子ファイル処理状態フラグ				EFILE_TRN_STAT_FLG
	 * 	 	登録年月日時分秒				ADD_DTM
	 * 	 	登録オペレータアカウント				ADD_OPEACNT
	 * 	 	更新年月日時分秒				UPD_DTM
	 * 	 	更新オペレータアカウント				UPD_OPEACNT
	 * 	 	削除年月日時分秒				DEL_DTM
	 * 	 	削除オペレータアカウント				DEL_OPEACNT
	 * 	 	無効フラグ				MK_FLG
	 * 	 	登録運用年月日				ADD_UNYO_YMD
	 * 	 	登録処理ＩＤ				ADD_TRN_ID
	 * 	 	更新運用年月日				UPD_UNYO_YMD
	 * 	 	更新処理ＩＤ				UPD_TRN_ID
	 * 	 	削除運用年月日				DEL_UNYO_YMD
	 * 	 	削除処理ＩＤ				DEL_TRN_ID
	 * </pre>
	 * <p>
	 * 
	 * @param setParam
	 *            設定項目の値。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_EFILE_KNRI_PKINSERT(Object[] setParam)
			throws Exception {
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("EFILE_KANRI_NO", setParam[0]);
		setMap.setValue("GENE_ADD_DTM", setParam[1]);
		setMap.setValue("EFILE_SAKSEI_DTM", setParam[2]);
		setMap.setValue("CUST_EFILE_SBT_CD", setParam[3]);
		setMap.setValue("EFILE_SBT_NO", setParam[4]);
		setMap.setValue("EFILE_NM", setParam[5]);
		setMap.setValue("EFILE_TRN_STAT_FLG", setParam[6]);
		setMap.setValue("ADD_DTM", setParam[7]);
		setMap.setValue("ADD_OPEACNT", setParam[8]);
		setMap.setValue("UPD_DTM", setParam[9]);
		setMap.setValue("UPD_OPEACNT", setParam[10]);
		setMap.setValue("DEL_DTM", setParam[11]);
		setMap.setValue("DEL_OPEACNT", setParam[12]);
		setMap.setValue("MK_FLG", setParam[13]);
		setMap.setValue("ADD_UNYO_YMD", setParam[14]);
		setMap.setValue("ADD_TRN_ID", setParam[15]);
		setMap.setValue("UPD_UNYO_YMD", setParam[16]);
		setMap.setValue("UPD_TRN_ID", setParam[17]);
		setMap.setValue("DEL_UNYO_YMD", setParam[18]);
		setMap.setValue("DEL_TRN_ID", setParam[19]);

		// DBアクセスを実行します
		db_CK_T_CUST_EFILE_KNRI.insertByPrimaryKeys(setMap);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 
	 * 顧客電子ファイル管理登録処理を行います。
	 * 
	 * @param String
	 *            [] denshiFile
	 * @param String
	 *            fileName
	 * 
	 * @throws Exception
	 *             メソッド内で発生した例外全般。
	 */
	private void insertCustEfileKnri(String[] denshiFile, String fileName)
			throws Exception {
		// 運用日付取得
		String opeDtm = JKKBatCommon.getOpeDateTimeStamp(commonItem);

		// システム日付を取得
		String sysDate = JCCBatCommon.getSysDateTimeStamp();

		// 電子ファイル管理番号を取得
		String eFileKanriNo = denshiFile[0];

		// 世代登録年月日時分秒
		String geneAddDtm = denshiFile[1];

		// 登録する顧客電子ファイル管理のパラメータを設定します
		String[] setParam = { eFileKanriNo, geneAddDtm, opeDtm, "01", "",
				fileName, "1", sysDate, batchUserId, sysDate, batchUserId, "",
				"", "0", "", "", "", "", "", "" };

		executeCK_T_CUST_EFILE_KNRI_PKINSERT(setParam);
	}

	
	/**
	 * アプリケーションプロパティファイルからの圧縮ファイル格納作業ディレクトリの
	 * 取得とチェック
	 * <br>
	 * @return 圧縮ファイル格納作業ディレクトリ
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private String getCompTempDir() throws JCCbatFrameworkException
	{
		// プロパティファイルから圧縮ファイル格納作業ディレクトリの読み込み
		String outDirPath = JCCBatCommon.getApplicationConst("DIR_COMP_TMP");
		if(outDirPath == null)
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮ファイル格納作業ディレクトリの定義がありません。");				
		}
		
		// 圧縮ファイル格納作業ディレクトリのFileインスタンスの生成
		File f_outDirPath = new  File(outDirPath);
		// 圧縮ファイル格納作業ディレクトリのチェック(存在チェック、ディレクトリチェック、書き込み権限チェック)
		if(!f_outDirPath.exists() || !f_outDirPath.isDirectory() || !f_outDirPath.canWrite())
		{
			throw new JCCbatFrameworkException("圧縮ファイル格納作業ディレクトリに書き込めません。値：" + outDirPath);
		}
		
		return outDirPath;
	}
	

	/**
	 * アプリケーションプロパティファイルから圧縮レベルを取得する。
	 * <br>
	 * @return 圧縮レベル
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private String getCompLevel() throws JCCbatFrameworkException 
	{
		// 圧縮レベル
		String compLevel = JCCBatCommon.getApplicationConst("COMP_LEVEL");
		if (!JCCBatCommon.isNotNull(compLevel))
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮レベルの定義がありません。");
		}
		
		// 圧縮レベル（範囲チェック用）
		int intCompLevel = 0;
		try
		{
			intCompLevel = Integer.parseInt(compLevel);
		}
		catch (NumberFormatException e)
		{
			throw new JCCbatFrameworkException("圧縮レベルの定義が不正です。");
		}
		
		// 圧縮レベルの範囲確認
		if (intCompLevel < 1 || 9 < intCompLevel)
		{
			throw new JCCbatFrameworkException("圧縮レベルが範囲外の設定です。");
		}
		return compLevel;
	}
	
	/**
	 * 引数のファイルが残っている場合、そのファイルが入っているディレクトリごと削除する。
	 * @param filePath 削除対象のファイルパス
	 * @throws JCCFrameworkException
	 */
	private void removeDir(String filePath) throws JCCFrameworkException
	{
		// 作業ディレクトリが残っていた場合、削除
		if(filePath != null)
		{
			File f_dir = new File(new File(filePath).getParent());
			if(f_dir.exists())
			{
				JCCFileUtil.removeDir(new File(filePath).getParent());
			}

		}
	}
}
