/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetMladChgCntCC
*   ソースファイル名：JFUGetMladChgCntCC.java
*   作成者          ：富士通
*   日付            ：2015年04月23日
*＜機能概要＞
*   メールアドレス変更回数取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン   修正日       修正者      修正内容
*   v14.00.00    2015/04/23   FJ）谷本    新規作成
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361B004CBSMsg1List;

/**
 * メールアドレス変更回数取得コモンコンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUGetMladChgCntCC extends JFUBaseCC
{

	/* ■□ EKK0361B004_メールアドレス自動設定ツール連携契約情報取得一覧照会SC ■□ */
	/** テンプレートID(メールアドレス自動設定ツール連携契約情報取得一覧照会) */
	private static final String TEMP_ID_EKK0361B004 = "EKK0361B004";
	/** テンプレートID(メールアドレス自動設定ツール連携契約情報取得一覧照会明細) */
	private static final String TEMP_ID_DTL_EKK0361B004 = EKK0361B004CBSMsg.EKK0361B004CBSMSG1LIST;
	/** IN項目リスト(メールアドレス自動設定ツール連携契約情報取得一覧照会) */
	private static final List<String> IN_COL_LIST_EKK0361B004 = Arrays.asList(EKK0361B004CBSMsg.KEY_MLAD);
	/** 関連チェックエラー項目(メールアドレス自動設定ツール連携契約情報取得一覧照会) */
	private static final String ERR_COL_EKK0361B004 = null;
	/** SC実行結果取得キー(メールアドレス自動設定ツール連携契約情報取得一覧照会) */
	private static final String TEMP_TEMP_KEY_EKK0361B004 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0361B004 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ EKK0351B003_オプションサービス契約履歴一覧照会SC ■□ */
	/** テンプレートID(オプションサービス契約履歴一覧照会) */
	private static final String TEMP_ID_EKK0351B003 = "EKK0351B003";
	/** テンプレートID(オプションサービス契約履歴一覧照会明細) */
	private static final String TEMP_ID_DTL_EKK0351B003 = EKK0351B003CBSMsg.EKK0351B003CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約履歴一覧照会) */
	private static final List<String> IN_COL_LIST_EKK0351B003 =
			Arrays.asList(EKK0351B003CBSMsg.KEY_SVC_KEI_NO, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO1, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO2,
					EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO3, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO4, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO5);
	/** 関連チェックエラー項目(オプションサービス契約履歴一覧照会) */
	private static final String ERR_COL_EKK0351B003 = null;
	/** SC実行結果取得キー(オプションサービス契約履歴一覧照会) */
	private static final String TEMP_TEMP_KEY_EKK0351B003 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0351B003 + TEMP_TEMPLATE_PRIFIX_SEP;

	// ■ IN項目ID ■
	/** IN項目ID：メールアドレス */
	private static final String IN_MLAD = "in_mlad";
	/** IN項目ID：サービス契約番号 */
	private static final String IN_SVC_KEI_NO = "in_svc_kei_no";
	/** IN項目ID：オプションサービス契約番号 */
	private static final String IN_OP_SVC_KEI_NO = "in_op_svc_kei_no";

	// ■ OUT項目ID ■
	/** OUT項目ID：メールアドレス変更回数 */
	private static final String OUT_MLAD_CHG_CNT = "out_mlad_chg_cnt";

	/**
	 * メールアドレス変更回数取得処理<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 開始ログ
		outDebugLog("----- getResultData Start  -----");
		// 
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ●結果格納マップ
		HashMap resultMap = new HashMap();

		// ●ＩＮ項目
		// IN項目ID：メールアドレス（※メールアドレス自動設定ツールからの呼出しの場合この値のみ設定される）
		String inMlad = (String)inMap.get(IN_MLAD);
		// IN項目ID：サービス契約番号
		String inSvcKeiNo = (String)inMap.get(IN_SVC_KEI_NO);
		// IN項目ID：オプションサービス契約番号
		String inOpSvcKeiNo = (String)inMap.get(IN_OP_SVC_KEI_NO);

		// ◆INパラメータがなければエラーをスロー
		if (JFUBPCommon.isNull(inSvcKeiNo) || JFUBPCommon.isNull(inOpSvcKeiNo))
		{
			if (JFUBPCommon.isNull(inMlad))
			{
				// エラーログ
				outDebugLog("----- getResultData Error  -----");
				// INパラ不正エラー
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}
		}

		// ※メールアドレス自動設定ツール用
		// ◆IN項目メールアドレスが設定されている場合、使用してサービス契約番号、オプションサービス契約番号を取得
		if (!JFUBPCommon.isNull(inMlad))
		{
			// ○EKK0361B004_メールアドレス自動設定ツール連携契約情報取得一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0361B004);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapEKK0361B004(param, fixedText, inMlad);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK0361B004, TEMP_ID_DTL_EKK0361B004, IN_COL_LIST_EKK0361B004, ERR_COL_EKK0361B004);

			// ◆取得データが0件の場合終了
			if (getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0361B004), TEMP_ID_DTL_EKK0361B004).size() == 0)
			{
				return param;
			}
		
			// ◆取得データが複数件の場合エラー
			if (getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0361B004), TEMP_ID_DTL_EKK0361B004).size() > 1)
			{
				// エラーログ
				outDebugLog("----- getResultData Error  -----");
				// INパラ不正エラー
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			// マップを取得
			HashMap ekk0361b004Map = getTemplateListMap(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0361B004), TEMP_ID_DTL_EKK0361B004, 0);
			// サービス契約番号
			inSvcKeiNo = (String)ekk0361b004Map.get(EKK0361B004CBSMsg1List.SVC_KEI_NO);
			// オプションサービス契約番号
			inOpSvcKeiNo = (String)ekk0361b004Map.get(EKK0361B004CBSMsg1List.OP_SVC_KEI_NO);
		}

		// ○EKK0351B003_オプションサービス契約履歴一覧照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COL_LIST_EKK0351B003);
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setInMapEKK0351B003(param, fixedText, inSvcKeiNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_EKK0351B003, TEMP_ID_DTL_EKK0351B003, IN_COL_LIST_EKK0351B003, ERR_COL_EKK0351B003);

		// ●結果分ループ（「EKK0351B003_オプションサービス契約履歴一覧照会」の件数分）
		// メールアドレス変更回数
		int mladChgCnt = 0;
		// 前回メールアドレス
		String befMlad = JFUStrConst.EMPTY;
		for (HashMap ekk0351b003Map : getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0351B003), TEMP_ID_DTL_EKK0351B003))
		{
			// ◆オプションサービス契約履歴一覧照会.メールアドレスがNULLの場合スキップ
			if (JFUBPCommon.isNull(ekk0351b003Map.get(EKK0351B003CBSMsg1List.MLAD)))
			{
				continue;
			}

			// ◆メールアドレス自動設定ツール連携契約情報取得一覧照会.オプションサービス契約番号
			//   ＜＞オプションサービス契約履歴一覧照会.オプションサービス契約番号の場合、スキップ
			if (!inOpSvcKeiNo.equals(ekk0351b003Map.get(EKK0351B003CBSMsg1List.KK0351_OP_SVC_KEI_NO)))
			{
				continue;
			}

			// メールアドレス
			String thisMlad = (String)ekk0351b003Map.get(EKK0351B003CBSMsg1List.MLAD);

			// ◆メールアドレスが前回メールアドレスと異なる場合、カウントする。
			if (!befMlad.equals(thisMlad))
			{

				// カウントアップ
				++mladChgCnt;

				// 前回メールアドレスに設定
				befMlad = thisMlad;
			}

		}

		// ●ＯＵＴ項目
		// OUT項目ID：メールアドレス変更回数
		resultMap.put(OUT_MLAD_CHG_CNT, String.valueOf(mladChgCnt));
		param.setData(fixedText, resultMap);

		// 終了ログ
		outDebugLog("----- getResultData End  -----");
		return param;

	}

	/**
	 * 上りマッピング項目設定(メールアドレス自動設定ツール連携契約情報取得一覧照会）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mlad メールアドレス
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0361B004(IRequestParameterReadWrite param, String fixedText, String mlad) throws RequestParameterException
	{
		// 機能コード設定(1:一覧)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0361B004CBSMsg.KEY_MLAD, mlad);
	}

	/**
	 * 上りマッピング項目設定(オプションサービス契約履歴一覧照会）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0351B003(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1:一覧)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0351B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * デバッグ出力処理です。
	 * 
	 * <br>
	 * @param obj 出力内容
	 */
	private void outDebugLog(Object obj)
	{
		// デバッグ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), obj, null, null, null);
	}

	/**
	 * チェック処理（共通処理）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}
}
