/*********************************************************************
 * All Rights reserved, Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUChkMobileSvcKeiUpplnoCC
 *   ソースファイル名：JFUChkMobileSvcKeiUpplnoCC.java
 *   作成者          ：富士通
 *   日付            ：2013年01月30日
 *＜機能概要＞
 *   モバイルサービス契約上限数チェック共通コンポーネント
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00.00    2013/01/30   FJ）岩元    新規作成
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
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.BPMFlowException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.bpm.parameter.RequestParameter;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0161B511CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B511CBSMsg1List;

public class JFUChkMobileSvcKeiUpplnoCC extends JFUBaseCC
{

	/**
	 * ユーザ定義文字列必須エラー
	 */
	private static final String FIXED_TEXT_ERR_MSG;

	/**
	 * サービス契約内訳既契約件数照会（料金コース）
	 */
	private static final String TEMPLATE_ID_EKK0161B511;

	/**
	 * サービス契約内訳既契約件数照会（料金コース）明細
	 */
	private static final String TEMPLATE_ID_DETAIL_EKK0161B511;

	/**
	 * サービス契約内訳既契約件数照会（料金コース）IN項目リスト
	 */
	private static final List<String> IN_COLUMN_LIST_EKK0161B511;

	/**
	 * エラーキー（上限数エラー）
	 */
	private static final String UPPLNO_ERR;

	/**
	 * 静的初期化子です。
	 * 項目名定数の値を設定します。
	 */
	static
	{
		// ユーザ定義文字列必須エラー
		FIXED_TEXT_ERR_MSG = "ユーザ定義文字列(fixedText)がありません";
		// サービス契約内訳既契約件数照会（料金コース）
		TEMPLATE_ID_EKK0161B511 = "EKK0161B511";
		// サービス契約内訳既契約件数照会（料金コース）明細
		TEMPLATE_ID_DETAIL_EKK0161B511 = "EKK0161B511CBSMsg1List";
		// サービス契約内訳既契約件数照会（料金コース）IN項目リスト
		IN_COLUMN_LIST_EKK0161B511 = Arrays.asList(EKK0161B511CBSMsg.KEY_PCRS_CD, EKK0161B511CBSMsg.KEY_SYSID);
		// エラーキー（上限数エラー）
		UPPLNO_ERR = "upplno_err";
	}

	/**
	 * サービス契約一覧照会を行います
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite checkExecute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// --------------------------------------------------------------
		// 必須項目のチェック処理
		// --------------------------------------------------------------
		// ユーザ定義文字列の確認
		if (this.isBlank(fixedText))
		{
			// ユーザ定義文字列の必須エラー
			throw new BPMFlowException((RequestParameter)param, FIXED_TEXT_ERR_MSG);
		}

		// チェック対象マップの取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		if (!this.isBlank(inMap))
		{
			// --------------------------------------------------------------
			// モバイル上限数のチェック処理 必要項目取得
			// --------------------------------------------------------------

			// SYSID
			String sysid = (String)inMap.get("sysid");
			// 上限数
			String upplno = (String)inMap.get("upplno");

			if (!this.isBlank(sysid) && !this.isBlank(upplno))
			{
				// --------------------------------------------------------------
				// EKK0161B511_サービス契約内訳既契約件数照会（料金コース）呼出
				// --------------------------------------------------------------

				// ユーザデータ取得
				HashMap<String, Object> sifMap = new HashMap<String, Object>();

				// KEY_SYSID
				sifMap.put(EKK0161B511CBSMsg.KEY_SYSID, sysid);
				// KEY_料金コースコード
				sifMap.put(EKK0161B511CBSMsg.KEY_PCRS_CD, JFUStrConst.CD00134_A45);

				param.setData(TEMPLATE_ID_EKK0161B511, sifMap);

				// 機能コード(1：固定)
				setFuncCode(param, TEMPLATE_ID_EKK0161B511, JPCModelConstant.FUNC_CD_1);

				// 検索エラーなし設定
				ignoreSearchError(param, TEMPLATE_ID_EKK0161B511);

				// サービスIF実行
				executeSC(handle, param, TEMPLATE_ID_EKK0161B511, TEMPLATE_ID_EKK0161B511, TEMPLATE_ID_DETAIL_EKK0161B511,
						IN_COLUMN_LIST_EKK0161B511, BLANK);

				// 結果取得
				HashMap outOyaMap = (HashMap)param.getData(TEMPLATE_ID_EKK0161B511);

				// 親マップからリスト取得
				ArrayList outList = (ArrayList)outOyaMap.get(TEMPLATE_ID_DETAIL_EKK0161B511);
				
				// リストからマップ取得
				HashMap outChildMap = (HashMap)outList.get(0);

				// モバイルの回線数
				String mobileCnt = (String)outChildMap.get(EKK0161B511CBSMsg1List.SVC_KEI_UCWK_CNT);

				// --------------------------------------------------------------
				// 上限数との既契約数のチェックを行う
				// --------------------------------------------------------------

				if (upplno.compareTo(mobileCnt) <= 0)
				{
					// 既契約の件数が上限数と同一または超えている為、関連チェックエラー
					setRelationErrorInfo(param, TEMPLATE_ID_EKK0161B511, UPPLNO_ERR, fixedText);
					throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
							.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
				}

			}
		}
		return param;
	}

	/**
	 * チェック処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 値が設定されているか判定する
	 * <br>
	 * @param obj 対象オブジェクト
	 * @return 判定結果
	 */
	@SuppressWarnings("unchecked")
	private boolean isBlank(Object obj)
	{
		boolean ret = false;
		if (obj == null)
		{
			// オブジェクトがNull
			ret = true;
		}
		else if (obj instanceof String)
		{
			// String型の場合
			if (JFUStrConst.EMPTY.equals(obj))
			{
				ret = true;
			}
		}
		else if (obj instanceof ArrayList)
		{
			// ArrayList型の場合
			if (((ArrayList)obj).isEmpty())
			{
				ret = true;
			}
		}
		else if (obj instanceof HashMap)
		{
			// HashMap型の場合
			if (((HashMap)obj).isEmpty())
			{
				ret = true;
			}
		}

		return ret;
	}

}
