/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：住所変更 物流コンポーネント部品クラス
 *  ソースファイル名：JKKAdchgAddCmnCC.java
 *  作成者          ：FJ
 *  日付            ：2011年11月10日
 *＜機能概要＞
 *  住所変更に伴うeo光ネットの
 *    サービス契約情報，
 *    オプションサービス契約情報
 *    サブオプションサービス契約情報
 *    機器提供サービス契約情報，
 *    課金先情報
 *  の登録処理を行う部品クラス。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2011/11/11  FJ          新規作成
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.custom.constant.KKSV0098_KKSV0098OP;
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.sun.enterprise.tools.common.util.StringUtils;

import eo.ejb.cbs.cbsmsg.EKK0011B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B013CBSMsg1List;

/**
 * eo光ネット住所変更コンポーネント部品クラス.
 * <br>
 * @author FJ
 */
public class JKKAdchgButuryuCtrlCC extends AbstractCommonComponent {

	/** 住所変更登録コモンコンポーネント共通ロジッククラスインスタンス */
	private static ThreadLocal<JKKAdchgCmnLogicCC> cmnLogic = new ThreadLocal<JKKAdchgCmnLogicCC>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgButuryuCtrlCC() {
	}

	/**
	 * 住所変更 物流 返品処理.
	 * <br>
	 * 利用中機器一覧の撤去種類が「撤去」の場合に返品処理を起動する。
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite createHempin( SessionHandle handle, IRequestParameterReadWrite param, String fixedText ) throws Throwable {

		try {

			/** 事前準備 */
			HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

			// 住所変更登録コモンコンポーネントマッピングクラスインスタンス 生成
			cmnLogic.set( new JKKAdchgCmnLogicCC( handle ) );

			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set( handle );

// ●●IT2 2012-03-14 住変機器障害対応 START
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			// 住所情報変更初期表示情報取得コモンコンポーネント
			// マッピングクラスインスタンスを取得
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
			HashMap<String, Object> reqMap;
			Map<?, ?> resMap;
// ●●IT2 2012-03-14 住変機器障害対応 END

			// 返品対象データリスト
			ArrayList<HashMap> kksv_work_map_list = (ArrayList<HashMap>)( paramMap.get( "trgt_data_list" ) );

			// ワーク
			HashMap<String, Object> kksv_work_map = null;

			// リスト
			ArrayList<HashMap<String, Object>> hempin_info_list = new ArrayList<HashMap<String, Object>>();
// ●●IT2 2012-03-14 住変機器障害対応 START
			ArrayList<HashMap<String, Object>> haiso_info_list = new ArrayList<HashMap<String, Object>>();
// ●●IT2 2012-03-14 住変機器障害対応 END

			for ( int i = 0; i < kksv_work_map_list.size(); i ++ ) {
				kksv_work_map = kksv_work_map_list.get(i);
				
				if (!StringUtils.isEmpty((String) kksv_work_map.get( KKSV0098_KKSV0098OP.HEMPIN_KKTK_SVC_KEI_NO ))) {
					
					// EKK0341A010 機器提供サービス契約一意照会
					HashMap<String, Object> kiki_map = getKktkSvcKei(param, fixedText, (String)kksv_work_map.get( KKSV0098_KKSV0098OP.HEMPIN_KKTK_SVC_KEI_NO ), (String)kksv_work_map.get( KKSV0098_KKSV0098OP.HEMPIN_GENE_ADD_DTM ));
					
// IT1-2013-0000027対応 20130116 星野 ADD START
					// 住所変更異動区分 初期値null
					String adchgIdoDiv = null;
					
					// 当日住所変更の場合のみ
					if( JCCBPCommon.getOpeDate(null).equals( paramMap.get("dsl_kibo_ymd") ) ){
						// ONU かつ ネットが解約/新規の場合
						if("D0".equals(kiki_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)) &&  "4".equals(paramMap.get("jdg_chg_div_net"))){
							// 住所変更異動区分「解約」にしないと、物流ＣＣ内で読込親サービス契約番号を特定できない
							adchgIdoDiv = "01";
						}else if("E0".equals(kiki_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)) &&  "4".equals(paramMap.get("jdg_chg_div_tv"))){
							// 住所変更異動区分「解約」にしないと、物流ＣＣ内で読込親サービス契約番号を特定できない
							adchgIdoDiv = "01";
						}
						// ANK-4315-00-00 ADD START						
						// HGW かつ ネットが解約/新規の場合
						if("S0".equals(kiki_map.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)) &&  "4".equals(paramMap.get("jdg_chg_div_net"))){
							// 住所変更異動区分「解約」にしないと、物流ＣＣ内で読込親サービス契約番号を特定できない
							adchgIdoDiv = "01";
						}
						// ANK-4315-00-00 ADD END	
					}
// IT1-2013-0000027対応 20130116 星野 ADD END
					
					// ●返品機器受付
					HashMap<String, Object> henpinOutMap = new HashMap<String, Object>();
					JKKBpCommon.createHmpin(param, 
											handle, 
											(String)kksv_work_map.get( KKSV0098_KKSV0098OP.HEMPIN_KKTK_SVC_KEI_NO ), 
											(String)kksv_work_map.get( KKSV0098_KKSV0098OP.IDO_DIV ), 
// IT1-2013-0000027対応 20130116 星野 ADD START
//											// 20121016 住所変更リファクタリング対応 ADD START
//											// 他異動に伴う物流ではないため、nullを設定する
//											null,
//											// 20121016 住所変更リファクタリング対応 ADD END
											adchgIdoDiv,
// IT1-2013-0000027対応 20130116 星野 ADD END
											// ●● IT2-2012-0000371 STRAT
											(String)kiki_map.get( EKK0341A010CBSMsg1List.GENE_ADD_DTM ), 
											// ●● IT2-2012-0000371 END
											henpinOutMap, 
											fixedText,
											(String)kiki_map.get( EKK0341A010CBSMsg1List.KIKI_CHG_NO)
// ST1-2013-0000272対応 20130204 星野 ADD START
											, (String)kksv_work_map.get("hmpin_div")
// ST1-2013-0000272対応 20130204 星野 ADD END
					);
					
					// 返品機器受付結果を設定
					hempin_info_list.add(henpinOutMap);
				}
				
// ●●IT2 2012-03-14 住変機器障害対応 START
				if (!StringUtils.isEmpty((String) kksv_work_map.get( KKSV0098_KKSV0098OP.HAISO_KKTK_SVC_KEI_NO ))) {

					// ・EKK0341A010 機器提供サービス契約一意照会
					HashMap<String, String> condMap = new HashMap<String, String>();
					condMap.put( JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO,(String) kksv_work_map.get( KKSV0098_KKSV0098OP.HAISO_KKTK_SVC_KEI_NO ) );
					condMap.put( JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null) );
					reqMap = mapper.setEKK0341A010( param, fixedText, condMap );
					resMap = scCall.run( reqMap, keepSesHandle.get() );
					HashMap<String, Object> kk0341_a010 = mapper.getEKK0341A010( param, fixedText, resMap );
					mapper.scResultCheck( param );

					if (StringUtils.isEmpty((String) kk0341_a010.get(EKK0341A010CBSMsg1List.MSKM_DTL_NO))) {
						// 暫定
						ArrayList<HashMap> list = (ArrayList<HashMap>) kksv_work_map.get(KKSV0098_KKSV0098OP.MSKM_DTL_LIST);
						if ("D0".equals(kk0341_a010.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))) {
							// ONU
							if (!StringUtils.isEmpty((String) list.get(0).get(KKSV0098_KKSV0098OP.MSKM_DTL_NO))) {
								kk0341_a010.put(EKK0341A010CBSMsg1List.MSKM_DTL_NO, list.get(0).get(KKSV0098_KKSV0098OP.MSKM_DTL_NO));
							} else {
								kk0341_a010.put(EKK0341A010CBSMsg1List.MSKM_DTL_NO, list.get(1).get(KKSV0098_KKSV0098OP.MSKM_DTL_NO));
							}
						} else if ("E0".equals(kk0341_a010.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD)) ||
								    "60".equals(kk0341_a010.get(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))) {
							// V-ONU, モデム
							kk0341_a010.put(EKK0341A010CBSMsg1List.MSKM_DTL_NO, list.get(2).get(KKSV0098_KKSV0098OP.MSKM_DTL_NO));
						}
					}

					// ・EKK0021A010 申込明細一意照会
					condMap.clear();
					condMap.put( JKKAdchgMapperCC.COND_KEY_MSKM_DTL_NO, (String) kk0341_a010.get(EKK0341A010CBSMsg1List.MSKM_DTL_NO) );
					reqMap = mapper.setEKK0021A010( param, fixedText, condMap );
					resMap = scCall.run( reqMap, keepSesHandle.get() );
					HashMap<String, Object> kk0021_a010 = mapper.getEKK0021A010( param, fixedText, resMap );
					mapper.scResultCheck( param );
					
					// ●配送機器受付
					HashMap<String, Object> haisoOutMap = new HashMap<String, Object>();
					JKKBpCommon.createHaiso(param, 
											handle,
											(String) kk0021_a010.get(EKK0021A010CBSMsg1List.MSKM_NO),
											(String) kk0341_a010.get(EKK0341A010CBSMsg1List.MSKM_DTL_NO),
											(String) kk0021_a010.get(EKK0021A010CBSMsg1List.MSKMSHO_NO),
											(String)kksv_work_map.get( KKSV0098_KKSV0098OP.HAISO_KKTK_SVC_KEI_NO ), 
											(String)kksv_work_map.get( KKSV0098_KKSV0098OP.IDO_DIV ), 
											haisoOutMap, 
											fixedText);

					// 返品機器受付結果を設定
					haiso_info_list.add(haisoOutMap);
				}
// ●●IT2 2012-03-14 住変機器障害対応 END

			}

			// 返品機器受付結果リストを返却
			paramMap.put( KKSV0098_KKSV0098OP.HEMPIN_INFO_LIST, hempin_info_list);
// ●●IT2 2012-03-14 住変機器障害対応 START
			// 配送機器受付結果リストを返却
			paramMap.put( KKSV0098_KKSV0098OP.HAISO_INFO_LIST, haiso_info_list);
// ●●IT2 2012-03-14 住変機器障害対応 END
		} finally {

			// スレッドローカル変数のリソース解放
			// ・住所変更登録コモンコンポーネント共通ロジッククラスインスタンス
			if( cmnLogic.get() != null ){
				(cmnLogic.get()).destroy();
				cmnLogic.remove();
			}

			// ・セッションハンドル保持域
			if( keepSesHandle.get() != null ){
				keepSesHandle.remove();
			}
		}

		return param;
	}
	
	/**
	 * 機器提供サービス契約一意照会.
	 * @param param
	 * @param fixedText
	 * @param kktk_svc_kei_no
	 * @param gene_add_dtm
	 * @return
	 * @throws Exception
	 */
	public HashMap<String, Object> getKktkSvcKei( IRequestParameterReadWrite param, String fixedText, String kktk_svc_kei_no, String gene_add_dtm ) throws Exception {

		/** 前準備 **/
		HashMap<String, Object> paramMap = (HashMap<String, Object>)( param.getData(fixedText) );
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンス
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		// SCリクエストInvoker
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ■ EKK0341A010_機器提供サービス契約一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put( JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktk_svc_kei_no );
		if (!StringUtils.isEmpty(gene_add_dtm))
		{
			condMap.put( JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, gene_add_dtm );
		}
		condMap.put( JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKBpCommon.getOpeDate(null));

		reqMap = mapper.setEKK0341A010( param, fixedText, condMap );
		resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0341_a010_map = mapper.getEKK0341A010( param, fixedText, resMap );
		mapper.scResultCheck( param );

		return kk0341_a010_map;
	}
}

