/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUGetPonSbtNetCheck
 *   ソースファイル名：JFUGetPonSbtNetCheck.java
 *   作成者          ：富士通
 *   日付            ：2019年08月07日
 *＜機能概要＞
 *   ONU情報取得及びeo光ネット提供エリアチェック部品です（View）。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v45.00.00   2019/08/07   FJ）美濃原    【ANK-3556-00-00】100M新規受付停止対応
 *   
**********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JFUStrConst.ERROR_CODE_0002;

import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JFUCommonUtil;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * ONU情報取得及びeo光ネット提供エリアチェック部品です。
 * <br>
 * @author 富士通
 */
public class JFUGetPonSbtNetCheck
{

	/**  ONU情報取得部品マップキー名（JFUGetOnuInfoCC.getOnuInfo） */
	private static final String FUSV031201CC = "FUSV031201CC";
	/**  5ギガ・10ギガコース提供エリアチェック判定部品マップキー名（JKK5G10GCourseTkAreaChkCC.courseTkAreaChkMain） */
	private static final String FUSV031202CC = "FUSV031202CC";

	/** サービスID */
	private static final String SVC_ID_FUSV0312 = "FUSV0312";

	/** 機能コード */
	private static final String FUNC_CODE = "func_code";

	/** サービス契約番号(ONU) */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** サービス契約番号(5G10G) */
	private static final String KEY_SVC_KEI_NO = "key_svc_kei_no";

	/** PON種別コード */
	public static final String PON_SBT_CD = "pon_sbt_cd";
	/** チェック結果 */
	public static final String CHK_RESULT = "chk_result";

	private static final String KAISEN_SELECT = "kaisen_select";
	private static final String NET_SVC_KEI_NO = "net_svc_kei_no";
	private static final String TEL_SVC_KEI_NO = "tel_svc_kei_no";
	private static final String MSKM_KBN = "mskm_kbn";

	/**
	 * 電話契約Ｅ−ＰＯＮ有無フラグ取得。<br>
	 * 電話契約有りでONUのPON種別がE-PONかのフラグを取得する。
	 * 
	 * <br>
	 * @param bl 実行中のVIEWロジックインスタンス
	 * @return true:「ホーム、メゾン」かつ「ネット未契約」かつ「電話契約有り」かつ「ONU(E-PON)」の場合、false:その他
	 */
	public static boolean getTelEponFlg(X31BWebBusinessLogic bl)
	{
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = bl.getCommonInfoBean();
		// "WEB新規"階層
		X31SDataBeanAccess web_new_infobean = (commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO)).getDataBean(0);

		// 販売タイプ
		String hanbaiType = web_new_infobean.sendMessageString(CommonInfoCFConst.HANBAI_TYPE_06, X31CWebConst.DATABEAN_GET_VALUE);
		HashMap<String, String> rtnKeyMap = getParamInfo(web_new_infobean);
		DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(getTelEponFlg)] 販売タイプ(0：コンシューマ、1:量販、2：訪販)[" + hanbaiType + "] ");

		if (rtnKeyMap == null || rtnKeyMap.size() == 0)
		{
			return false;
		}

		String mskmKbn = rtnKeyMap.get(MSKM_KBN);
		String kaisenSelect = rtnKeyMap.get(KAISEN_SELECT);
		String netSvcKeiNo = rtnKeyMap.get(NET_SVC_KEI_NO);
		String telSvcKeiNo = rtnKeyMap.get(TEL_SVC_KEI_NO);

		DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(getTelEponFlg)] 申込区分[" + mskmKbn + "] 回線場所選択[" + kaisenSelect + "] eo光ネットサービス契約番号[" + netSvcKeiNo
				+ "] eo光電話 サービス契約番号[" + telSvcKeiNo + "]");

		// 「追加申込」 かつ 「契約中の回線に追加」 かつ 「ｅｏ光ネット.サービス契約番号が存在しない」かつ 「ｅｏ光電話.サービス契約番号が存在する」場合
		// PON種別コードの取得を行う。
		if (JFUStrConst.MSKM_KBN_ADD.equals(mskmKbn) && JFUStrConst.KAISEN_SELECT_ADD_KEI.equals(kaisenSelect) && JFUCommonUtil.isNull(netSvcKeiNo)
				&& (!JFUCommonUtil.isNull(telSvcKeiNo)))
		{
			// サービスI/Fの呼び出し処理
			HashMap<String, String> resultMap = callPonSbtNetCheck(bl, rtnKeyMap);
			if (JFUStrConst.CD00211_1.equals(resultMap.get(PON_SBT_CD)))
			{
				// PON種別コードがE-PONの場合、true
				DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(getTelEponFlg)] ONU情報取得及びeo光ネット提供エリアチェック処理  ■「ネット未契約」かつ「電話契約有り」かつ「ONU(E-PON)」■");
				return true;
			}
		}
		DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(getTelEponFlg)] ONU情報取得及びeo光ネット提供エリアチェック処理  ■「ネット未契約」かつ「電話契約有り」かつ「ONU(E-PON)」以外■");
		return false;

	}

	/**
	 * 契約情報を取得。
	 * 
	 * <br>
	 * @param web_new_infobean ＷＥＢ新規情報
	 * @return キー情報
	 */
	private static HashMap<String, String> getParamInfo(X31SDataBeanAccess web_new_infobean)
	{
		// 回線タイプを取得
		String typeKbn = web_new_infobean.sendMessageString(CommonInfoCFConst.MSKM_MNS_TYPE_06, X31CWebConst.DATABEAN_GET_VALUE);
		if (JFUStrConst.MSKM_MNS_TYPE_MANSION.equals(typeKbn))
		{
			// マンションの場合は、対象外のためfalse
			DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(getTelEponFlg)] ONU情報取得及びeo光ネット提供エリアチェック処理  マンション");
			return new HashMap<String, String>();
		}

		// "WEB新規情報.申込区分（種別）"
		String mskmKbn = web_new_infobean.sendMessageString(CommonInfoCFConst.MSKM_KBN_06, X31CWebConst.DATABEAN_GET_VALUE);
		// "WEB新規情報.その他情報"
		X31SDataBeanAccess elseInfo = web_new_infobean.getDataBeanArray(CommonInfoCFConst.ELSE_INFO).getDataBean(0);
		// "WEB新規情報.その他情報.回線場所選択"
		String kaisenSelect = elseInfo.sendMessageString(CommonInfoCFConst.KAISEN_SELECT_18, X31CWebConst.DATABEAN_GET_VALUE);

		// "ｅｏ光ネット"階層
		X31SDataBeanAccess eoNet = (web_new_infobean.getDataBeanArray(CommonInfoCFConst.EONET)).getDataBean(0);
		// "ｅｏ光ネット.サービス契約番号"
		String eoNetSvckeiNo = eoNet.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_12, X31CWebConst.DATABEAN_GET_VALUE);

		// "ｅｏ光電話"階層
		X31SDataBeanAccess eotel = (web_new_infobean.getDataBeanArray(CommonInfoCFConst.EOTEL)).getDataBean(0);
		// "ｅｏ光電話.サービス契約番号"
		String eotelSvckeiNo = eotel.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_12, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, String> rtnMap = new HashMap<String, String>();

		rtnMap.put(MSKM_KBN, mskmKbn);
		rtnMap.put(KAISEN_SELECT, kaisenSelect);
		rtnMap.put(NET_SVC_KEI_NO, eoNetSvckeiNo);
		rtnMap.put(TEL_SVC_KEI_NO, eotelSvckeiNo);

		return rtnMap;
	}

	/**
	 * ONU情報取得及びeo光ネット提供エリアチェック処理を行います。
	 * サービス層にて、サービス判定チェックを行います。
	 * <br>
	 * @param bl 実行中のVIEWロジックインスタンス
	 * @param keyMap 検索キー情報
	 * @param 戻り値
	 */
	private static HashMap<String, String> callPonSbtNetCheck(X31BWebBusinessLogic bl, HashMap<String, String> keyMap)
	{

		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービスIDをparamにセット
		HashMap<String, String> paramMap = new HashMap<String, String>();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SVC_ID_FUSV0312);
		setFUSV031201CC(keyMap, inputMap, JPCModelConstant.FUNC_CD_1);
		setFUSV031202CC(keyMap, inputMap, JPCModelConstant.FUNC_CD_1);

		try
		{
			// サービス呼び出し
			bl.invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// システムエラーの場合、共通エラー画面に遷移します。
			DEBUG_LOG.info("■■■[JFUGetPonSbtNetCheck(callPonSbtNetCheck)] ONU情報取得及びeo光ネット提供エリアチェック処理  サービス呼び出しエラー■■■");
			throw new JCCBusinessException(ERROR_CODE_0002);
		}

		// 戻り値設定
		HashMap<String, String> resultMap = new HashMap<String, String>();
		String ponSbtCd = getFUSV031201CC(outputMap);
		String chkResult = getFUSV031202CC(outputMap);
		resultMap.put(PON_SBT_CD, ponSbtCd);
		resultMap.put(CHK_RESULT, chkResult);

		DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(callPonSbtNetCheck)] PON種別コード[" + ponSbtCd + "]");
		DEBUG_LOG.debug("[JFUGetPonSbtNetCheck(callPonSbtNetCheck)] 提供エリア１０Ｇフラグ[" + chkResult + "]");

		return resultMap;
	}

	/**
	 * ONU情報取得(上りマッピング)。
	 * @param keyMap 検索キー情報
	 * @param outputMap マップ
	 * @param func_code 機能コード
	 * @return HashMap マップ
	 */
	@SuppressWarnings("unchecked")
	private static HashMap setFUSV031201CC(HashMap<String, String> keyMap, HashMap outputMap, String func_code)
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);

		// サービス契約番号 → ONU情報取得CC.サービス契約番号
		parentMap.put(SVC_KEI_NO, keyMap.get(TEL_SVC_KEI_NO));

		outputMap.put(FUSV031201CC, parentMap);

		return outputMap;
	}

	/**
	 * ONU情報取得(下りマッピング)。
	 * @param outputMap マップ
	 * @return String PON種別コード
	 */
	@SuppressWarnings("unchecked")
	private static String getFUSV031201CC(HashMap outputMap)
	{

		String ponSbtCd = JFUStrConst.EMPTY;
		if (outputMap.containsKey(FUSV031201CC))
		{
			HashMap resultMap = (HashMap)outputMap.get(FUSV031201CC);
			ponSbtCd = (String)resultMap.get(PON_SBT_CD);
		}

		// PON種別コード ← ONU情報取得CC.PON種別コード 
		return JFUCommonUtil.nvl(ponSbtCd, JFUStrConst.EMPTY);
	}

	/**
	 * 5ギガ・10ギガコース提供エリアチェック判定(上りマッピング)。
	 * @param keyMap 検索キー情報
	 * @param outputMap マップ
	 * @param func_code　機能コード
	 * @return HashMap マップ
	 */
	@SuppressWarnings("unchecked")
	private static HashMap setFUSV031202CC(HashMap<String, String> keyMap, HashMap outputMap, String func_code)
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// サービス契約番号 → 5ギガ・10ギガコース提供エリアチェックCC.サービス契約番号
		parentMap.put(KEY_SVC_KEI_NO, keyMap.get(TEL_SVC_KEI_NO));

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);

		outputMap.put(FUSV031202CC, parentMap);

		return outputMap;
	}

	/**
	 * 5ギガ・10ギガコース提供エリアチェック判定(下りマッピング)。
	 * @param outputMap マップ
	 * @return String　提供エリア１０Ｇフラグ
	 */
	@SuppressWarnings("unchecked")
	private static String getFUSV031202CC(HashMap outputMap)
	{

		String chkResult = JFUStrConst.EMPTY;
		if (outputMap.containsKey(FUSV031202CC))
		{
			HashMap resultMap = (HashMap)outputMap.get(FUSV031202CC);
			chkResult = (String)resultMap.get(CHK_RESULT);
		}

		// 提供エリア１０Ｇフラグ ← 5ギガ・10ギガコース提供エリアチェックCC.チェック結果 
		return JFUCommonUtil.nvl(chkResult, JFUStrConst.EMPTY);
	}
}
