/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKKojiRnkiSysJdg
*   ソースファイル名：JKKKojiRnkiSysJdg.java
*   作成者          ：富士通
*   日付            ：2014年07月14日
*＜機能概要＞
*   工事連携システム判定処理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*  v10.00.00    2014/07/14   FJ）江藤    新規作成(【ANK-1918-00-00】ＵＳ管理Ｓ向けｅｏ顧客ＳのＩ／Ｆ改修)
*  v41.00.00    2019/02/01   FJ）三原    【ANK-3387-00-00】マンションタイプ光コンセントサービス導入
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.Map;
import java.lang.String;

import com.fujitsu.futurity.bp.custom.constant.JKKKojiRnkiSysJdgConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
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.CCException;
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.common.constant.JKKStrConst;
import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0861B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0861B002CBSMsg1List;


public class JKKKojiRnkiSysJdg extends AbstractCommonComponent
{
	/** エラーメッセージ */
	public static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;
	
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKKojiRnkiSysJdgMapperCC mapper = null;
	
	/**
	 * 初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKKojiRnkiSysJdgMapperCC();
		}

		if (param.getData(fixedText) == null)
		{  //本来は呼び出し側でparamに詰め込むべき
			param.setData(fixedText, new HashMap<String, Object>());
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}
	
	/**
	 * 入力パラメータのチェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	@SuppressWarnings("unchecked")
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData)
	{
		String strVal;
		
		// サービス契約番号
		strVal = (String)trgtData.get(JKKKojiRnkiSysJdgConstCC.SVC_KEI_NO);
		
		if (JKKBpCommon.isNull(strVal))
		{
			return "サービス契約番号が未設定";
		}
		
		return "";
	}
	/**
	 * 工事連携システム判定処理<br>
	 * 工事連携する相手先システムを判定します。<br>
	 * ※現時点ではUS管理を判定するために使用してください（OPMSの考慮はしていません）
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public void jdgKojiRnkiSys(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData, String fixedText) 
	throws Throwable
	{
		// OUTPUT.工事連携システム(初期値:NULL)
		String kojiRnkiSys = null;
		
		init(param, fixedText);
		
		// 入力パラメータチェック処理
		String errMsg = chkInput(handle, param, trgtData);

		if (!JKKCommonUtil.isNull(errMsg))
		{
			// チェックエラー
			throw new CCException("", new SCCallException(errMsg, String.valueOf(9051), 8011));
		}
		
		// マンション情報一覧照会（サービス契約番号）
		CAANMsg msgEKK0861B002 = callEKK0861B002SC(handle, param, trgtData, fixedText, (String)trgtData.get(JKKKojiRnkiSysJdgConstCC.SVC_KEI_NO));
		
		if (msgEKK0861B002 != null)
		{
			String mansionBukkenCd = msgEKK0861B002.getString(EKK0861B002CBSMsg1List.MANSION_BUKKEN_CD);
			
			if (JKKStrConst.MANSION_BUKKEN_CD_MANSION.equals(mansionBukkenCd))
			{
				// マンションの場合
				
				// マンション通信設備コード取得
				String mansTushinEquipCd = getMansTushinEquipCd(handle, param, trgtData, fixedText, msgEKK0861B002);
				
				if (JKKStrConst.CD01265_ENET.equals(mansTushinEquipCd)
						|| JKKStrConst.CD01265_VDSL.equals(mansTushinEquipCd)
				)
				{
					// イーサ、VDSLの場合
					// OUTPUT.工事連携システムにUSを設定
					kojiRnkiSys = JKKKojiRnkiSysJdgConstCC.KOJI_RNKI_SYS_US;
				}
				else
				{
					// 光配線の場合
				}
			}
			else
			{
				// メゾンの場合
			}
		}
		
		trgtData.put(JKKKojiRnkiSysJdgConstCC.KOJI_RNKI_SYS, kojiRnkiSys);
	}
	
	/**
	 * マンション通信設備コード取得<br>
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @param msgEKK0861B002 マンション情報一覧照会（サービス契約番号）結果
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private String getMansTushinEquipCd(
			SessionHandle handle
			,IRequestParameterReadWrite param
			,HashMap trgtData
			,String fixedText
			,CAANMsg msgEKK0861B002 
	) throws Throwable
	{
		
		// 提供方式コード
		String tkHoshikiCd = msgEKK0861B002.getString(EKK0861B002CBSMsg1List.TK_HOSHIKI_CD);
		
		// ANK-3387-00-00 ADD START
		// 提供方式パターンコード
		String tkHoshikiPatternCd = msgEKK0861B002.getString(EKK0861B002CBSMsg1List.TK_HOSHIKI_PATTERN_CD);
		// ANK-3387-00-00 ADD END
		
		if( JKKStrConst.CD00590_ETHERNET.equals(tkHoshikiCd) 
				|| JKKStrConst.CD00590_GIGA_ETHERNET.equals(tkHoshikiCd) 
			)
		{
			// イーサ
			return JKKStrConst.CD01265_ENET;
			
		}
		else if ( JKKStrConst.CD00590_VDSL1.equals( tkHoshikiCd ) 
				|| JKKStrConst.CD00590_VDSL2.equals( tkHoshikiCd )
				|| JKKStrConst.CD00590_VDSL3.equals( tkHoshikiCd ) 
				|| JKKStrConst.CD00590_VDSL4.equals( tkHoshikiCd )
				|| JKKStrConst.CD00590_VDSL5.equals( tkHoshikiCd ) 
			)
		{
			// VDSL
			return JKKStrConst.CD01265_VDSL;
			
		}
		else if ( JKKStrConst.CD00590_OPTICAL.equals( tkHoshikiCd ) 
				|| JKKStrConst.CD00590_OLD_OPTICAL.equals( tkHoshikiCd )
			)
		{
			// 光配線
			// ANK-3387-00-00 ADD START
			// 光コンセントの場合はVDSLに合わせる
			if (JKKStrConst.TK_HOSHIKI_PATTERN_CD_51.equals(tkHoshikiPatternCd))
			{
				return JKKStrConst.CD01265_VDSL;
			}
			// ANK-3387-00-00 ADD END
			return JKKStrConst.CD01265_HIKARI_HAISEN;
		}
		else
		{
			
		}

		return null;
	}
	
	/**
	 * マンション情報一覧照会（サービス契約番号）処理
	 * <br>
	 * マンション情報一覧照会（サービス契約番号）サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return 機器オプションサービス契約一意照会結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callEKK0861B002SC(
			SessionHandle handle
			,IRequestParameterReadWrite param
			,HashMap trgtData
			,String fixedText
			,String svcKeiNo
	) throws Throwable
	{
		// 照会結果
		CAANMsg msg = null;

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0861B002(param, svcKeiNo);
		
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0861B002CBSMsg().getContents());

		// 結果を返却
		CAANMsg[] rsltMsgList = rsltMsg.getCAANMsgList(EKK0861B002CBSMsg.EKK0861B002CBSMSG1LIST);
		if (rsltMsgList != null && rsltMsgList.length > 0)
		{
			msg = rsltMsgList[0];
		}

		return msg;
	}
	
	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用する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;
	}

}
