/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUOrosiCheckCC
*   ソースファイル名：JFUOrosiCheckCC.java
*   作成者          ：富士通
*   日付            ：2018年02月20日
*＜機能概要＞
*   新規系・変更系申込の設備卸チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v37.00      2018/02/20   FJ)美濃原   新規作成【ANK-3366-00-00】eo光設備卸対応
*   v73.00      2024/07/10   FJ) 浅井    変更    【ANK-4427-00-00】NTT卸対応
***********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

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.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
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.ECK0011B504CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B504CBSMsg1List;

//ANK-4427-00-00 add start
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg1List;
//ANK-4427-00-00 add end

/**
 * 新規系・変更系申込の設備卸チェックコモンコンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings( { "unchecked" })
public class JFUOrosiCheckCC extends JFUBaseNetChgCommonCC
{

	/* ■□ 現顧客情報一覧照会SC ■□ */
	/** テンプレートID(現顧客情報一覧照会) */
	private static final String TEMPLATE_ID_CUST_INFO = "ECK0011B504";
	/** テンプレートID(現顧客情報一覧照会明細) */
	private static final String TEMPLATE_ID_CUST_INFO_DETAIL = ECK0011B504CBSMsg.ECK0011B504CBSMSG1LIST;
	/** IN項目リスト(現顧客情報一覧照会) */
	private static final List<String> IN_COLUMN_LIST_SVC_KEI = Arrays.asList(ECK0011B504CBSMsg.KEY_SYSID);
	/** 関連チェックエラー項目(現顧客情報一覧照会) */
	private static final String ERROR_COLUMN_SYSID = ECK0011B504CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(現顧客情報一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_SVC_KEI = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_CUST_INFO + TEMP_TEMPLATE_PRIFIX_SEP + "1";
	/** エラー項目キー(設備卸 利用サービスエラー) */
	private static final String ENABLED_SVC_ERR = "enabled_svc_err";

// ANK-4427-00-00 add start
	/* ■□ サービス契約一覧照会SC ■□ */
	/** テンプレートID(サービス契約一覧照会（SYSID）) */
	private static final String TEMP_ID_EKK0081B519 = "EKK0081B519";
	/** テンプレートID(サービス契約一覧照会（SYSID）明細) */
	private static final String TEMP_ID_DTL_EKK0081B519 = EKK0081B519CBSMsg.EKK0081B519CBSMSG1LIST;
	/** IN項目リスト(サービス契約一覧照会（SYSID）) */
	private static final List<String> IN_LIST_EKK0081B519 = Arrays.asList(EKK0081B519CBSMsg.KEY_SYSID);
	/** 関連チェックエラー項目(サービス契約一覧照会（SYSID）) */
	private static final String ERR_EKK0081B519 = EKK0081B519CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(サービス契約一覧照会（SYSID）) */
	private static final String TEMP_TEMP_KEY_EKK0081B519 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0081B519 + TEMP_TEMPLATE_PRIFIX_SEP;
// ANK-4427-00-00 add end

	/* ■□ IN項目 ■□ */
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** KEY_SYSID */
	private static final String KEY_SYSID = "key_sysid";

// ANK-4427-00-00 add start
	/** KEY_SCREENID */
	private static final String KEY_SCREENID = "key_screenid";
// ANK-4427-00-00 add end

	/* ■□ サービスID ■□ */
	/** エラーメッセージ：■ */
	private static final String ERR_MSG_SQUARE = " ■■■";
	/** エラーメッセージ1-1 */
	private static final String ERR_MSG_1_1 = "■■■ 設備卸チェックエラー 卸先事業者コード:";

// ANK-4427-00-00 add start
	/** エラーメッセージ1-2 */
	private static final String ERR_MSG_1_2 = "■■■ 設備卸チェックエラー NTT卸使用不可画面:";
// ANK-4427-00-00 add end

	/**
	 * 新規系・変更系申込の設備卸チェック実行処理<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite executeCheck(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		try
		{

// ANK-4427-00-00 add start
			HashMap inMap = (HashMap)param.getData(fixedText);
			String keySysId = (String)inMap.get(KEY_SYSID);
			String keyScreenId = (String)inMap.get(KEY_SCREENID);
			// 設備卸業者利用可能画面の場合は設備卸チェックは行わずにNTT卸チェックを行う
			if (!JFUStrConst.SCREEN_USE_PSB_OROSI.contains(keyScreenId))
			{
// ANK-4427-00-00 add end

				// 上りマッピング
				setInMapCustSearch(param, fixedText);

				// ●現顧客情報一覧照会
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_CUST_INFO, TEMPLATE_ID_CUST_INFO_DETAIL, IN_COLUMN_LIST_SVC_KEI, ERROR_COLUMN_SYSID);

				// 卸先事業者コード
				String orsjgsCd =
						getTemplateListValue((HashMap)param.getData(fixedText), TEMP_TEMPLATE_KEY_SVC_KEI, TEMPLATE_ID_CUST_INFO_DETAIL,
								ECK0011B504CBSMsg1List.ORSJGS_CD, 0);

				// ●設備卸チェック
				checkUseEnableService(param, fixedText, orsjgsCd);

// ANK-4427-00-00 add start
			}
			// 上りマッピング
			setInMapKeiSearch(param, fixedText, keySysId);

			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);

			// ●サービス契約一覧照会（SYSID）
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK0081B519, TEMP_ID_DTL_EKK0081B519, IN_LIST_EKK0081B519, ERR_EKK0081B519);

			// 結果取得
			List<HashMap> eKK0081B519List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0081B519), TEMP_ID_DTL_EKK0081B519);

			// ●NTT卸チェック
			checkUseEnableServiceNtt(param, fixedText, eKK0081B519List, keyScreenId);
// ANK-4427-00-00 add end

		}
		finally
		{
			super.deleteTempArea(param, fixedText);
		}

		return param;
	}

	/**
	 * 上りマッピング項目設定(現顧客情報一覧照会)
	 * 
	 * <br>
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapCustSearch(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 機能コード設定
		setFuncCode(param, fixedText, (String)inMap.get(FUNC_CODE));
		// IN項目:ＫＥＹ＿ＳＹＳＩＤ
		inMap.put(ECK0011B504CBSMsg.KEY_SYSID, (String)inMap.get(KEY_SYSID));
	}

// ANK-4427-00-00 add start
	/**
	 * 上りマッピング項目設定(サービス契約情報一覧照会)
	 * 
	 * <br>
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapKeiSearch(IRequestParameterReadWrite param, String fixedText, String keySysId) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// IN項目:ＫＥＹ＿ＳＹＳＩＤ
		inMap.put(EKK0081B519CBSMsg.KEY_SYSID, keySysId);
	}
// ANK-4427-00-00 add end

	/**
	 * 設備卸チェック
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param orsjgsCd 卸先事業者コード
	 * @throws RequestParameterException 
	 * @throws SCCallException 
	 */
	private void checkUseEnableService(IRequestParameterReadWrite param, String fixedText, String orsjgsCd) throws RequestParameterException,
			SCCallException
	{

		// 卸先事業者コードがブランクの場合は、純粋なeo契約者として判定する。
		if (orsjgsCd == null)
		{
			return;
		}
		if (JFUStrConst.EMPTY.equals(orsjgsCd))
		{
			return;
		}

		// 卸先事業者コードがブランクでない場合は、エラー。
		JFUBPCommon.printBpDebugLog(this.getClass(), ERR_MSG_1_1 + orsjgsCd + ERR_MSG_SQUARE);
		setRelationErrorInfo(param, TEMPLATE_ID_CUST_INFO, ENABLED_SVC_ERR, fixedText);
		throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
				JPCModelConstant.RELATION_ERR);
	}

// ANK-4427-00-00 add start
	/**
	 * NTT卸チェック
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param eKK0081B519List サービス契約一覧
	 * @throws RequestParameterException 
	 * @throws SCCallException 
	 */
	private void checkUseEnableServiceNtt(IRequestParameterReadWrite param, String fixedText, List<HashMap> eKK0081B519List, String keyScreenId ) throws RequestParameterException,
			SCCallException
	{
		String errscrId = null;

		if(eKK0081B519List != null && eKK0081B519List.size() > 0)
		{
			for (int i = 0; i < eKK0081B519List.size(); i++)
			{
				HashMap eKK0081B519Map = eKK0081B519List.get(i);
				if(eKK0081B519Map == null || eKK0081B519Map.size() == 0)
				{
					continue;
				}

				// ステータス
				String svcKeiStat = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.SVC_KEI_STAT);
				// 解約済、キャンセル済の場合はチェック対象外
				if (svcKeiStat.equals(JFUStrConst.CD00037_910) || svcKeiStat.equals(JFUStrConst.CD00037_920))
				{
					continue;
				}

				// NTT卸区分
				String nttOrsDiv = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.NTTORS_DIV);
				//NTT卸の場合
				if(nttOrsDiv != null)
				{
					String screenId = keyScreenId;
					// 以下の画面は利用不可とする
					if (JFUStrConst.SCREEN_NOT_TYPEN.contains(screenId))
					{
						errscrId = screenId;
						break;
					}
				}
			}
		}

		if (errscrId == null) {
			return;
		}
		else {
			JFUBPCommon.printBpDebugLog(this.getClass(), ERR_MSG_1_2 + errscrId + ERR_MSG_SQUARE);
			setRelationErrorInfo(param, TEMPLATE_ID_CUST_INFO, ENABLED_SVC_ERR, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
					JPCModelConstant.RELATION_ERR);
		}
	}
// ANK-4427-00-00 add end

}
