/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCKSV904701CC.java
*   作成者          ：富士通
*   日付            ：2011年07月01日
*＜機能概要＞
*   BBモバイルより連携された情報を基にSYSIDを返却します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/1   FJ）関      新規作成
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.ECK0011B040CBSMsg;

/**
 *  BBモバイルログeoIDを取得する。
 * <BR>
 * @author 富士通
 */
public class JCKSV904701CC extends AbstractCommonComponent implements ICommonComponent
{
	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite executeMainTest(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		param.setControlMapData("returnCode", "0000");

		return param;
	}

	/**
	 * 共通コンポーネント実行
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeMain(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		String returnCd = "0"; // リターンコード（0:正常終了、1:一部エラー、9:システムエラー）
		
		/***************************************************/
		/** BBモバイルログeoID情報連携検索最大件数の取得   */
		/***************************************************/
		Integer maxCnt = null;
		Map<?, ?> result = callEZM0321A010(handle, param, "1", "CK_MAX_BB_CNT");
		String maxBbCnt = null;
		if (JCKPmpScParamHenshu.isSuccess(result))
		{
			maxBbCnt = JCKPmpScParamHenshu.getResultString(result, "EZM0321A010CBSMsg1List[0].work_param_sette_value");
			if (!JCKBPCommon.isNullOrBlank(maxBbCnt))
			{
				try
				{
					maxCnt = Integer.parseInt(maxBbCnt);
				}
				catch (Exception e)
				{
					returnCd = "9"; // システムエラー
					printErrorLog("業務パラメータから取得したBBモバイルログeoID情報連携検索最大件数が数値ではありません。(取得値：" + maxBbCnt + ")");
				}
			}
			else
			{
				returnCd = "9"; // システムエラー
				printErrorLog("業務パラメータからBBモバイルログeoID情報連携検索最大件数が取得できません。(パラメータID:CK_MAX_BB_CNT)");
			}
		}
		
		/***************************************************/
		/** BBモバイルログeoID取得                   */
		/***************************************************/
		// 入力パラメータ取得
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(fixedText);
		List<Map<String, String>> eoidList = (List)ccParam.get("eoidList");
		String sysDateTime = JCCBPCommon.getSysDateTime();
		int errCnt = 0;

		// 検索結果の結果リスト
		List<Map<String, String>> returnList = new ArrayList<Map<String, String>>();

		if ("0".equals(returnCd))
		{
			// eoID件数チェック
			if (eoidList.size() > maxCnt)
			{
				returnCd = "9"; // システムエラー
				printErrorLog("eoIDの件数がBBモバイルログeoID情報連携検索最大件数を超えています。（eoIDの件数：" + 
						eoidList.size() + "、BBモバイルログeoID情報連携検索最大件数：" + maxCnt + "）");
			}
		}

		if ("0".equals(returnCd))
		{
			for (int i = 0; i < eoidList.size(); i++)
			{

				boolean retErrFlg = false;
				
				Map<String, String> eoidMap = eoidList.get(i);
				
				String eoId = eoidMap.get("eoid");
				String riyoDate = eoidMap.get("riyo_date");
				String sysId = "";
				
				Map<String, String> bbMobileResultMap = new HashMap<String, String>();
				
				// eoIDまたは利用日時が未入力の場合、エラー
				if (JCKBPCommon.isNullOrBlank(eoId) || JCKBPCommon.isNullOrBlank(riyoDate))
				{
					retErrFlg = true;
					printDebugLog("eoIDまたは利用日時が未入力です（ " + (i + 1) + "件目、eoID：" + eoId  + " riyoDate：" + riyoDate + " ）");
				}
				else
				{
					// BBモバイルログeoID取得SCより会員情報を取得
					retErrFlg = createBbMobileResultMap(handle, param, result, eoId, null, riyoDate, bbMobileResultMap);
				}
				
				// エラーの場合
				if (retErrFlg)
				{
					// エラーカウントをインクリメントし、次のeoIDへ
					errCnt++;
					returnList.add(getReturnMap(eoId, ""));
					continue;
				}

				if (JCKBPCommon.isNullOrBlank(bbMobileResultMap.get("nayose_saki_sysid")))
				{
					// 名寄せ先SYSIDが無い場合、SYSIDをセット
					sysId = bbMobileResultMap.get("sysid");
				}
				else
				{
					// 名寄せ先SYSIDが有る場合、名寄せ先SYSIDをセット
					sysId = bbMobileResultMap.get("nayose_saki_sysid");
				}

				while(true)
				{
					// BBモバイルログeoID取得SCより会員情報を取得
					retErrFlg = createBbMobileResultMap(handle, param, result, null, sysId, sysDateTime, bbMobileResultMap);

					// エラーの場合
					if (retErrFlg)
					{
						// エラーカウントをインクリメントし、次のeoIDへ
						errCnt++;
						// 正常終了
						returnList.add(getReturnMap(eoId, ""));
						break;
					}

					if (JCKBPCommon.isNullOrBlank(bbMobileResultMap.get("nayose_saki_sysid")))
					{
						// 正常終了
						returnList.add(getReturnMap(eoId, bbMobileResultMap.get("sysid")));
						break;
					}
					else
					{
						// 名寄せ先SYSIDが有る場合、名寄せ先SYSIDをセット
						sysId = bbMobileResultMap.get("nayose_saki_sysid");
					}
				}
			}
		}

		/***************************************************/
		/** リターンコード設定処理                         */
		/***************************************************/
		if (errCnt == eoidList.size())
		{
			// エラーカウントがeoIDリストと同じ件数の場合、システムエラーとする
			returnCd = "9";
		}
		else if (errCnt > 0)
		{
			// 上記以外の場合、一部パラメータエラー
			returnCd = "1";
		}

		/***************************************************/
		/** 下りマッピング処理開始                         */
		/***************************************************/
		// 下りコントロールマップのセット
		JCKPmpScParamHenshu.setResultCtrlData(param, result, fixedText);

		// 下りユーザデータマップのセット
		// (処理結果はユーザ情報のリターンコードで通知する)
		Map userResult = new HashMap();
		userResult.put("returnList", returnList);
		userResult.put("return_cd", returnCd);
		JCKPmpScParamHenshu.setResultUserData(param, fixedText, userResult);

		/*************************************************/
		/** 処理結果の判定
		/*************************************************/
		// 処理なし

		return param;
	}

	/**
	 * BBモバイルログeoID取得SCの実行結果を取得します。
	 * @param handle
	 * @param param
	 * @param result
	 * @param eoId
	 * @param sysId
	 * @param riyoDate
	 * @param retMap
	 * @return 処理結果（true:エラーあり、false：エラーなし）
	 * @throws Throwable
	 */
	private boolean createBbMobileResultMap(SessionHandle handle, IRequestParameterReadWrite param, Map<?, ?> result, 
			String eoId, String sysId, String riyoDate, Map<String, String> retMap) throws Throwable
	{

		// BBモバイルログeoID取得SCより会員情報を取得
		result = callECK0011B040(handle, param, "1", eoId, sysId, riyoDate);

		// 処理結果判定
		if (!JCKPmpScParamHenshu.isSuccess(result))
		{
			printErrorLog("BBモバイルログeoID取得でエラーが発生しました。(eoID:" + eoId + "、SYSID:" + sysId + "、利用日時:" + riyoDate + ")");
			return true;
		}

		CAANMsg[] templateArray = JCKPmpScParamHenshu.getResultMsgList(result, ECK0011B040CBSMsg.ECK0011B040CBSMSG1LIST);
		
		// 検索結果が0件の場合
		if (isNullorEmpty(templateArray))
		{
			printErrorLog("BBモバイルログeoID取得でエラーが発生しました。(eoID:" + eoId + "、SYSID:" + sysId + "、利用日時:" + riyoDate + ")");
			return true;
		}

		retMap.put("sysid", JCKPmpScParamHenshu.getResultString(result, "ECK0011B040CBSMsg1List[0].sysid"));
		retMap.put("eoid", JCKPmpScParamHenshu.getResultString(result, "ECK0011B040CBSMsg1List[0].eoid"));
		retMap.put("nayose_saki_sysid", JCKPmpScParamHenshu.getResultString(result, "ECK0011B040CBSMsg1List[0].nayose_saki_sysid"));

		return false;
	}
	

	/**
	 * BBモバイルログeoID取得SCの実行
	 * @param handle
	 * @param param
	 * @param eoId
	 * @param sysId
	 * @param riyoDate
	 * @return 実行結果
	 * @throws Throwable
	 */
	private Map<?, ?> callECK0011B040(SessionHandle handle, IRequestParameterReadWrite param, String funcCd, String eoId, String sysId,
			String riyoDate) throws Throwable
	{
		
		/***************************************************/
		/** BBモバイルログeoID取得SCへの上りマッピング */
		/***************************************************/
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECK0011B040CBSMsg.KEY_EOID, eoId);
		param4serviceIf.put(ECK0011B040CBSMsg.KEY_SYSID, sysId);
		param4serviceIf.put(ECK0011B040CBSMsg.KEY_USE_DTM, riyoDate + "999");
		HashMap<String, Object> paramMap = JCKBPCommon.createScParam(param, ECK0011B040CBSMsg.class , param4serviceIf, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		printDebugLog("BBモバイルログeoID取得SC呼び出し開始（ eoID：" + eoId + " SYSID：" + sysId + " riyoDate：" + riyoDate + " ）");
		Map<?, ?> result = JCKPmpCommonUtil.scCallRun(param, handle, paramMap);
		printDebugLog("BBモバイルログeoID取得SC呼び出し完了" + result);

		return result;
	}

	/**
	 * SYSIDとeoIDを格納したマップを返却します。
	 * @param eoId
	 * @param sysId
	 * @return Map<String, String>
	 */
	private Map<String, String> getReturnMap(String eoId, String sysId)
	{
		HashMap<String, String> returnMap = new HashMap<String, String>();
		returnMap.put("eoid", eoId);
		returnMap.put("sysid", sysId);
		return returnMap;
	}
	
	/**
	 * リストをnullまたは0件か判定します。
	 * TODO 部品使用に変更
	 * @param Object[] targetList
	 * @return boolean true：nullまたは0件 false：nullまたは0件以外
	 */
	private boolean isNullorEmpty(Object[] targetList)
	{
		
		if (targetList == null || targetList.length == 0)
		{
			return true;
		}
		
		return false;
	}

	/**
	 * BPチェック用パラメータ作成
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText){
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}
}
