/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：住所情報変更コンポーネント部品クラス
 *  ソースファイル名：JKKAdInfChgCC.java
 *  作成者          ：FJ
 *  日付            ：2011年11月10日
 *＜機能概要＞
 *  住所変更に伴うeo光テレビの
 *    サービス契約情報，
 *    オプションサービス契約情報，
 *    サブオプションサービス契約情報，
 *    機器提供サービス契約情報，
 *    課金先情報
 *  の登録処理を行う部品クラス。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2011/11/10  FJ          新規作成
 *	v10.0.00	2014/07/29	FJ)山口		US管理対応
 *  v72.00.01	2025/01/29  FJ)舘山    【#83584】HGW瑕疵内対応（grep対応洩れ）
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdInfChgConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
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.sun.enterprise.tools.common.util.StringUtils;

import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B030CBSMsg1List;

/**
 * 住所情報変更コンポーネント部品クラス.
 * <br>
 * @author FJ
 */
public class JKKAdInfVariousChgCC extends AbstractCommonComponent {

	/** 工事案件ＣＣ呼出用パラメータキー */
	private final String FIXED_TEXT_EXECUTE_KOJI_ANKEN = "JKK_AD_INF_VARIOUS_CHG_CC";


// OM-2013-0002540対応 20130924 星野 DEL START
//	/** サービス契約番号別の「申込番号」保持用キー */
//	private final String KEY_MSKM_NO = "mskm_no";
//
//	/** サービス契約番号別の「申込明細番号」保持用キー */
//	private final String KEY_MSKM_DTL_NO = "mskm_dtl_no";
//
//	/** サービス契約番号別の「申込番号」「申込明細」情報 */
//	private Map<String, Map<String, String>> mskmInfo = null;
// OM-2013-0002540対応 20130924 星野 DEL END


	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};
	
	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdInfVariousChgCC() {
	}

	/**
	 * 住所情報-諸変更情報-変更反映処理.
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite adInfVariousChg( SessionHandle handle, IRequestParameterReadWrite request, String fixedText ) throws Throwable {

		try {
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set( handle );
			
			// 事前準備
			HashMap<String, Object> paramMap = (HashMap<String, Object>)request.getData(fixedText);
			if (paramMap == null) {
				return request;
			}
			
// OM-2013-0002540対応 20130924 星野 DEL START
//			// 申込明細番号キャッシュ用の領域を初期化
//			mskmInfo = null;
// OM-2013-0002540対応 20130924 星野 DEL END
			
			// param.実行結果を初期化
			paramMap.put(JKKAdInfChgConstCC.PARAM_KEY_EXEC_RES, Boolean.toString(false));
			
			// 契約者住所変更に伴う諸変更
			variousChange(handle, request, fixedText, paramMap, "keiyakushaKojiInfoList");
			
			// 利用場所住所変更に伴う諸変更
			variousChange(handle, request, fixedText, paramMap, "riyobashoKojiInfoList");
			
			// 請求書送付先住所変更に伴う諸変更
			variousChange(handle, request, fixedText, paramMap, "seikyushoKojiInfoList");
			
			// param.実行結果を正常終了に更新
			paramMap.put(JKKAdInfChgConstCC.PARAM_KEY_EXEC_RES, Boolean.toString(true));

		} finally {
			// スレッドローカル変数のリソース解放
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();
			}
		}

		return request;
	}
	
	/**
	 * 住所変更に伴う諸変更処理
	 */
	@SuppressWarnings("unchecked")
	private void variousChange(SessionHandle handle, IRequestParameterReadWrite request, String fixedText, HashMap<String, Object> paramMap, String paramKey) throws Throwable {
		
		if (paramMap == null) {
			return;
		}
		
		List<Map<String, Object>> paramList = (List<Map<String, Object>>)paramMap.get(paramKey);
		if (paramList == null) {
			return;
		}
// OM-2014-0004032 2015/01/10 ADD START
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
// OM-2014-0004032 2015/01/10 ADD END
		
		for (Map<String, Object> map : paramList) {
			
			HashMap<String, Object> kojiAkParam = (HashMap<String, Object>)map.get("kojiAk");
			HashMap<String, Object> progressParam = (HashMap<String, Object>)map.get("prg");
			
			String svcKeiNo = (String)kojiAkParam.get("svc_kei_no");
			
// OM-2013-0002515対応 20130924 星野 ADD START
			// モバイルの場合処理対象外
			if(isMobile(request, fixedText, svcKeiNo)){
				continue;
			}
// OM-2013-0002515対応 20130924 星野 ADD END
// OM-2013-0003639 2013.10.29 Y.Kanata ADD START
			if (!doesKojiAkOfSvcKeiNoExist(request, "EKU0011B030", svcKeiNo)) {
				continue;
			}
// OM-2013-0003639 2013.10.29 Y.Kanata ADD END
			
			// 申込明細番号をセットする
			kojiAkParam.put("mskm_no", getMskmNo(request, fixedText, svcKeiNo));
			kojiAkParam.put("mskm_dtl_no", getMskmDtlNo(request, fixedText, svcKeiNo));
			progressParam.put("mskm_dtl_no", getMskmDtlNo(request, fixedText, svcKeiNo));
			
			// 工事案件ＣＣ呼出
			JKKKojiAnkenCC kojiAnkenCC = new JKKKojiAnkenCC();
			request.setData(FIXED_TEXT_EXECUTE_KOJI_ANKEN, kojiAkParam);
			kojiAnkenCC.executeKojiAnken(handle, request, FIXED_TEXT_EXECUTE_KOJI_ANKEN);
			request.removeData(FIXED_TEXT_EXECUTE_KOJI_ANKEN);
			
			JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
// OM-2014-0004032 2015/01/10 ADD START
			// サービス契約一意照会
			condMap.clear();
			condMap.put( "key_svc_kei_no", svcKeiNo );
			condMap.put( "key_rsv_aply_ymd", getMapString( paramMap, JKKAdInfChgConstCC.PARAM_KEY_OPE_DATE ) );
			reqMap = mapper.setEKK0081A010( request, fixedText, condMap );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010( request, fixedText, resMap );
			mapper.scResultCheck( request );
			
			// サービス契約ステータスの取得
			String svcKeiStat = getMapString( kk0081_a010_map, EKK0081A010CBSMsg1List.SVC_KEI_STAT );
			
			// 異動区分の取得を行う
			String idoDiv = getMapString( kk0081_a010_map, EKK0081A010CBSMsg1List.IDO_DIV );
			
			String idoDtm = new String();
			
			if (JKKSvcConst.SVC_KEI_STAT_010.equals(svcKeiStat)) {
				// 進捗の一覧照会
				condMap.clear();
				condMap.put( "key_svc_kei_no", svcKeiNo );
				reqMap = mapper.setEKK1091B001( request, fixedText, condMap );
				resMap = scCall.run( reqMap, keepSesHandle.get() );
				HashMap<String, Object> kk1091_a010_map = mapper.getEKK1091B001( request, fixedText, resMap );
				mapper.scResultCheck( request );
				
				idoDtm = getMapString( kk1091_a010_map, EKK1091B001CBSMsg1List.IDO_DTM );
			}
			else
			{
				// 進捗の一覧照会はしない
			}
			// ADD END
			
			// 対象サービス契約は受付済の場合、異動区分および異動時間を差し替える
			if (JKKSvcConst.SVC_KEI_STAT_010.equals(svcKeiStat) ) 
			{
				progressParam.put( EKK1091D010CBSMsg.IDO_DIV, idoDiv );
				progressParam.put( EKK1091D010CBSMsg.IDO_DTM, idoDtm);
			}
			else
			{
				// 何もしない、画面からのパラメータに依存
			}
// OM-2014-0004032 2015/01/10 ADD END

			// 進捗登録
			ArrayList<HashMap<String, Object>> idoRsnLit = (ArrayList<HashMap<String, Object>>)progressParam.get("ido_rsn_List");
// OM-2014-0004032 2015/01/10 MOD START
//			HashMap<String, Object> reqMap = mapper.setEKK1091D010( request, fixedText, progressParam, idoRsnLit );
//			Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
			reqMap = mapper.setEKK1091D010( request, fixedText, progressParam, idoRsnLit );
			resMap = scCall.run( reqMap, keepSesHandle.get() );
// OM-2014-0004032 2015/01/10 MOD END
			mapper.getEKK1091D010( request, fixedText, resMap );
			mapper.scResultCheck( request );
		}
		
		return;
	}
	
	/**
	 * 申込番号取得処理
	 */
	private String getMskmNo(IRequestParameterReadWrite request, String fixedText, String svcKeiNo) throws Throwable {
// OM-2013-0002540対応 20130924 星野 MOD START
//		if (mskmInfo == null) {
//			mskmInfo = new HashMap<String, Map<String, String>>();
//		}
//		
//		if (mskmInfo.get(svcKeiNo) == null) {
//			mskmInfo.put(svcKeiNo, getMskmInfo(request, fixedText, svcKeiNo));
//		}
//		
//		return mskmInfo.get(svcKeiNo).get(KEY_MSKM_NO);
		
		// 住所情報変更ＣＣの出力パラメータから取得
		return getAdInfChgMapValue(request, JKKAdInfChgConstCC.PARAM_KEY_MSKM_NO);
// OM-2013-0002540対応 20130924 星野 MOD END
	}

	/**
	 * 申込明細番号取得処理
	 */
	private String getMskmDtlNo(IRequestParameterReadWrite request, String fixedText, String svcKeiNo) throws Throwable {
// OM-2013-0002540対応 20130924 星野 MOD START
//		if (mskmInfo == null) {
//			mskmInfo = new HashMap<String, Map<String, String>>();
//		}
//		
//		if (mskmInfo.get(svcKeiNo) == null) {
//			mskmInfo.put(svcKeiNo, getMskmInfo(request, fixedText, svcKeiNo));
//		}
//		
//		return mskmInfo.get(svcKeiNo).get(KEY_MSKM_DTL_NO);
		
		// 住所情報変更ＣＣの出力パラメータから取得
		return getAdInfChgMapValue(request, JKKAdInfChgConstCC.PARAM_KEY_MSKM_DTL_NO);
// OM-2013-0002540対応 20130924 星野 MOD END
	}
	
// OM-2013-0002540対応 20130924 星野 ADD START
	/**
	 * 住所情報変更ＣＣのパラメータを取得する
	 */
	private String getAdInfChgMapValue(IRequestParameterReadWrite request,
			String adInfChgMapKey) throws RequestParameterException {
		HashMap<String, Object> adInfChgMap = (HashMap<String, Object>)request.getData("KKSV015601CC");
		if(adInfChgMap!=null){
			String mskmNo = (String) adInfChgMap.get(adInfChgMapKey);
			if(!StringUtils.isEmpty(mskmNo)){
				return mskmNo;
			}
		}
		
		return "";
	}
// OM-2013-0002540対応 20130924 星野 ADD END

// OM-2013-0002540対応 20130924 星野 DEL START
//	/**
//	 * 申込明細番号取得処理（サービス契約より取得しキャッシュ領域に格納する）
//	 */
//	@SuppressWarnings("unchecked")
//	private Map<String, String> getMskmInfo(IRequestParameterReadWrite request, String fixedText, String svcKeiNo) throws Throwable {
//		
//		Map<String, String> resultMap = new HashMap<String, String>();
//
//		HashMap<String, Object> paramMap = (HashMap<String, Object>)request.getData(fixedText);
//		JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//
//		// サービス契約一意照会より申込明細番号を取得
//		HashMap<String, String> conditionMap = new HashMap<String, String>();
//		conditionMap.put("key_svc_kei_no", svcKeiNo);
//		conditionMap.put("key_rsv_aply_ymd", (String)paramMap.get(JKKAdInfChgConstCC.PARAM_KEY_OPE_DATE ));
//		HashMap<String, Object> reqMap = mapper.setEKK0081A010(request, fixedText, conditionMap );
//		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
//		HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(request, fixedText, resMap);
//		mapper.scResultCheck(request);
//		
//		// 申込明細一意照会より申込明細番号を取得
//		conditionMap.clear();
//		conditionMap.put("mskm_dtl_no", (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO));
//		reqMap = mapper.setEKK0021A010(request, fixedText, conditionMap );
//		resMap = scCall.run( reqMap, keepSesHandle.get() );
//		HashMap<String, Object> kk0021_a010_map = mapper.getEKK0021A010(request, fixedText, resMap);
//		mapper.scResultCheck(request);
//
//		// 申込番号、申込明細番号を取得
//		resultMap.put(KEY_MSKM_NO, (String)kk0021_a010_map.get(EKK0021A010CBSMsg1List.MSKM_NO));
//		resultMap.put(KEY_MSKM_DTL_NO, (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO));
//		
//		return resultMap;
//	}
// OM-2013-0002540対応 20130924 星野 DEL END
	
// OM-2013-0002515対応 20130924 星野 ADD START
	private boolean isMobile(IRequestParameterReadWrite request, String fixedText, String svcKeiNo) throws Throwable{
		// 料金グループコード取得
		String prcGrpCd = getPrcGrpCd(request, fixedText, svcKeiNo);
		
		if (JKKAdInfChgConstCC.PRC_GRP_CD_07.equals( prcGrpCd ) 
			|| JKKAdInfChgConstCC.PRC_GRP_CD_08.equals( prcGrpCd ) 
			|| JKKAdInfChgConstCC.PRC_GRP_CD_09.equals( prcGrpCd ) 
			|| JKKAdInfChgConstCC.PRC_GRP_CD_16.equals(prcGrpCd)
		){
			return true;
		}else{
			return false;
		}

	}
	/**
	 * 料金グループコード取得処理
	 */
	private String getPrcGrpCd(IRequestParameterReadWrite request, String fixedText, String svcKeiNo) throws Throwable {
		
		HashMap<String, Object> paramMap = (HashMap<String, Object>)request.getData(fixedText);
		JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約一意照会より料金グループコードを取得
		HashMap<String, String> conditionMap = new HashMap<String, String>();
		conditionMap.put("key_svc_kei_no", svcKeiNo);
		conditionMap.put("key_rsv_aply_ymd", (String)paramMap.get(JKKAdInfChgConstCC.PARAM_KEY_OPE_DATE ));
		HashMap<String, Object> reqMap = mapper.setEKK0081A010(request, fixedText, conditionMap );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(request, fixedText, resMap);
		mapper.scResultCheck(request);
		
		if( kk0081_a010_map!=null){
			String prcGrpCd = (String)kk0081_a010_map.get(EKK0081B003CBSMsg1List.PRC_GRP_CD);
			if(!StringUtils.isEmpty(prcGrpCd)){
				return prcGrpCd;
			}
		}
		
		return "";
	}
// OM-2013-0002515対応 20130924 星野 ADD END
// OM-2013-0003639 2013.10.29 Y.Kanata ADD START
	private boolean doesKojiAkOfSvcKeiNoExist(IRequestParameterReadWrite request, String fixedText, String svcKeiNo)
	throws Throwable{
		JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 工事案件の一覧照会を行う。
		HashMap<String, String> conditionMap = new HashMap<String, String>();
		// サービス契約番号
		conditionMap.put("key_svc_kei_no", svcKeiNo);
		
//		ANK-1918-00-00	2014/7/23	MOD START
//		原文
//		 工事案件ステータス
//		 130：受付済, 140：依頼済, 150：宅内調査完了済, 160：工事会社決定済, 170：宅内機器予定登録済, 180：仮鍵開発行依頼済, 190：現場作業完了済, 200：工事完了
//		conditionMap.put("key_kojiak_stat", "130,140,150,160,170,180,190,200");
//		以下一部修正
		// 工事案件ステータス
		// 120 : 登録済, 130：受付済, 140：依頼済, 150：宅内調査完了済, 160：工事会社決定済, 170：宅内機器予定登録済, 180：仮鍵開発行依頼済, 190：現場作業完了済, 200：工事完了
		conditionMap.put("key_kojiak_stat", "120,130,140,150,160,170,180,190,200");
//		ANK-1918-00-00	2014/7/23	MOD END
		
		// 工事案件種別コード
		// 001：新設, 003：住所変更(新設), 008：リンクSTB, 009：プラン変更(収容替), 012：面開発、015:ONU交換工事
// ▽▽▽ #83584 Modify Start
//		conditionMap.put("key_kojiak_sbt_cd", "001,003,008,009,012");
		conditionMap.put("key_kojiak_sbt_cd", "001,003,008,009,012,015");
// △△△ #83584 Modify End
		HashMap<String, Object> reqMap = mapper.setEKU0011B030(request, fixedText, conditionMap );
		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		ArrayList<HashMap<String, Object>> ku0011_b030_list = mapper.getEKU0011B030(request, fixedText, resMap);
		mapper.scResultCheck(request);
		
		// ステータスが未完了ならエラー 200でない場合
		if (ku0011_b030_list == null || ku0011_b030_list.size()==0) {
			return false;
		}
		return true;
	}
// OM-2013-0003639 2013.10.29 Y.Kanata ADD END
// OM-2014-0004032 2015/01/10 ADD END
	private String getMapString( HashMap targetMap, String targetKey ) {
		String resultStr = new String();

		if ( targetMap != null ) {
			if ( ( targetKey != null ) && ( !"".equals( targetKey ) ) ) {
				if ( targetMap.containsKey( targetKey ) ) {
					resultStr = (String) targetMap.get(targetKey);
				}
			}
		}
		return resultStr;
	}
// OM-2014-0004032 2015/01/10 ADD END
}
