/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACContJgshaReqInfCt
*	ソースファイル名	：JBSbatACContJgshaReqInfCt.java
*	作成者				：富士通　
*	作成日				：2015年11月26日
*＜機能概要＞
*　コンテンツ事象者間精算依頼情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
#	v20.00.00	2015/11/26	FJ）窪田	【OM-2015-0002625】性能障害(新規作成)
#	v20.00.01	2015/12/16	FJ）窪田	【OM-2015-0002625】性能障害(新規作成)【再】
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JACBatCommon;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM277;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.util.JBSbatAplConst;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACContJgshaReqInfCt extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ディレイド処理依頼番号 **/
	private String dlydTrnReqNo = null;

	/** 電子ファイル管理番号 **/
	private String efileKanriNo = null;

	/** ジョブID **/
	private String jobId = null;
	
	/** データ件数 */
	private int count = 0;

	/** 事業者間精算依頼ファイル定義 */
	private static final String DEF_JGSHA_REQ_INF = "ACIFM277.def";

	/** 事業者間精算依頼ファイル名 */
	private static final String JGSHA_REQ_INF_NAME = "ACIFM277000.csv";

	/** 中間ファイルディレクトリ */
	private static final String MID_DIR_AC = "MID_DIR_AC";

	/** プロパティキー(出力ファイル定義ディレクトリ) */
	public static final String AC_DIR_IND = "IND";

	/** 文字コード - Shift_JIS */
	private static final String ENCODE_SJIS = "Shift_JIS";
	
	/** 文字セット(win31j, ms932) */
	public static final String CHAR_SET_WIN31J = "Windows-31J";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		this.jobId = commonItem.getJobid();

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputFileUtil outputFileUtil = null;
		String outputFilePath = null;
		
		// コンテンツ事業者間精算ダウンロード依頼パラメータの取得
		
		String[] contJgshaDlParamList = this.getDlydShoriIrai();	
		
		// 戻り値がnullの場合は処理を終了する
		if ((contJgshaDlParamList) == null)
		{
			return null;
		}

		String[] contJgshaParam = contJgshaDlParamList[0].split(",");

		//フォーマットチェック（データ部のチェック）
		// 要素数が4でない場合
		if(contJgshaParam.length != 4)
		{
			// コネクションのロールバック
			commonItem.getConnection().rollback();

			// ディレイド処理依頼結果更新
			JCCBatCommon.updateShoriIraiResult(commonItem, dlydTrnReqNo, JACStrConst.DLYD_TRN_RSLT_CD_SYS_ERR, null);

			// コネクションのコミット
			commonItem.getConnection().commit();

			// システムエラーログの出力
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0530CE,
							new String[]{"電子ファイルに登録されているファイルの項目数(" + contJgshaParam.length + ",電子ファイル管理番号：" + efileKanriNo + ")"});
		}

		try
		{
			// ファイルパス（パス + ファイル名）の取得
			outputFilePath = this.rnktPath(JBSbatAplConst.getAplConstValue(MID_DIR_AC), JGSHA_REQ_INF_NAME);
	
			// ファイル形式の設定
			outputFileUtil = new JBSbatOutputFileUtil(outputFilePath);
			outputFileUtil.setEncode(ENCODE_SJIS);		// 文字コード
			outputFileUtil.setLine(JACStrConst.LINE_LF);			// 改行コード
			// ファイル生成
			outputFileUtil.createWriter();
		}
		catch (Exception ex)
		{
			// コンテンツ事象者間精算依頼情報ファイル作成失敗
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EDKB0030CE,
					new String[] {outputFilePath});
			throw ex;
		}

		/** 事業者間精算依頼ファイル書込み */
		try
		{
			// 定義ファイル設定
			String defFilePath = rnktPath(JBSbatAplConst.getAplConstValue(AC_DIR_IND), DEF_JGSHA_REQ_INF);
			JBSbatDefFileUtil defData = new JBSbatDefFileUtil(defFilePath, outputFileUtil);
			
			// ファイル出力項目設定
			JBSbatServiceInterfaceMap outDataMap = new JBSbatServiceInterfaceMap();

			super.logPrint.printDebugLog("ディレイド処理依頼内容：" + contJgshaParam);
			outDataMap.set(JBSbatACIFM277.DLYD_TRN_REQ_NO, dlydTrnReqNo);			// ディレイド処理依頼番号
			outDataMap.set(JBSbatACIFM277.CONT_SVC_CD_LIST, contJgshaParam[0]);		// コンテンツサービスコードリスト
			outDataMap.set(JBSbatACIFM277.CONT_SVC_NM, contJgshaParam[1]);			// コンテンツ名
			outDataMap.set(JBSbatACIFM277.TRGT_PRD_STAYMD, contJgshaParam[2]);		// 対象期間開始日
			outDataMap.set(JBSbatACIFM277.TRGT_PRD_ENDYMD, contJgshaParam[3]);		// 対象期間終了日
			
			// ファイル出力
			outputFileUtil.print(outDataMap, defData);

			// ディレイド処理依頼結果更新
			JCCBatCommon.updateShoriIraiResult(commonItem, dlydTrnReqNo, JACStrConst.DLYD_TRN_RSLT_CD_FIN, null);
		}
		finally
		{
			if (outputFileUtil != null)
			{
				outputFileUtil.close();
			}
		}
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * ディレイド処理依頼を取得
	 * @return strDlydList ディレイド処理依頼
	 * @throws Exception
	 */
	private String[] getDlydShoriIrai() throws Exception 
	{
		// ディレイド処理依頼取得
		ArrayList<HashMap<String, Object>> dlydShoriIraiList
					= JCCBatCommon.getShoriIraiInfo(commonItem, JACStrConst.REQ_JOB_ID_ACSV0020);

		// ディレイド処理依頼が存在しなかった場合
		if ((dlydShoriIraiList) == null)
		{
			//コンテンツ事業者間精算電子ファイル登録処理を終了します。
			return null;
		}

		// ディレイド処理依頼情報から最後のHashMapを取得する。
		HashMap<String, Object> dlydMap = dlydShoriIraiList.get(dlydShoriIraiList.size() - 1);

		dlydTrnReqNo = dlydMap.get("DLYD_TRN_REQ_NO").toString();

		//電子ファイル管理番号
		efileKanriNo = dlydMap.get("INPUT_EFILE_KANRI_NO").toString();

		// 実ファイル存在チェック
		if (null == ((byte[])dlydMap.get("INPUT_EFILE")))
		{

			// ディレイド処理依頼結果更新
			JCCBatCommon.updateShoriIraiResult(commonItem, dlydTrnReqNo, JACStrConst.DLYD_TRN_RSLT_CD_WORK_ERR, null);

			// マイナーエラー処理
			commonItem.addErrorCount(1);

			// 実ファイル(解凍済)が存在しない場合はマイナーエラーとして処理を終了
			commonItem.getLogPrint().printBusinessErrorLog(
					JPCBatchMessageConstant.EKKB0520CE, new String[]{"電子ファイル管理テーブルの電子ファイル", "(電子ファイル管理番号:" + efileKanriNo + ")"});
			return null;
		}

		// マップから実ファイルを取得
		byte[] dlydByte = (byte[])dlydMap.get("INPUT_EFILE");
		
		// ファイルの中身を取得する
		String dlydString = new String(dlydByte, CHAR_SET_WIN31J);

		// 文字列から改行コードで分割
		String[] strDlydList = dlydString.split(JACBatCommon.chgKaigyo(JACStrConst.LINE_CRLF));

		// 配列の第１要素が空の場合、
		if (null == (strDlydList[0]))
		{
			// ディレイド処理依頼結果更新
			JCCBatCommon.updateShoriIraiResult(commonItem, dlydTrnReqNo, JACStrConst.DLYD_TRN_RSLT_CD_WORK_ERR, null);

			// マイナーエラー処理
			commonItem.addErrorCount(1);

			// 業務エラーログの出力
			commonItem.getLogPrint().printBusinessErrorLog(
					JPCBatchMessageConstant.EKKB0520CE, new String[]{"電子ファイル管理テーブルの電子ファイル内容の", "(電子ファイル管理番号:" + efileKanriNo + ")"});
			return null;
		}
		return strDlydList;
	}
	/**
	 * パス文字列の連結
	 * 連結するパス文字列にパス区切り文字の設定を制御する。
	 * @param path1 パス文字列
	 * @param path2 パス文字列
	 * @return 連結したパス文字列
	 */
	private String rnktPath(String path1, String path2)
	{
		String pathDlmt = "/";
		if (path1.indexOf("\\") > -1 || path2.indexOf("\\") > -1)
		{
			pathDlmt = "\\";
		}
		if (!path1.endsWith(pathDlmt))
		{
			return path1 + pathDlmt + path2;
		}
		return path1 + path2;
	}
}
