/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUCommonRelationCheck
 *   ソースファイル名：JFUCommonRelationCheck.java
 *   作成者          ：富士通
 *   日付            ：2011年09月23日
 *＜機能概要＞
 *   共通関連チェック部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/09/23   FJ）和田    新規作成
 *   v4.00       2012/09/30   FJ）中谷    変更【ANK-1163-00-00】変更系申込が可能となるタイミングについて
 *   v5.00       2013/04/11   FJ）中谷    変更【IT1-2013-0000843】共通関連チェック(住所変更中チェック)対応
 *   v5.00       2013/04/26   FJ）中谷    変更【IT1-2013-0000843】共通関連チェック(住所変更中チェック)対応
 *   v5.00       2013/05/23   FJ）中谷    変更【ST3-2013-0000919】eoメールアドレス対応
 *   v8.00       2014/05/26   FJ）中谷    変更【OM-2014-0001954】電話オプション申込の住変中チェックの改修
 *   v71.00      2024/04/02   FJ) 張本    変更【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
 *   
**********************************************************************/
package eo.web.webview.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

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.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31SWebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 共通関連チェック部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUCommonRelationCheck
{
	/** 共通関連チェックコンポーネント部品マップキー名 */
	private static final String CC_TITLE_FUSV016701 = "FUSV016701CC";

	/** BP項目(サービス契約番号) */
	private static final String BP_SVC_KEI_NO = "key_svc_kei_no";
	/** BP項目(電話番号) */
	private static final String BP_TELNO = "key_telno";
	/** BP項目(ＰＯＰＩＤ) */
	private static final String BP_POPID = "key_popid";
	/** BP項目(Ｃ−ＣＡＳカード番号) */
	private static final String BP_CCAS_NO = "key_ccas_no";
	/** BP項目(サービス契約回線内訳番号) */
	private static final String BP_SVC_KEI_KAISEN_UCWK_NO = "key_svc_kei_kaisen_ucwk_no";
	/** BP項目(論理画面ＩＤ) */
	private static final String BP_RONRI_SCREEN_ID = "ronri_screen_id";
	/** BP項目(実行モード) */
	private static final String BP_REL_CHK_EXEC_MODE = "rel_chk_exec_mode";
	/** BP項目(住所変更チェックパターン) */
	private static final String BP_AD_CHG_CHK_PATTERN = "ad_chg_chk_pattern";
	/** BP項目(住所変更有無) */
	private static final String BP_AD_CHG_UM = "ad_chg_um";

	/** サービスID */
	private static final String SVC_ID_FUSV0167 = "FUSV0167";
	/** 論理画面ID文字列長 */
	private static final int RONRI_SCREEN_ID_LENGTH = 6;

	/**
	 * 共通関連チェック処理を行います。
	 * サービス層にて、サービス判定チェック、督促状態チェック等の共通関連チェックを行います。
	 * <br>
	 * @param bl 実行中のVIEWロジックインスタンス
	 * @param serviceId サービスID
	 */
	public static void checkCommonRelation(X31BWebBusinessLogic bl, String serviceId)
	{
		X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆共通関連チェック処理実行開始！☆☆☆■■■■■");

		if (bl == null || serviceId == null || "".equals(serviceId))
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		try
		{
			JFUCommonRelationCheck.callService(bl, serviceId);
			X31SWebLog.DEBUG_LOG.debug("■■■■■☆☆☆共通関連チェック処理実行終了！☆☆☆■■■■■");
		}
		catch (JCCWebServiceException jwse)
		{
			X31CMessageResult msgRes = jwse.getMessageList();

			for (X31CMessageMoreInfo moreInfo : Arrays.asList(msgRes.getMessageMoreInfoList()))
			{
				// 利用サービスエラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_SVC_KEI.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_SVC_KEI.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					X31SWebLog.DEBUG_LOG.debug("共通関連チェック【利用サービスエラー】");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0101);
				}

				// 契約状態エラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_SVC_KEI_STAT.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_SVC_KEI_STAT.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					X31SWebLog.DEBUG_LOG.debug("共通関連チェック【契約状態エラー】");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}

				// 督促チェックエラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_TOKUSOKU.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_TOKUSOKU.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					X31SWebLog.DEBUG_LOG.debug("共通関連チェック【督促チェックエラー】");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0104);
				}

				// POPIDなしエラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_NO_POPID.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_NO_POPID.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					X31SWebLog.DEBUG_LOG.debug("共通関連チェック【POPIDなしシステムエラー】");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
				}

				// 住所変更申込中エラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_AD_CHG_INCOMP.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_AD_CHG_INCOMP.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0109);
				}

				// eo光ネット⇔シンプルプラン乗換中エラー
				if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(moreInfo.getStatus())
						&& JFUStrConst.RELATION_CHECK_TEMPLATE_ID_SIMPLE_CHG.equals(moreInfo.getTemplateId())
						&& JFUStrConst.RELATION_CHECK_ITEM_SIMPLE_CHG.equals(moreInfo.getItemId())
						&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(moreInfo.getItemCheckErr()))
				{
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0127);
				}

				// 上記以外はシステムエラー
				X31SWebLog.DEBUG_LOG.debug("共通関連チェック【システムエラー】");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}
	}

	/**
	 * 住所変更有無取得
	 * <br>
	 * @param  bl 実行中のVIEWロジックインスタンス
	 * @param adChgChkPattern 住所変更中チェックパターン
	 * @return 住所変更有無
	 */
	public static String getAdChgUm(X31BWebBusinessLogic bl, String adChgChkPattern)
	{
		// 住所変更有無
		String adChgUm = null;

		try
		{
			X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

			HashMap<String, Object> parentMap = new HashMap<String, Object>();

			// ＳＳＯ情報.サービス契約番号
			parentMap.put(BP_SVC_KEI_NO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
					+ CommonInfoCFConst.SVC_KEI_NO_21));
			// ＳＳＯ情報.電話番号
			parentMap.put(BP_TELNO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
					+ CommonInfoCFConst.TELNO_21));
			// 機能コード(2:住所変更有無取得)
			parentMap.put(BP_REL_CHK_EXEC_MODE, JPCModelConstant.FUNC_CD_2);
			// 住所変更チェックパターン
			parentMap.put(BP_AD_CHG_CHK_PATTERN, adChgChkPattern);

			// WEB変更情報
			X31SDataBeanAccessArray webChgInfoBeanArray = commonInfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO);
			X31SDataBeanAccess webChgInfoBean = webChgInfoBeanArray.getDataBean(JFUStrConst.I_ZERO);
			// 現顧客契約情報
			X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
			X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(JFUStrConst.I_ZERO);
			// サービス契約情報
			X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
			X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(JFUStrConst.I_ZERO);
			// サービス契約回線内訳情報
			X31SDataBeanAccessArray svcKeiKaiUcwkInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_INFO);
			X31SDataBeanAccess svcKeiKaiUcwkInfoBean = svcKeiKaiUcwkInfoArray.getDataBean(JFUStrConst.I_ZERO);
			// サービス契約回線内訳情報.サービス契約回線内訳番号
			parentMap.put(BP_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_NO_26,
					X31CWebConst.DATABEAN_GET_VALUE));

			HashMap<String, Object> inputMap = new HashMap<String, Object>();
			HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

			inputMap.put(CC_TITLE_FUSV016701, parentMap);

			// サービスIDをparamにセット
			Map<String, String> paramMap = new HashMap<String, String>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SVC_ID_FUSV0167);

			// サービス呼び出し
			bl.invokeService(paramMap, inputMap, outputMap);

			HashMap childMap = (HashMap)outputMap.get(CC_TITLE_FUSV016701);
			adChgUm = (String)childMap.get(BP_AD_CHG_UM);
		}
		catch (JCCWebServiceException jwse)
		{
			// 上記以外はシステムエラー
			X31SWebLog.DEBUG_LOG.debug("共通関連チェック(住所変更有無取得)【システムエラー】");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		return adChgUm;
	}

	/**
	 * 共通関連チェック処理を行います。
	 * サービス層にて、サービス判定チェック、督促状態チェック等の共通関連チェックを行います。
	 * <br>
	 * @param bl 実行中のVIEWロジックインスタンス
	 * @param serviceId サービスID
	 * @param physicalScreenId 物理画面ID
	 */
	private static void callService(X31BWebBusinessLogic bl, String serviceId)
	{
		X31SDataBeanAccess commonInfoBean = bl.getCommonInfoBean();

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 論理画面ＩＤ
		parentMap.put(BP_RONRI_SCREEN_ID, commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE)
				.substring(0, RONRI_SCREEN_ID_LENGTH));

		// ＳＳＯ情報.サービス契約番号
		parentMap.put(BP_SVC_KEI_NO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
				+ CommonInfoCFConst.SVC_KEI_NO_21));
		// ＳＳＯ情報.電話番号
		parentMap.put(BP_TELNO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
				+ CommonInfoCFConst.TELNO_21));
		// ＳＳＯ情報.ＰＯＰＩＤ
		parentMap.put(BP_POPID, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
				+ CommonInfoCFConst.POP_ID_21));
		// ＳＳＯ情報.Ｃ−ＣＡＳカード番号
		parentMap.put(BP_CCAS_NO, JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SSO_INFO + JFUWebCommon.SEP_0
				+ CommonInfoCFConst.KIKI_SEIZO_NO_21));

		// WEB変更情報
		X31SDataBeanAccessArray webChgInfoBeanArray = commonInfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO);
		X31SDataBeanAccess webChgInfoBean = webChgInfoBeanArray.getDataBean(JFUStrConst.I_ZERO);
		// 現顧客契約情報
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
		X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(JFUStrConst.I_ZERO);

		// 現顧客契約情報ありの場合
		if (null != genCustKeiInfoBean)
		{
			// サービス契約情報
			X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
			X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(JFUStrConst.I_ZERO);
			// サービス契約回線内訳情報
			X31SDataBeanAccessArray svcKeiKaiUcwkInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_INFO);
			X31SDataBeanAccess svcKeiKaiUcwkInfoBean = svcKeiKaiUcwkInfoArray.getDataBean(JFUStrConst.I_ZERO);

			if (null != svcKeiKaiUcwkInfoBean)
			{
				// サービス契約回線内訳情報.サービス契約回線内訳番号
				parentMap.put(BP_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_NO_26,
						X31CWebConst.DATABEAN_GET_VALUE));
			}
		}

		// サービスID
		parentMap.put(JFUStrConst.RELATION_CHECK_SERVICE_ID_KEY, serviceId);

		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		inputMap.put(CC_TITLE_FUSV016701, parentMap);

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SVC_ID_FUSV0167);

		// サービス呼び出し
		bl.invokeService(paramMap, inputMap, outputMap);
	}
}
