/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUMailAddressShokaiCC
*   ソースファイル名：JFUMailAddressShokaiCC.java
*   作成者          ：富士通
*   日付            ：2012年03月15日
*＜機能概要＞
*   eoモバイル コース変更関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/02/16   FJ)岡井     新規作成
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.custom.constant.JFUSearchSvKeiListConstCC;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361B001CBSMsg1List;

/**
 * メールアドレス一覧照会(SYSID)コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUMladShokaiCC extends JFUBaseCC
{
	// ■サービス契約一覧照会（SYSID）3SC
	/** テンプレートID */
	private static final String TEMP_EKK0081B519 = "EKK0081B519";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0081B519 = EKK0081B519CBSMsg.EKK0081B519CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0081B519 = Arrays.asList(EKK0081B519CBSMsg.KEY_SYSID);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0081B519 = EKK0081B519CBSMsg.KEY_SYSID_ERR;

	// ■オプションサービス契約<ISP>一覧照会SC
	/** テンプレートID */
	private static final String TEMP_EKK0361B001 = "EKK0361B001";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0361B001 = EKK0361B001CBSMsg.EKK0361B001CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0361B001 = Arrays.asList(EKK0361B001CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0361B001 = EKK0361B001CBSMsg.KEY_SVC_KEI_NO;

	// ■IN項目ID
	/** IN項目ID：SYSID */
	private static final String SYSID = "sysid";

	// ■OUT項目ID
	/** OUT項目ID：mlad */
	private static final String MLAD = "mlad";
	/** OUT項目ID：gene_add_dtm */
	private static final String GENE_ADD_DTM = "gene_add_dtm";
	/** OUT項目ID：JFUMailAddressShokaiCCList */
	private static final String JFUMLADSHOKAICCLIST = "JFUMladShokaiCCList";

	/**
	 * eo光ネットホームタイププラン変更関連チェック実行処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		// 結果リスト
		ArrayList mailList = new ArrayList();

		// ユーザデータ
		HashMap<?, ?> inMap = (HashMap<?, ?>)param.getData(fixedText);

		// IN項目退避
		resultMap = setInParams(inMap, resultMap);

		// SYSIDチェック
		String inSysid = (String)resultMap.get(SYSID);
		if(JFUBPCommon.isNull(inSysid))
		{
			// SYSIDが設定されていない場合、空リストを設定し終了
			resultMap.put(JFUMLADSHOKAICCLIST, mailList);
			return param;
		}

		// ●サービス契約一覧照会（SYSID）3
		setEKK0081B519(param, fixedText, inMap);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_EKK0081B519, TEMP_DTL_EKK0081B519, IN_COL_LIST_EKK0081B519, ERR_COL_EKK0081B519);
		// 明細取得
		ArrayList eKK0081B519List = (ArrayList)((HashMap<?, ?>)param.getData(fixedText)).get(TEMP_DTL_EKK0081B519);

		if(eKK0081B519List == null || eKK0081B519List.size() == 0)
		{
			// サービス契約一覧照会（SYSID）3の明細が存在しない場合、空リストを設定し終了
			resultMap.put(JFUMLADSHOKAICCLIST, mailList);
			return param;
		}

		for (int i = 0; i < eKK0081B519List.size(); i++)
		{
			HashMap eKK0081B519Map = (HashMap)eKK0081B519List.get(i);

			if(eKK0081B519Map == null || eKK0081B519Map.size() == 0)
			{
				// 明細マップが取得できていない場合、以降の処理を飛ばす
				continue;
			}

			// 料金グループコード
			String prGrpCd = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.PRC_GRP_CD);

			if(!(JFUStrConst.CD00133_02.equals(prGrpCd) || JFUStrConst.CD00133_03.equals(prGrpCd) || JFUStrConst.CD00133_04.equals(prGrpCd)))
			{
				// 光ネット以外の場合、処理を飛ばす
				continue;
			}

			// サービス契約番号
			String svcKeiNo = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.SVC_KEI_NO);

			// ●オプションサービス契約<ISP>一覧照会
			// 上りマッピング
			setEKK0361B001(param, fixedText, svcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_EKK0361B001, TEMP_DTL_EKK0361B001, IN_COL_LIST_EKK0361B001, ERR_COL_EKK0361B001);
			// 明細取得
			ArrayList eKK0361B001List = (ArrayList)((HashMap<?, ?>)param.getData(fixedText)).get(TEMP_DTL_EKK0361B001);

			if(eKK0361B001List == null || eKK0361B001List.size() == 0)
			{
				// オプションサービス契約<ISP>一覧照会明細が取得できない場合、以降の処理を飛ばす
				continue;
			}

			for (int j = 0; j < eKK0361B001List.size(); j++)
			{
				HashMap eKK0361B001Map = (HashMap)eKK0361B001List.get(j);

				if(eKK0361B001Map == null || eKK0361B001Map.size() == 0)
				{
					// 明細マップが取得できていない場合、以降の処理を飛ばす
					continue;
				}

				// オプションサービスコード
				String opSvcCd = (String)eKK0361B001Map.get(EKK0361B001CBSMsg1List.OP_SVC_CD);

				if(!JFUStrConst.CD00136_B001.equals(opSvcCd))
				{
					// Eメール以外の場合、処理を飛ばす
					continue;
				}

				// オプションサービス契約ステータス
				String opSvcKeiStat = (String)eKK0361B001Map.get(EKK0361B001CBSMsg1List.OP_SVC_KEI_STAT);

				// ステータスチェック
				if(!(JFUStrConst.CD00037_030.equals(opSvcKeiStat) || JFUStrConst.CD00037_100.equals(opSvcKeiStat)))
				{
					// オプションサービス契約ステータスが「030」と「100」以外の場合、以降の処理を飛ばす
					continue;
				}

				// 世代登録年月日時分秒
				String geneAddDtm = (String)eKK0361B001Map.get(EKK0361B001CBSMsg1List.GENE_ADD_DTM);
				// メールアドレス
				String mlad = (String)eKK0361B001Map.get(EKK0361B001CBSMsg1List.MLAD);

				// メールアドレスチェック
				if(!JFUBPCommon.isNull(mlad))
				{
					// メールアドレスが正しく取得できている場合、返却リストに追加する
					HashMap mladMap = new HashMap();
					mladMap.put(MLAD, mlad);
					mladMap.put(GENE_ADD_DTM, geneAddDtm);

					mailList.add(mladMap);
				}
			}
		}

		// 世代登録年月日時分秒で並び替え(昇順)
		Collections.sort(mailList, new Comparator()
		{
			public int compare(Object o1, Object o2)
			{
				HashMap map1 = (HashMap)o1;
				HashMap map2 = (HashMap)o2;
				String str1 = (String)map1.get(GENE_ADD_DTM);
				String str2 = (String)map2.get(GENE_ADD_DTM);
				return str1.compareTo(str2);
			}
		});

		// 返却マップに設定
		resultMap.put(JFUMLADSHOKAICCLIST, mailList);

		// 一度ユーザデータを削除し、再度設定する
		param.removeData(fixedText);
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * チェック処理です。
	 * <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;
	}

	/**
	 * IN項目を結果マップに格納します。
	 * 
	 * <br>
	 * @param inParamMap ユーザデータ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 */
	private HashMap<String, Object> setInParams(HashMap<?, ?> inMap, HashMap<String, Object> resultMap)
	{
		// IN項目格納
		resultMap.put(SYSID, (String)inMap.get(SYSID));

		return resultMap;
	}

	/**
	 * サービス契約一覧照会（SYSID）3SCの上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ文字列
	 * @param inMap インマップ
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0081B519(IRequestParameterReadWrite param, String fixedText, HashMap inMap) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(EKK0081B519CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		parentMap.put(IGNORE_SEARCH_ERR, true);
		// KEY_SYSID
		parentMap.put(EKK0081B519CBSMsg.KEY_SYSID, inMap.get(SYSID));

		param.setData(fixedText, parentMap);
	}

	/**
	 * オプションサービス契約<ISP>一覧照会SCの上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ文字列
	 * @param inMap インマップ
	 * @throws Exception 例外
	 */
	private void setEKK0361B001(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(EKK0361B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		parentMap.put(IGNORE_SEARCH_ERR, true);
		// ＫＥＹ＿サービス契約番号
		parentMap.put(EKK0361B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);

		param.setData(fixedText, parentMap);
	}

}