/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKMansRsvIfRnk
*	ソースファイル名	：JBSbatKKMansRsvIfRnk.java
*	作成者				：富士通　
*	作成日				：2012年05月31日
*＜機能概要＞
*　マンション受信情報チェック（整合性チェック）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/05/31  富士通		新規作成
*	v56.00.00	2021/11/19	富士通)杉本	【ANK-4127-00-00】eSMエラー整合性チェック改善対応
*	v56.00.01	2022/02/26	富士通)杉本	OM-2022-0000368
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;

import eo.business.common.JBSbatBusinessService;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKMansRsvIfRnk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	// ANK-4127-00-00 MOD START
//	/**エラーP-IDマップ*/
	/**オーナー情報チェックエラーP-IDマップ*/
	// ANK-4127-00-00 MOD END
	private HashMap<Integer, String> errPidMap = null;
	// ANK-4127-00-00 ADD START
	/** エラー情報マップ */
	private HashMap<Integer, String> errInfMap = new HashMap<Integer, String>();
	/** EO22J1000J0_マンションオーナ情報受信情報マージ */
	private static final String JOBID_EO22J1000J0 = "EO22J1000J0";
	/** EO22J1100J0_マンション提供方式情報マージ */
	private static final String JOBID_EO22J1100J0 = "EO22J1100J0";
	/** EO22J1200J0_マンション料金情報マージ */
	private static final String JOBID_EO22J1200J0 = "EO22J1200J0";
	/** EO22J1300J0_マンションキャンペーン情報マージ */
	private static final String JOBID_EO22J1300J0 = "EO22J1300J0";
	/** エラー区分：1 オーナーエラー情報 */
	private static final String ERR_KBN_1 = "1";
	/** エラー区分：2 オーナーエラー情報以外 */
	private static final String ERR_KBN_2 = "2";
	// ANK-4127-00-00 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		if(checkErrPid(inMap, getErrPidList()))
		{
			inMap.setOutFlg(true);
			outputBean.addOutMapList(inMap);
		}
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	//エラーPIDリスト作成
	private HashMap<Integer, String> getErrPidList() throws Exception
	{
		//再取得しない
		if(errPidMap != null)
		{
			return errPidMap;
		}
		// パラメータファイル名を取得
		String paramFile = super.commonItem.getFreeItem();
		String pidChk = "";
		// パラメータファイルを読み込み
		ArrayList<ArrayList<String>> csvFileList = convCsvFiletoList(paramFile);
		//PIDリスト
		HashMap<Integer, String> errMap = new HashMap<Integer, String>();
		if(csvFileList.size() == 0)
		{
			//読み込みファイル０件の場合
			return errPidMap = errMap;
		}

		int i = 0;
		for(ArrayList<String> lineData : csvFileList)
		{
			// ANK-4127-00-00 DEL START
//			if(lineData.size() != 1)
//			{
//				//不要？
//				throw new JBSbatBusinessException("EKKB0130CE", 
//						new String[] { "パラメータ項目数設定" + (i + 1) + "行目" });
//			}
//			else
//			{
			// ANK-4127-00-00 DEL END
			pidChk = lineData.get(0);
			if(!JBSbatCheckUtil.invoke(pidChk, new String[] { "hannkakuesuuji1" }))
			{
				super.commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", 
						new String[] { "P-IDエラーリスト " + (i + 1) + "行目" });
			}
			// ANK-4127-00-00 DEL START
//			}
			// ANK-4127-00-00 DEL END
			// ANK-4127-00-00 MOD START
//			errMap.put(i, pidChk);
			
			//エラー情報の取得
			String tmpStr = "";
			for(String str : lineData)
			{
				tmpStr = tmpStr + str;
			}
			
			//オーナーエラー情報とそれ以外のエラー情報を別のMapに設定する
			if (lineData.get(lineData.size()-1).equals(ERR_KBN_1))
			{
				errMap.put(i, pidChk);
			}
			else
			{
				errInfMap.put(i, tmpStr);
			}
			// ANK-4127-00-00 MOD END
			i++;
		}
		return errPidMap = errMap;
	}

	/**
	 * 引数で指定されたCSVファイル名からファイルの内容を一行ずつ読取り、カンマ区切りの文字を
	 * List格納する。格納した行データのArrayListをArrayList配列に順番に格納し返却する。
	 * 引数で指定されたファイルパスを取得し、返却する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param fileName ファイル名(パスを含む)
	 * @return ArrayList ファイル内データを格納したリスト
	 * @throws Exception 例外
	 */
	private ArrayList<ArrayList<String>> convCsvFiletoList(String fileName) throws Exception
	{
		ArrayList<ArrayList<String>> csvFileList = new ArrayList<ArrayList<String>>();
		FileReader fr = null;
		BufferedReader br = null;

		// CSV指定ファイルパスチェック
		if(null == fileName || ("").equals(fileName))
		{
			throw new JBSbatBusinessException("EKKB0130CE", new String[] { "読込ファイルパス未設定" });
		}
		
		try
		{
			// CSV指定ファイル読込み
			File file = new File(fileName);
			fr = new FileReader(file);
			br = new BufferedReader(fr);
			ArrayList<String> workList = null;
			String lineData = "";

			while (null != lineData)
			{
				// ワークリストを初期化
				workList = new ArrayList<String>();

				// CSVファイル一行読込み
				lineData = br.readLine();
				if(null != lineData && !("").equals(lineData))
				{
					// リストに格納された一行分のファイルデータを格納
					workList = convStringToList(lineData);
					csvFileList.add(workList);
				}
			}
		}
		catch (IOException e)
		{
			// 例外処理
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{fileName});
		}
		finally
		{
	        // ストリームを閉じる
	        if(null != br )
	        {
	            br.close();
	        }
	        if(null != fr)
	        {
	        	fr.close();
	        }
		}
		return csvFileList;
	}
	
	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとにArrayList格納する。
	 * @param commonItem バッチ共通パラメータ電文
	 * @param lineData 一行分のCSVデータ
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 **/
	private ArrayList<String> convStringToList(String lineData) throws Exception
	{
		// 戻り値格納用List
		ArrayList<String> resultList = new ArrayList<String>();

		// CSV指定ファイル読込み
		// 文字列リスト変換エスケープ処理に囲み文字の"を指定して呼出す。
		resultList = convEscapeStringToList(lineData, '"');

		return resultList;
	}
	
	/**
	 * 引数で指定されたCSVファイルの一行データを項目ごとに分割し、
	 * 引数の囲い文字を除外した状態でList格納する。
	 * @param  line 一行分のCSVデータ
	 * @param  kakoiMoji 囲み文字
	 * @return ArrayList 項目ごとにCSVデータを格納したList
	 * @throws Exception 例外
	 */
	private ArrayList<String> convEscapeStringToList(String line, char kakoiMoji) throws Exception
	{
		// 戻り値格納用List
		ArrayList<String> resultList = new ArrayList<String>();

		StringTokenizer st = new StringTokenizer(line, ",");
		StringBuffer bf = new StringBuffer();
		int len = 0;

		while (st.hasMoreElements())
		{
			String s = st.nextToken();
			bf = new StringBuffer();
			bf.append(s);
			len = bf.length();

			// 先頭文字が囲み文字の場合除去
			if(bf.charAt(0) == (kakoiMoji))
			{
				bf.delete(0, 1);
				len = len - 1;
			}

			// 終端文字が囲み文字の場合除去
			if(len > 1 && bf.charAt(len - 1) == (kakoiMoji))
			{
				bf.delete(len - 1, len);
			}

			// 戻り値となるリストに1項目分のデータ格納
			resultList.add(bf.toString());
		}

		// 1行分のデータを格納したListを返却
		return resultList;
	}

	//エラーPIDが含まれているかチェック
	private boolean checkErrPid(JBSbatServiceInterfaceMap inMap, 
			HashMap<Integer, String> errPidMap) throws Exception
	{
		boolean rslt = true;
		// OM-2022-0000368 MOD START
//		if(0 == errPidMap.size())
		if(0 == errPidMap.size() && 0 == errInfMap.size())
		// OM-2022-0000368 MOD END
		{
			return rslt;
		}
		if(null == inMap)
		{
			return false;
		}

		String pid = "";
		if(null != inMap.getString("P-ID"))
		{
			pid = inMap.getString("P-ID");
		}
		else if(null != inMap.getString("P_ID"))
		{
			pid = inMap.getString("P_ID");
		}

		if(errPidMap.containsValue(pid))
		{
			commonItem.getLogPrint().printDebugLog(
					"エラーデータが含まれています。P-ID:" + pid);
			return false;
		}
		// ANK-4127-00-00 ADD START
		//JOBIDで処理実施要否を判断
		String jobid = super.commonItem.getJobid();
		
		if (!jobid.equals(JOBID_EO22J1000J0))
		{
			//入力ファイルのキー情報を取得
			//CAT-IDに関しては、ファイルごとにキーが違うため、分岐の中で取得
			String mid = jobid.equals(JOBID_EO22J1300J0) ? inMap.getString("M-ID") : inMap.getString("M_ID");
			String catid = "";

			//実行中のJOBIDごとにエラー区分を変更してエラーデータが含まれているか確認
			//マンション提供方式情報マージ
			if (jobid.equals(JOBID_EO22J1100J0))
			{
				catid = inMap.getString("Cat_M_KNRI_NO");
				if(errInfMap.containsValue(pid+mid+catid+ERR_KBN_2))
				{
					commonItem.getLogPrint().printDebugLog(
							"エラーデータが含まれています。P-ID:" + pid + "、M-ID:" + mid + "、Cat_M管理番号:" + catid);
					return false;
				}
			}
			//マンション料金情報マージ
			else if (jobid.equals(JOBID_EO22J1200J0))
			{
				catid = inMap.getString("CAT_ID");
				if(errInfMap.containsValue(pid+mid+catid+ERR_KBN_2))
				{
					commonItem.getLogPrint().printDebugLog(
							"エラーデータが含まれています。P-ID:" + pid + "、M-ID:" + mid + "、Cat_M管理番号:" + catid);
					return false;
				}
			}
			//マンションキャンペーン情報マージ
			else
			{
				catid = inMap.getString("CAT_M_KANRI_NO");
				if(errInfMap.containsValue(pid+mid+catid+ERR_KBN_2))
				{
					commonItem.getLogPrint().printDebugLog(
							"エラーデータが含まれています。P-ID:" + pid + "、M-ID:" + mid + "、Cat_M管理番号:" + catid);
					return false;
				}
			}
		}
		// ANK-4127-00-00 ADD END
		return rslt;
	}
}
