/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKChkBmpInfChgCC
*   ソースファイル名：JKKChkBmpInfChgCC.java
*   作成者          ：富士通
*   日付            ：2012年11月13日
*＜機能概要＞
*   番ポ情報変更チェックCCです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/11/13   FJ）        新規作成
*   v72.00.00   2024/07/11   FJ）大路    ANK-4494-00-00_【eo定期】 双方向番ポ対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKChkBmpInfChgConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
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.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191C012CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191C014CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0121A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0121A010CBSMsg1List;

/**
 * 番ポ情報変更チェックCCです。<p>
 * <br>
 * @author FJ
 */
public class JKKChkBmpInfChgCC extends AbstractCommonComponent
{
	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKChkBmpInfChgMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** 進捗特記事項1の最大文字数 */
	private static final int MAX_LENGTH_PRG_TKJK_1 = 128;

	/** 番ポ可能エリア存在チェックのエラーフラグ(サービス契約内訳＜eo光電話＞番ポ情報変更サービスフェース) */
	private static final Object ERR_FLG_BMPKNAREA_CHK = "EF";

	/**
	 * 番ポ情報変更チェックの初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKChkBmpInfChgMapperCC();
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// ユーザ定義領域作成
		createUserData(param, fixedText);

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * 番ポ情報変更チェック処理を行います。<br>
	 * 番ポ可能エリア存在チェックでエラーとなった場合は、進捗登録を行い、エラーとなった電話番号を進捗特記事項に出力します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite chkBmpInfChg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 初期処理
		init(param, fixedText);

		// リクエストパラメータの取得処理
		HashMap<String, Object> trgtData = (HashMap<String, Object>)param.getData(fixedText);
		// サービス契約番号
		String svcKeiNo = (String)trgtData.get(JKKChkBmpInfChgConstCC.SVC_KEI_NO);
		// サービス契約内訳番号
		String svcKeiUcwkNo = (String)trgtData.get(JKKChkBmpInfChgConstCC.SVC_KEI_UCWK_NO);
// ANK-4494-00-00 ADD START
		// 電話番号
		String telno = (String)trgtData.get(JKKChkBmpInfChgConstCC.TELNO);
		// 電話番号マスタの更新年月日時分秒を取得
		getTelnoUpdDtm(handle, param, fixedText, trgtData, telno);
// ANK-4494-00-00 ADD END

		if (null != svcKeiUcwkNo && !svcKeiUcwkNo.isEmpty())
		{
			// サービス契約内訳<eo光電話>一意照会
			CAANMsg msgEKK0191A010 = searchSvkeiuwEohTel(handle, param, fixedText, svcKeiUcwkNo);

			// サービス契約内訳<eo光電話>一覧照会（サービス契約番号）
			// ※サービス契約内訳<eo光電話>一意照会では申込明細番号は取得できないので、
			//   サービス契約内訳<eo光電話>一覧照会（サービス契約番号）を利用して取得する
			CAANMsg msgEKK0191B001 = searchSvkeiuwEohTelList(handle, param, fixedText, svcKeiNo, svcKeiUcwkNo);

			// 照会結果がない場合
			if (null == msgEKK0191A010 || null == msgEKK0191B001)
			{
				// 処理終了
				return param;
			}

			try
			{
				// サービス契約内訳＜eo光電話＞番ポ情報変更
				chgBmpInf(handle, param, fixedText, trgtData, msgEKK0191A010, msgEKK0191B001);
			}
			// サービスインターフェース呼び出しでエラーが発生した場合
			catch (SCCallException scCallEx)
			{
// ANK-4494-00-00 MOD START
//				// 異動区分
//				String idoDiv = (String)trgtData.get(JKKChkBmpInfChgConstCC.IDO_DIV);
//				// 異動区分「光電話・番号追加」で、番ポ可能エリア存在チェックでエラーとなった場合
//				if (JKKSvcConst.IDO_DIV_HTELNOADD.equals(idoDiv)
//					&& trgtData.containsKey(EKK0191C012CBSMsg.TELNO_ERR)
//					&& ERR_FLG_BMPKNAREA_CHK.equals((String)trgtData.get(EKK0191C012CBSMsg.TELNO_ERR)))
//				{
//					// 進捗登録
//					addPrg(handle, param, fixedText, trgtData, msgEKK0191B001);
//					// コミットするため、正常終了する
//					return param;
//				}
//				// ST3-2013-0000040 2013/03/01 mod start
//				else if("WA".equals((String)trgtData.get(EKK0191C012CBSMsg.NTT_AD_CHK_LV_ERR)))
//				{
//					// スローしない
//					trgtData.put(JKKChkBmpInfChgConstCC.WANING_FLG, "1");
//				}
//				else if("WA".equals((String)trgtData.get(EKK0191C012CBSMsg.EMG_AD_CHK_LV_ERR)))
//				{
//					// スローしない
//					trgtData.put(JKKChkBmpInfChgConstCC.WANING_FLG, "2");
//				}
//				// ST3-2013-0000040 2013/03/01 mod end
//				// 上記以外の場合は、そのままExceptionをスロー
//				else
//				{
//					throw scCallEx;
//				}
				if("WA".equals((String)trgtData.get(EKK0191C012CBSMsg.NTT_AD_CHK_LV_ERR)))
				{
					// スローしない
					trgtData.put(JKKChkBmpInfChgConstCC.WANING_FLG, "1");
				}
				else if("WA".equals((String)trgtData.get(EKK0191C012CBSMsg.EMG_AD_CHK_LV_ERR)))
				{
					// スローしない
					trgtData.put(JKKChkBmpInfChgConstCC.WANING_FLG, "2");
				}
				// 上記以外の場合は、そのままExceptionをスロー
				else
				{
					throw scCallEx;
				}
// ANK-4494-00-00 MOD END
			}
		}
		// OT-2013-0000577 番ポ情報登録画面で番ポ情報チェックがされていない 2013/04/08 START
		// サービス契約内訳番号が設定されていない場合(1回目の番号追加)
		else
		{
			try
			{
				chkBmpInfAddKh(handle, param, fixedText, trgtData);
			}
			// サービスインターフェース呼び出しでエラーが発生した場合
			catch (SCCallException scCallEx)
			{
// ANK-4494-00-00 MOD START
//				// 異動区分
//				String idoDiv = (String)trgtData.get(JKKChkBmpInfChgConstCC.IDO_DIV);
//				// 異動区分「光電話・番号追加」で、番ポ可能エリア存在チェックでエラーとなった場合
//				if (JKKSvcConst.IDO_DIV_HTELNOADD.equals(idoDiv)
//					&& trgtData.containsKey(EKK0191C014CBSMsg.TELNO_ERR)
//					&& ERR_FLG_BMPKNAREA_CHK.equals((String)trgtData.get(EKK0191C014CBSMsg.TELNO_ERR)))
//				{
//					// 進捗登録
//					addPrg(handle, param, fixedText, trgtData, null);
//					// コミットするため、正常終了する
//					return param;
//				}
//				// 上記以外の場合は、そのままExceptionをスロー
//				else
//				{
//					throw scCallEx;
//				}
				throw scCallEx;
// ANK-4494-00-00 MOD END
			}
		}
		// OT-2013-0000577 番ポ情報登録画面で番ポ情報チェックがされていない 2013/04/08 END

		return param;
	}

	/**
	 * サービス契約内訳＜eo光電話＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvkeiuwEohTel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo)
	throws Throwable
	{
		// 照会結果
		CAANMsg msgEKK0191A010 = null;

		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0191A010 = this.mapper.editInMsgEKK0191A010(param, svcKeiUcwkNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0191A010 = callSvcInter(handle, param, fixedText, inMapEKK0191A010, new EKK0191A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgListEKK0191A010 = rsltMsgEKK0191A010.getCAANMsgList(EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST);
		if (rsltMsgListEKK0191A010.length > 0)
		{
			msgEKK0191A010 = rsltMsgListEKK0191A010[0];
		}

		return msgEKK0191A010;
	}

	/**
	 * EKK0191B001_サービス契約内訳＜eo光電話＞一覧照会（サービス契約番号）サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳＜eo光電話＞一覧照会（サービス契約番号）結果
	 * @throws Throwable
	 */
	private CAANMsg searchSvkeiuwEohTelList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String svcKeiNo, String svcKeiUcwkNo)
	throws Throwable
	{
		// 照会結果
		CAANMsg msgEKK0191B001 = null;

		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0191B001 = this.mapper.editInMsgEKK0191B001(param, svcKeiNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEKK0191B001 = callSvcInter(handle, param, fixedText, inMapEKK0191B001, new EKK0191B001CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgListEKK0191B001 = rsltMsgEKK0191B001.getCAANMsgList(EKK0191B001CBSMsg.EKK0191B001CBSMSG1LIST);
		for (int i = 0; null != rsltMsgListEKK0191B001 && rsltMsgListEKK0191B001.length > i; i++)
		{
			String tmpSvcKeiUcwkNo = rsltMsgListEKK0191B001[i].getString(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO);
			if (tmpSvcKeiUcwkNo.equals(svcKeiUcwkNo))
			{
				msgEKK0191B001 = rsltMsgListEKK0191B001[i];
				break;
			}
		}

		return msgEKK0191B001;
	}

	/**
	 * サービス契約内訳＜eo光電話＞番ポ情報変更サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0191A010 サービス契約内訳＜eo光電話＞一意照会結果
	 * @param msgEKK0191B001 サービス契約内訳＜eo光電話＞一覧照会（サービス契約番号）結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void chgBmpInf(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap trgtData, CAANMsg msgEKK0191A010, CAANMsg msgEKK0191B001)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0191C012 = this.mapper.editInMsgEKK0191C012(param, trgtData, msgEKK0191A010, msgEKK0191B001);

		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMapEKK0191C012, new EKK0191C012CBSMsg().getContents());
	}

	/**
	 * 進捗登録サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0191B001 サービス契約内訳＜eo光電話＞一覧照会（サービス契約番号）結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void addPrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap trgtData, CAANMsg msgEKK0191B001)
	throws Throwable
	{
		// 進捗特記事項1を編集
		String wkPrgTkjk1 = "電話番号：" + (String)trgtData.get(JKKChkBmpInfChgConstCC.TELNO);
		String prgTkjk1 = wkPrgTkjk1;

		// 進捗特記事項1の最大文字数を超えている場合は切る(全角・半角を区別せず文字数で判定)
		if (MAX_LENGTH_PRG_TKJK_1 < wkPrgTkjk1.length())
		{
			prgTkjk1 = wkPrgTkjk1.substring(0, MAX_LENGTH_PRG_TKJK_1);
		}

		// 上りマッピング処理
		HashMap<String, Object> inMapEKK1091D010 = this.mapper.editInMsgEKK1091D010(param, trgtData, msgEKK0191B001, prgTkjk1);

		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMapEKK1091D010, new EKK1091D010CBSMsg().getContents());
	}

	// OT-2013-0000577 番ポ情報登録画面で番ポ情報チェックがされていない 2013/04/08 START
	/**
	 * 番ポ情報登録可否チェックサービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void chkBmpInfAddKh(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap trgtData)
	throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> inMapEKK0191C014 = this.mapper.editInMsgEKK0191C014(param, trgtData);

		// サービスインターフェース呼び出し
		callSvcInter(handle, param, fixedText, inMapEKK0191C014, new EKK0191C014CBSMsg().getContents());
	}
	// OT-2013-0000577 番ポ情報登録画面で番ポ情報チェックがされていない 2013/04/08 END

// ANK-4494-00-00 ADD START
	/**
	 * 電話番号一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param telno 電話番号
	 * @return サービス契約内訳＜eo光電話＞一意照会結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void getTelnoUpdDtm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap trgtData, String telno)
	throws Throwable
	{
		// 照会結果
		CAANMsg msgEZM0121A010 = null;

		// 上りマッピング処理
		HashMap<String, Object> inMapEZM0121A010 = this.mapper.editInMsgEZM0121A010(param, telno);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsgEZM0121A010 = callSvcInter(handle, param, fixedText, inMapEZM0121A010, new EZM0121A010CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgListEZM0121A010 = rsltMsgEZM0121A010.getCAANMsgList(EZM0121A010CBSMsg.EZM0121A010CBSMSG1LIST);
		if (rsltMsgListEZM0121A010 != null && rsltMsgListEZM0121A010.length > 0)
		{
			msgEZM0121A010 = rsltMsgListEZM0121A010[0];
			trgtData.put(JKKChkBmpInfChgConstCC.ZM0121_UPD_DTM, msgEZM0121A010.getString(EZM0121A010CBSMsg1List.UPD_DTM));
		}
	}
// ANK-4494-00-00 ADD END

	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用するUtil系のメソッド ↓↓↓↓↓
	 * --------------------------------------------------------------------------------------------
	 */

	/**
	 * サービスインターフェース呼び出し処理です。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param siInMap サービスインターフェースの入力マップ
	 * @param contents サービスインターフェースのテンプレート項目の配列
	 * @return 業務データ
	 * @throws Throwable 
	 */
	private CAANMsg callSvcInter(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			HashMap<String, Object> siInMap,
			Object[][] contents)
			throws Throwable
	{
		
		// サービスインターフェースの呼び出し
		Map<?, ?> rsltMap = this.scCall.run(siInMap, handle);
		// エラーマッピング処理
		this.mapper.editResultRP(rsltMap, param, fixedText, contents);
		// エラーチェック処理
		errChk(rsltMap);
		// 業務データ取得処理
		CAANMsg workData = getWorkCAANMsg(rsltMap);

		return workData;
	}

	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @throws SCCallException 
	 */
	private void errChk(
			Map<?, ?> msgList) 
			throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = ERR_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}

	/**
	 * ユーザ定義文字列がユーザ情報になければデータを作成します。 <br>
	 * 
	 * @param param 業務データ取得用I/F
	 * @param workMapKey 業務データのマップキー
	 * @return true：作成した　False：存在していたため作成不要
	 * @throws RequestParameterException
	 */
	private boolean createUserData(IRequestParameterReadWrite param, String workMapKey)
			throws RequestParameterException
	{
		if (param.getData(workMapKey) == null)
		{
			param.setData(workMapKey, new HashMap<String, Object>());
			return true;
		}

		return false;
	}
}
