/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKAdchgVLanGetCC
 *  ソースファイル名：JKKAdchgVLanGetCC.java
 *  作成者          ：FJ
 *  日付            ：2013年09月04日
 *＜機能概要＞
 *  VLAN-ID取得（住所変更）CC部品
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2013/09/04  FJ          新規作成（OM-2013-0001395対応）
 *  v44.00.00	2019/06/20  FJ)澤田	    ANK-3652-00-00 光コンセントフォロー対応 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.Map;

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 eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ESC0021D010CBSMsg;

/**
 * 住所変更共通登録コンポーネント部品クラス
 * <br>
 * @author FJ
 */
public class JKKAdchgVLanGetCC extends AbstractCommonComponent {

	/**************************************************/
	/** ESC0021D010 電話用ＶＬＡＮオーダ受付          */
	/**************************************************/
	/** 要求元アプリ種別コード */
	private static final String YOKYU_MT_APL_SBT_CD_WEB = "W";
	/** ＶＬＡＮオーダコード */
	private static final String VLAN_ORDER_CD_VLAN = "01";
	/** 要求種別コード */
	private static final String YOKYU_SBT_CD_NEW = "02";
	/** ＶＬＡＮサーバコード */
	private static final String VLAN_SERVER_CD_SETSUBIKANRI = "1";
	
	/**************************************************/
	/** サービス契約回線内訳                          */
	/**************************************************/
	/** VLAN-ID確定フラグ */
	private static final String VLAN_ID_FIX_FLG_ZUMI = "1";

	/**************************************************/
	/** 工事案件                                      */
	/**************************************************/
	/** 工事案件ステータス：工事会社決定済 */
	private static final String KOJIAK_STAT_KOJIKAISHAKETTEIZUMI = "160";
	/** 工事案件ステータス：工事完了済 */
	private static final String KOJIAK_STAT_KOJIKANRYOZUMI = "200";


	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>();

	/** リクエストパラメータ保持域 */
	private static ThreadLocal<IRequestParameterReadWrite> keepReqParam = new ThreadLocal<IRequestParameterReadWrite>();

	/** fixedText保持域 */
	private static ThreadLocal<String> keepFixedText = new ThreadLocal<String>();

	/**
	 * コンストラクタ
	 * <br>
	 */
	public JKKAdchgVLanGetCC() {
	}

	/**
	 * 転居先の回線にVLAN-IDが払出されていない場合にVLAN-IDの取得を行う
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		
		try {
			// リソース保持
			keepSesHandle.set( handle );
			keepReqParam.set( param );
			keepFixedText.set( fixedText );

			// 事前準備
			HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
			if (paramMap == null) {
				return param;	// パラメータ未設定のため処理終了
			}

			// サービス契約回線内訳をチェック
			if (checkSvcKeiKaisenUcwk(paramMap)) {
				return param;	// VLAN-IDは払出済のため処理終了
			}

			// 工事案件ステータスをチェック
			if (checkKojiAnkenStatus(paramMap)) {
				return param;	// VLAN-IDは他処理にて払出されるのでここでは取得せず処理終了
			}

			/** 工事案件ステータスが 160：工事会社決定済 〜 200：工事完了済 の場合は工事のバッチ処理により
			 *  VLAN-IDが払出されているはずで、この状態で回線にVLAN-IDが未設定であれば払出が必要となる。
			 *  ※移行データの場合、工事完了でVLAN-ID未設定の回線内訳が作成されている問題に対応
			 *  ステータスが 160 までの場合、今後の工事の進捗により別処理にて払出が行われる。
			 *  マンション（イーサ、VDSL）の場合は常に別処理にて払出が行われるので、本処理での払出は不要。
			 *  ※ステータスは登録時の 120：登録済みのままで変化しないため払出対象とならない
			 */

			// VLAN-ID払出
			getVLanId(paramMap);

		} finally {
			// リソース開放
// OM-2013-0004303対応 20131120 星野 MOD START
//			if (keepSesHandle.get() == null) {
			if (keepSesHandle.get() != null) {
// OM-2013-0004303対応 20131120 星野 MOD END
				keepSesHandle.remove();
			}
// OM-2013-0004303対応 20131120 星野 MOD START
//			if (keepReqParam.get() == null) {
			if (keepReqParam.get() != null) {
// OM-2013-0004303対応 20131120 星野 MOD END
				keepReqParam.remove();
			}
// OM-2013-0004303対応 20131120 星野 MOD START
//			if (keepFixedText.get() == null) {
			if (keepFixedText.get() != null) {
// OM-2013-0004303対応 20131120 星野 MOD END
				keepFixedText.remove();
			}
		}

		// 処理終了
		return param;
	}

	/**
	 * 転居先のサービス契約回線内訳にVLAN-IDが設定されているか確認する
	 * 
	 * @param		paramMap	パラメータ
	 * @return		true：設定済	false：未設定
	 */
	private boolean checkSvcKeiKaisenUcwk(HashMap<String, Object> paramMap) throws Exception {

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// EKK0251A010 サービス契約回線内訳一意照会（カレント取得）
		HashMap<String, String> condMap = new HashMap<String, String>();
		// サービス契約回線内訳番号
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_KAIS_UCWK_NO, (String)paramMap.get("svc_kei_kaisen_ucwk_no"));

		// S-IF 呼出
		HashMap<String, Object> reqMap = mapper.setEKK0251A010( keepReqParam.get(), keepFixedText.get(), condMap );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0251Map = mapper.getEKK0251A010( keepReqParam.get(), keepFixedText.get(), resMap );
		mapper.scResultCheck( keepReqParam.get() );

		// VLAN-IDが設定されているか判定
		if (kk0251Map != null) {
			if (VLAN_ID_FIX_FLG_ZUMI.equals(kk0251Map.get(EKK0251A010CBSMsg1List.VLAN_ID_FIX_FLG))) {
				return true;	// VLAN-ID設定済み
			}
		}
		
		return false;
	}

	/**
	 * 新設工事の工事案件ステータスがVLAN-ID払出済となる値か確認する
	 * 
	 * @param		paramMap	パラメータ
	 * @return		true：未払出のステータス	false：払出済となるステータス
	 */
	private boolean checkKojiAnkenStatus(HashMap<String, Object> paramMap) throws Exception {

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// EKU0011A010 工事案件一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 工事案件番号
		condMap.put(JKKAdchgMapperCC.COND_KEY_KOJIAK_NO, (String)paramMap.get("kojiak_no"));

		// S-IF 呼出
		HashMap<String, Object> reqMap = mapper.setEKU0011A010( keepReqParam.get(), keepFixedText.get(), condMap );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> ku0011Map = mapper.getEKU0011A010( keepReqParam.get(), keepFixedText.get(), resMap );
		mapper.scResultCheck( keepReqParam.get() );
		// ANK-3652-00-00 ADD START
		// 提供方式パターンコード（ネット）先
		String tkHoshikiPtnCdNetSaki = (String)paramMap.get("tk_hoshiki_ptn_cd_net_saki");
		// 光コンセントの場合
		if ("51".equals(tkHoshikiPtnCdNetSaki))
		{
			// 工事案件ステータスを判定
			if (ku0011Map != null) 
			{
				// マンション工事案件状態コード
				String status = (String)ku0011Map.get(EKU0011A010CBSMsg1List.MANS_KOJIAK_STAT_CD);
				if (KOJIAK_STAT_KOJIKAISHAKETTEIZUMI.compareTo(status) <= 0 &&
					KOJIAK_STAT_KOJIKANRYOZUMI.compareTo(status) >= 0)
				{	// 160：工事会社決定済 〜 200：工事完了済
					return false;	
				}
			}
		}
		// 光コンセント以外の場合
		else
		{
			// 工事案件ステータスを判定
			if (ku0011Map != null) {
				String status = (String)ku0011Map.get(EKU0011A010CBSMsg1List.KOJIAK_STAT);
				if (KOJIAK_STAT_KOJIKAISHAKETTEIZUMI.compareTo(status) <= 0 &&
					KOJIAK_STAT_KOJIKANRYOZUMI.compareTo(status) >= 0)
				{	// 160：工事会社決定済 〜 200：工事完了済
					return false;	
				}
			}
		}
		// ANK-3652-00-00 ADD END
		// ANK-3652-00-00 DEL START
//		// 工事案件ステータスを判定
//		if (ku0011Map != null) {
//			String status = (String)ku0011Map.get(EKU0011A010CBSMsg1List.KOJIAK_STAT);
//			if (KOJIAK_STAT_KOJIKAISHAKETTEIZUMI.compareTo(status) <= 0 &&
//				KOJIAK_STAT_KOJIKANRYOZUMI.compareTo(status) >= 0)
//			{	// 160：工事会社決定済 〜 200：工事完了済
//				return false;	
//			}
//		}
		// ANK-3652-00-00 DEL END

		return true;
	}

	/**
	 * VLAN-ID払出
	 * 
	 * @param		paramMap	パラメータ
	 * @return		true：払出済となるステータス	false：未払出のステータス
	 */
	private void getVLanId(HashMap<String, Object> paramMap) throws Exception {

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// ESC0021D010 電話用VLANオーダ受付
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機能コード
		condMap.put(ESC0021D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// サービス契約番号
		condMap.put(ESC0021D010CBSMsg.SVC_KEI_NO, (String)paramMap.get("svc_kei_no"));
		// 要求元アプリ種別コード
		condMap.put(ESC0021D010CBSMsg.YOKYU_MT_APL_SBT_CD, YOKYU_MT_APL_SBT_CD_WEB);
		// ＶＬＡＮオーダコード
		condMap.put(ESC0021D010CBSMsg.VLAN_ORDER_CD, VLAN_ORDER_CD_VLAN);
		// 要求種別コード
		condMap.put(ESC0021D010CBSMsg.YOKYU_SBT_CD, YOKYU_SBT_CD_NEW);
		// ＶＬＡＮサーバコード
		condMap.put(ESC0021D010CBSMsg.VLAN_SERVER_CD, VLAN_SERVER_CD_SETSUBIKANRI);
		// 依頼時申込書番号
		condMap.put(ESC0021D010CBSMsg.REQ_JI_MSKMSHO_NO, (String)paramMap.get("mskm_mmsho_no"));
		// 依頼時工事案件番号
		condMap.put(ESC0021D010CBSMsg.REQ_JI_KJAK_NO, (String)paramMap.get("kojiak_no"));

		// S-IF 呼出
		HashMap<String, Object> reqMap = mapper.setESC0021D010( keepReqParam.get(), keepFixedText.get(), condMap );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		mapper.getESC0021D010( keepReqParam.get(), keepFixedText.get(), resMap );
		mapper.scResultCheck( keepReqParam.get() );
	}
}