/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddSeikyOpSvcCC
*   ソースファイル名：JFUAddSeikyOpSvcCC.java
*   作成者          ：富士通
*   日付            ：2013年4月15日
*＜機能概要＞
*   請求オプションサービス登録コンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/04/15   FJ)大塚     新規作成
*   v5.01       2013/04/26   FJ)大村     障害No.715 テレビにネット追加障害対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import com.fujitsu.futurity.bp.custom.common.JFUBPCommon;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0441D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B005CBSMsg1List;

/**
 *請求オプションサービス登録コンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAddSeikyOpSvcCC extends JFUBaseCC
{
	/** テンプレートID(請求契約一意照会) */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";
	/** テンプレートID(請求契約一意照会明細) */
	private static final String TEMPLATE_ID_DETAIL_EKK0491A010 = "EKK0491A010CBSMsg1List";
	/** IN項目リスト(請求契約一意照会) */
	private static final List<String> IN_COLUMN_EKK0491A010 = Arrays.asList(EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, EKK0491A010CBSMsg.KEY_RSV_APLY_YMD);

	/** テンプレートID(請求契約一覧照会（SYSID）) */
	private static final String TEMPLATE_ID_EKK0491B005 = "EKK0491B005";
	/** テンプレートID(請求契約一覧照会（SYSID）明細) */
	private static final String TEMPLATE_ID_DETAIL_EKK0491B005 = "EKK0491B005CBSMsg1List";
	/** IN項目リスト(請求契約一覧照会（SYSID）) */
	private static final List<String> IN_COLUMN_EKK0491B005 = Arrays.asList(EKK0491B005CBSMsg.KEY_SYSID);

	/** テンプレートID(請求オプションサービス契約登録) */
	private static final String TEMPLATE_ID_EKK0441D010 = "EKK0441D010";
	/** IN項目リスト(請求オプションサービス契約登録) */
	private static final List<String> IN_COLUMN_EKK0441D010 =
			Arrays.asList(EKK0441D010CBSMsg.SEIKY_KEI_NO, EKK0441D010CBSMsg.SYSID, EKK0441D010CBSMsg.SEIOPSVC_CD, EKK0441D010CBSMsg.PCRS_CD,
					EKK0441D010CBSMsg.PPLAN_CD, EKK0441D010CBSMsg.MSKM_DTL_NO, EKK0441D010CBSMsg.IDO_DIV, EKK0441D010CBSMsg.UPD_DTM_BF);

	/** サービス契約ステータスリスト */
	private static final String[] SVC_KEI_STAT_LIST =
			{ JFUStrConst.CD00037_100, JFUStrConst.CD00037_210, JFUStrConst.CD00037_220, JFUStrConst.CD00037_910, JFUStrConst.CD00037_920 };

	/** 作業マップ名 */
	private static final String CC_WORK_AREA_NAME_MSKM = "JFUAddMskmSCWork";
	private static final String CC_WORK_AREA_NAME_NET = "JFUAddSvcKeiNetCCWork";
	private static final String CC_WORK_AREA_NAME_TEL = "JFUAddSvcKeiTelCCWork";
	private static final String CC_WORK_AREA_NAME_TV = "JFUAddSvcKeiTvCCWork";
	private static final String CC_WORK_AREA_NAME_MOB = "JFUAddSvcKeiMobCCWork";

	/** 通常導線 */
	private static final String NAVI_USUAL = "1";
	/** 全戸一括 */
	private static final String NAVI_ZENKO = "2";
	/** モバイル単独 */
	private static final String NAVI_MOBILE = "3";

	/**
	 * 請求オプションサービス登録処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite addSeikyOpSvc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// データが存在しない場合は処理を行わない。
		if ((inMap == null) || (inMap.isEmpty()))
		{
			return param;
		}

		// 請求契約番号
		String seikyKeiNo = (String)inMap.get("seiky_kei_no");

		String naviFlg = (String)inMap.get("navi_flg");

		// マップ(inMap)からマップ(ccMap)へ値をコピー
		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		copyMap(inMap, ccMap);

		// -----請求契約一意照会-----
		// 上りマッピング項目設定
		setInMapEKK0491A010(param, fixedText, ccMap);
		// サービスIF実行 
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0491A010, TEMPLATE_ID_DETAIL_EKK0491A010, IN_COLUMN_EKK0491A010, BLANK);
		HashMap<String, Object> seikyMap = new HashMap<String, Object>();
		// 下りマッピング
		seikyMap = setOutMapEKK0491A010(param, fixedText);
		// --------------------------

		// 取得した請求書発行要否が「否」の場合、処理を終了する。
		if (JFUStrConst.CD00930_0.equals(seikyMap.get(EKK0491A010CBSMsg1List.SEIKYUS_HAKKO_YH)))
		{
			return param;
		}

		// 更新年月日時分秒
		String updDtm = (String)seikyMap.get(EKK0491A010CBSMsg1List.UPD_DTM);

		ArrayList<String> svc_kei_list = new ArrayList<String>();

		// 今回登録したサービスのサービス契約番号
		svc_kei_list = getSvcKeiNo(param, fixedText, naviFlg);

		// -----請求契約一覧照会（SYSID）-----
		// 上りマッピング項目設定
		setInMapEKK0491B005(param, fixedText, ccMap);
		// サービスIF実行 
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0491B005, TEMPLATE_ID_DETAIL_EKK0491B005, IN_COLUMN_EKK0491B005, BLANK);
		// 結果を詰めるリスト
		ArrayList seiky_list = new ArrayList();
		// 下りマッピング
		seiky_list = setOutMapEKK0491B005(param, fixedText, seikyKeiNo, svc_kei_list);
		// --------------------------

		// サービス提供中フラグ(trueには解約済み・キャンセル済も含む)
		Boolean svcTkFlg = false;

		// 取得したデータにネット系サービス(サービスコードが1)が存在する場合、処理を終了する。
		for (int i = 0; i < seiky_list.size(); i++)
		{
			HashMap childMap = (HashMap)seiky_list.get(i);

			if (childMap != null)
			{
				// サービスコードが01:インターネットサービスの場合
				if (JFUStrConst.CD00130_01.equals(childMap.get(EKK0491B005CBSMsg1List.SVC_CD)))
				{
					return param;
				}

				// 01:インターネットサービス以外の場合、サービス契約ステータスがサービス提供中以降のサービスが存在する場合
				for (int j = 0; j < SVC_KEI_STAT_LIST.length; j++)
				{
					if (SVC_KEI_STAT_LIST[j].equals(childMap.get(EKK0491B005CBSMsg1List.SVC_KEI_STAT)))
					{
						svcTkFlg = true;
					}
				}
			}
		}

		// 提供中以降のサービスが存在しない場合
		if (!svcTkFlg)
		{
			// -----請求オプションサービス契約登録-----
			// 上りマッピング項目設定
			setInMapEKK0441D010(param, fixedText, ccMap, updDtm, naviFlg);
			// サービスIF実行 
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0441D010, BLANK, IN_COLUMN_EKK0441D010, BLANK);
			// --------------------------
		}
		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;
	}

	/**
	 * 上りマッピング項目設定(請求契約一意照会上りマッピング処理)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0491A010(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap)
			throws RequestParameterException
	{
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 運用日付
		String operateDate = JFUBPCommon.getOpeDate(null); //障害No.715 テレビにネット追加障害対応

		// 機能コード
		inMap.put(EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿請求契約番号
		inMap.put(EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, ccMap.get("seiky_kei_no"));

		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, operateDate);
	}

	/**
	 * 上りマッピング項目設定(請求契約一覧照会（SYSID）上りマッピング処理)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0491B005(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap)
			throws RequestParameterException
	{
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機能コード
		inMap.put(EKK0491B005CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// KEY_SYSID
		inMap.put(EKK0491B005CBSMsg.KEY_SYSID, ccMap.get("sysid"));
	}

	/**
	 * 上りマッピング項目設定(請求オプションサービス契約登録上りマッピング処理)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0441D010(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap, String updDtm, String naviFlg)
			throws RequestParameterException
	{
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機能コード
		inMap.put(EKK0441D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// 請求契約番号
		inMap.put(EKK0441D010CBSMsg.SEIKY_KEI_NO, ccMap.get(EKK0441D010CBSMsg.SEIKY_KEI_NO));

		// SYSID
		inMap.put(EKK0441D010CBSMsg.SYSID, ccMap.get(EKK0441D010CBSMsg.SYSID));

		// 請求オプションサービスコード
		inMap.put(EKK0441D010CBSMsg.SEIOPSVC_CD, ccMap.get(EKK0441D010CBSMsg.SEIOPSVC_CD));

		// 料金コースコード
		inMap.put(EKK0441D010CBSMsg.PCRS_CD, ccMap.get(EKK0441D010CBSMsg.PCRS_CD));

		// 料金プランコード
		inMap.put(EKK0441D010CBSMsg.PPLAN_CD, ccMap.get(EKK0441D010CBSMsg.PPLAN_CD));

		// ---申込明細番号---
		String mskm_dtl_no = "";

		if (NAVI_USUAL.equals(naviFlg))
		{
			mskm_dtl_no = (String)ccMap.get(EKK0441D010CBSMsg.MSKM_DTL_NO);
		}
		// 全戸一括の場合
		else if (NAVI_ZENKO.equals(naviFlg))
		{
			if (getWorkMapValue(param, "ekk0091_mskm_dtl_no", CC_WORK_AREA_NAME_MSKM) != null)
			{
				mskm_dtl_no = getWorkMapValue(param, "ekk0091_mskm_dtl_no", CC_WORK_AREA_NAME_MSKM);
			}
			else if (getWorkMapValue(param, "ekk0121_mskm_dtl_no", CC_WORK_AREA_NAME_MSKM) != null)
			{
				mskm_dtl_no = getWorkMapValue(param, "ekk0121_mskm_dtl_no", CC_WORK_AREA_NAME_MSKM);
			}
		}
		// モバイル単独の場合
		else if (NAVI_MOBILE.equals(naviFlg))
		{
			mskm_dtl_no = JFUBPCommon.getBPListValueString(param, "FUSV016505SC", "EKK0011D020CBSMsg1List", 0, "mskm_dtl_no");
		}

		inMap.put(EKK0441D010CBSMsg.MSKM_DTL_NO, mskm_dtl_no);

		// 異動区分
		inMap.put(EKK0441D010CBSMsg.IDO_DIV, ccMap.get(EKK0441D010CBSMsg.IDO_DIV));

		// 更新年月日時分秒(更新前)
		inMap.put(EKK0441D010CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 下りマッピング項目設定(請求契約一意照会下りマッピング処理)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> setOutMapEKK0491A010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);

		HashMap<String, Object> childMap = null;

		HashMap<String, Object> inMap = null;

		ArrayList<Object> inMapList = (ArrayList)dataMap.get(TEMPLATE_ID_DETAIL_EKK0491A010);

		if (inMapList != null)
		{
			for (int i = 0; i < inMapList.size(); i++)
			{
				childMap = new HashMap<String, Object>();

				childMap = (HashMap)inMapList.get(i);

				if (childMap != null)
				{
					inMap = new HashMap<String, Object>();

					// 更新年月日時分秒
					inMap.put(EKK0491A010CBSMsg1List.UPD_DTM, childMap.get(EKK0491A010CBSMsg1List.UPD_DTM));

					// 請求書発行要否
					inMap.put(EKK0491A010CBSMsg1List.SEIKYUS_HAKKO_YH, childMap.get(EKK0491A010CBSMsg1List.SEIKYUS_HAKKO_YH));
				}
			}
		}

		return inMap;
	}

	/**
	 * 下りマッピング項目設定(請求契約一覧照会（SYSID）下りマッピング処理)
	 * 
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyKeiNo 請求契約番号
	 * @param svc_kei_list サービス契約リスト
	 * @throws RequestParameterException
	 */
	private ArrayList<HashMap> setOutMapEKK0491B005(IRequestParameterReadWrite param, String fixedText, String seikyKeiNo,
			ArrayList<String> svc_kei_list) throws RequestParameterException
	{
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);

		HashMap<String, Object> childMap = null;

		HashMap<String, String> inMap = null;

		ArrayList<Object> inMapList = (ArrayList)dataMap.get(TEMPLATE_ID_DETAIL_EKK0491B005);

		ArrayList<HashMap> seiky_list = new ArrayList<HashMap>();

		if (inMapList != null)
		{
			for (int i = 0; i < inMapList.size(); i++)
			{
				childMap = new HashMap<String, Object>();

				childMap = (HashMap)inMapList.get(i);

				if (childMap != null)
				{
					inMap = new HashMap<String, String>();

					// 引き継ぐ請求契約番号と同じ場合はマッピングを行う。
					if (seikyKeiNo.equals(childMap.get(EKK0491B005CBSMsg1List.SEIKY_KEI_NO)))
					{
						// 今回追加するサービス契約番号がある場合はマッピングしない。
						if (!svc_kei_list.contains(childMap.get(EKK0491B005CBSMsg1List.SVC_KEI_NO)))
						{
							// サービスコード
							inMap.put(EKK0491B005CBSMsg1List.SVC_CD, (String)childMap.get(EKK0491B005CBSMsg1List.SVC_CD));

							// サービス契約ステータス
							inMap.put(EKK0491B005CBSMsg1List.SVC_KEI_STAT, (String)childMap.get(EKK0491B005CBSMsg1List.SVC_KEI_STAT));

							// サービス契約番号
							inMap.put(EKK0491B005CBSMsg1List.SVC_KEI_NO, (String)childMap.get(EKK0491B005CBSMsg1List.SVC_KEI_NO));

							seiky_list.add(inMap);
						}

					}
				}
			}
		}
		return seiky_list;
	}

	/**
	 * マップからマップへ値をコピーします
	 * <br>
	 * @param srcMap 取得元マップ
	 * @param destMap 取得先マップ
	 */
	private void copyMap(HashMap<String, Object> srcMap, HashMap<String, Object> destMap)
	{
		if (srcMap != null && destMap != null)
		{
			for (String srcKey : srcMap.keySet())
			{
				destMap.put(srcKey, srcMap.get(srcKey));
			}
		}
	}

	/**
	 * 作業エリア
	 */
	@SuppressWarnings("null")
	private String getWorkMapValue(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}
		else
		{
			inMap = null;
		}

		String result = null;
		if (inMap != null)
		{
			result = (String)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}

	/**
	 * サービス契約番号を取得します。
	 */
	private ArrayList<String> getSvcKeiNo(IRequestParameterReadWrite param, String fixedText, String naviFlg) throws RequestParameterException
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		ArrayList<String> svc_kei_list = new ArrayList<String>();

		// 通常導線の場合
		if (NAVI_USUAL.equals(naviFlg))
		{
			if (!"".equals(inMap.get("svc_kei_no_net")) && inMap.get("svc_kei_no_net") != null)
			{
				svc_kei_list.add((String)inMap.get("svc_kei_no_net"));
			}

			if (!"".equals(inMap.get("svc_kei_no_tel")) && inMap.get("svc_kei_no_tel") != null)
			{
				svc_kei_list.add((String)inMap.get("svc_kei_no_tel"));
			}

			if (!"".equals(inMap.get("svc_kei_no_tv")) && inMap.get("svc_kei_no_tv") != null)
			{
				svc_kei_list.add((String)inMap.get("svc_kei_no_tv"));
			}

			if (!"".equals(inMap.get("svc_kei_no_mob")) && inMap.get("svc_kei_no_mob") != null)
			{
				svc_kei_list.add((String)inMap.get("svc_kei_no_mob"));
			}
		}
		// 全戸一括の場合
		else if (NAVI_ZENKO.equals(naviFlg))
		{
			if (getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_NET) != null)
			{
				svc_kei_list.add(getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_NET));
			}

			if (getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_TEL) != null)
			{
				svc_kei_list.add(getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_TEL));
			}

			if (getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_TV) != null)
			{
				svc_kei_list.add(getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_TV));
			}

			if (getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_MOB) != null)
			{
				svc_kei_list.add(getWorkMapValue(param, "svc_kei_no", CC_WORK_AREA_NAME_MOB));
			}
		}
		// モバイル単独の場合
		else if (NAVI_MOBILE.equals(naviFlg))
		{
			svc_kei_list.add(JFUBPCommon.getBPValueString(param, "FUSV016510SC", "svc_kei_no"));
		}

		return svc_kei_list;
	}
}