/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAdchgKktkSvcKeiAddCC
*   ソースファイル名：JKKAdchgKktkSvcKeiAddCC.java
*   作成者          ：富士通
*   日付            ：2015年12月25日
*＜機能概要＞
*   住所変更機器提供サービス契約登録コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v20.00.00   2015/12/25   星野        【ANK-2651-00-00】 住変時の転居先がマンションの場合のVDSLモデム追加対応
**********************************************************************/
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.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.common.JCMConstants;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020002CBSMsg2List;

/**
 * 住所変更機器提供サービス契約登録コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */
public class JKKAdchgKktkSvcKeiAddCC extends AbstractCommonComponent
{
	/** 申込登録用CCワーク */
	private static final String CC_WORK_AREA_NAME_MSKM = "JKKAddMskmServiceCCWork";
	/** 申込明細登録用CCワーク */
	private static final String CC_WORK_AREA_NAME_MSKM_LIST = "JKKAddMskmServiceCCWorkList";
	/** 申込明細番号（電話） */
	private static final String MSKM_DTL_NO_TEL = "mskm_dtl_no_tel";
	/** 機器提供サービス契約登録用プレフィックス */
	private static final String PREFIX_KIKI = "kk0341_";
	/** 機器提供サービス契約登録リスト名 */
	private static final String KKTK_ADD_LIST = "kktk_add_list";
	
	/** 利用サービス変更区分: 追加 ※サービス追加判定用 */
	private static final String USE_SVC_CHG_DIV_ADD = "3";
	/** 照査解約完了コード：OK */
	private final String SHOSA_DSL_FIN_CD_OK = "1";
	/** 自動登録機器倉庫コード */
	private static final String SOKO_CD_AUTO_REGIST = "000001";
	
	
	/** セッションハンドル保持域 */
	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>();

	/** 住所変更登録コモンコンポーネントマッピングクラスインスタンス */
	private JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

	/** SCリクエストInvoker */
	private ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();



	
	/**
	 * 住所変更機器提供サービス契約登録処理を行います。
	 * 2015/12/26現在では、VDSLモデム追加専用
	 * <br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		try {
			/** リソース保持 */
			keepSesHandle.set( handle );	// セッションハンドル
			keepReqParam.set( param );		// リクエストパラメータ
			keepFixedText.set( fixedText );	// FixedText
			
			/* ユーザデータ情報 */
			HashMap inMap = (HashMap)(param.getData(fixedText));
			if (inMap == null)
			{
				return param;
			}
			
			String svcChgDiv = (String)inMap.get("svc_chg_div");
			String mskmsho_no = (String)inMap.get("mskmsho_no");

	
			ArrayList dataList1 = null;
			int devCnt1 = 0;
			if(null != inMap.get(KKTK_ADD_LIST))
			{
				dataList1 = (ArrayList)inMap.get(KKTK_ADD_LIST);
				devCnt1 = ((ArrayList)inMap.get(KKTK_ADD_LIST)).size();
				for (int i = 0; i < devCnt1; i++)
				{
					// 機器提供サービス契約登録
					editInAddKktkSvcKei(param, fixedText, i, KKTK_ADD_LIST, PREFIX_KIKI);
					JKKBpCommon.addKktkSvcKei(handle, param, (HashMap)dataList1.get(i), PREFIX_KIKI);
					editOutAddKktkSvcKei(param, fixedText, i, KKTK_ADD_LIST, PREFIX_KIKI);
					
					String kktkSvcKeiNo = (String)( (HashMap)dataList1.get(i) ).get(PREFIX_KIKI + "kktk_svc_kei_no");
					
					// サービス追加以外の場合、機器照査と配送が必要
					// サービス追加の場合は照査ＣＣで実施するため、ここでは実施しない
					if (!USE_SVC_CHG_DIV_ADD.equals(svcChgDiv)) {
						
						// 機器提供サービス契約一意照会
						Map<String, Object> mapEKK0341A010 = getEKK0341A010(kktkSvcKeiNo);
						String kktkSvcKeiLastUpdDtm = (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.LAST_UPD_DTM);
						// 機器提供サービス契約照査
						verifyEKK0341C030(mapEKK0341A010, kktkSvcKeiLastUpdDtm);
						
						// 配送を作成
						// 現状ではVDSLモデムのみを処理対象としているため、工事会社配送は考慮せず無条件で登録する
						ArrayList<HashMap<String, Object>> kktkSvcKeiInfList = new ArrayList<HashMap<String, Object>>();
						HashMap<String, Object> kktkSvcKeiInf = new HashMap<String, Object>();
						kktkSvcKeiInf.put("kktk_svc_kei_no", kktkSvcKeiNo);
						kktkSvcKeiInf.put("soko_cd", SOKO_CD_AUTO_REGIST);
						kktkSvcKeiInfList.add(kktkSvcKeiInf);
						// 物流部品呼出
						JKKBpCommon.createHaiso(keepReqParam.get()
											,	keepSesHandle.get()
											,	(String)getMskmWorkMapValue(param, "mskm_no")
											,	(String)getMskmDtlWorkMapValue(param, "mskm_dtl_no_tel")
											,	mskmsho_no
											,	kktkSvcKeiInfList
											,	JKKSvcConst.IDO_DIV_ADCHGADD
											,	JKKSvcConst.ADCHG_IDO_DIV_SVC_ADD
											,	new HashMap<String, Object>()
											,	keepFixedText.get()
											, 	SOKO_CD_AUTO_REGIST
											,	"20991231"
											);

	
					}
				}
			}
			
			return param;
		
		} finally {
			/** リソース開放 */
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();		// セッションハンドル開放
			}
			if (keepReqParam.get() != null) {
				keepReqParam.remove();		// リクエストパラメータ開放
			}
			if (keepFixedText.get() != null) {
				keepFixedText.remove();		// FixedText開放
			}
		}
	}

	/**
	 * 機器提供サービス契約登録部品の上りマッピング処理
	 * <br>
	 * @param param
	 * @param fixedText
	 * @param index
	 * @param svcListNm
	 * @param prefix
	 */
	@SuppressWarnings("unchecked")
	private void editInAddKktkSvcKei(IRequestParameterReadWrite param, String fixedText, int index, String svcListNm, String prefix)
	throws Exception
	{
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		HashMap svcMap = null;
		ArrayList inList = (ArrayList)(inMap.get(svcListNm));
		if (inList == null)
		{
			svcMap = inMap;
		}
		else
		{
			svcMap = (HashMap)inList.get(index);
		}
		
		svcMap.put(JCMConstants.FUNC_CODE_KEY, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// 申込明細番号
		svcMap.put(prefix + "mskm_dtl_no", (String)getMskmDtlWorkMapValue(param, "mskm_dtl_no_tel"));
		
		// 場所番号の設定
		svcMap.put(prefix + "kiki_stc_saki_place_no", getSetplaceNo(svcMap, prefix));
		
		// 更新年月日時分秒(更新前)
		String lastDtm = "";

		String svcKeiKaisenUcwkNo = (String)svcMap.get("kk0341_svc_kei_kaisen_ucwk_no");
		if(!StringUtils.isEmpty(svcKeiKaisenUcwkNo)){
			// 回線内訳番号が設定されている場合、回線の最終更新年月日時分秒を取得
			Map<String, Object> mapEKK0251A01 = getEKK0251A010(svcKeiKaisenUcwkNo);
			if( mapEKK0251A01 != null && !mapEKK0251A01.isEmpty() ){
				lastDtm = (String)mapEKK0251A01.get(EKK0251A010CBSMsg1List.LAST_UPD_DTM);
			}
		}
		if(!StringUtils.isEmpty(lastDtm)){
			svcMap.put(prefix + "upd_dtm_bf", lastDtm);
		}else{
			svcMap.put(prefix + "upd_dtm_bf", JPCBPCommon.getOnlineOpeDateTimeStamp(null));
		}
	}
	
	/**
	 * 設置場所番号の取得.
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   pararmMap  入力マップ
	 * @throws Throwable 
	 */
	private String getSetplaceNo(Map<String, String> paramMap, String prefix) throws Exception {

		// EKKA0020002 設置場所番号取得
		ArrayList<HashMap<String, Object>> listEKKA0020002 = getEKKA0020002(paramMap, prefix);
		if (listEKKA0020002 == null || listEKKA0020002.isEmpty()) {
			return null;
		}

		// 設置場所番号を返却
		HashMap<String, Object> mapEKKA0020002 = listEKKA0020002.get(0);
		return (String)mapEKKA0020002.get(EKKA0020002CBSMsg2List.SETPLACE_NO);
	}

	/**
	 * EKKA0020002 設置場所番号取得
	 * 
	 * @param paramMap		設置場所の情報
	 * @return				設置場所番号取得結果
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> getEKKA0020002(Map<String, String> paramMap, String prefix) throws Exception {

		// EKKA0020002 設置場所番号取得
		HashMap<String, Object> setplaceMap = new HashMap<String, Object>();
		setplaceMap.put(EKKA0020002CBSMsg.EKKA0020002CBSMSG1LIST, new ArrayList<HashMap<String, Object>>());

		ArrayList<HashMap<String, Object>> setplaceList = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> setplaceDetailMap = new HashMap<String, Object>();
		// 場所住所コード
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_AD_CD, paramMap.get(prefix + "kiki_stc_saki_ad_cd"));
		// 場所郵便番号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_PCD, paramMap.get(prefix + "kiki_stc_saki_pcd"));
		// 場所都道府県名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_STATE_NM, paramMap.get(prefix + "kiki_stc_saki_state_nm"));
		// 場所市区町村名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_CITY_NM, paramMap.get(prefix + "kiki_stc_saki_city_nm"));
		// 場所大字通称名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_OAZTSU_NM, paramMap.get(prefix + "kiki_stc_saki_oaztsu_nm"));
		// 場所字丁目名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_AZCHO_NM, paramMap.get(prefix + "kiki_stc_saki_azcho_nm"));
		// 場所番地号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_BNCHIGO, paramMap.get(prefix + "kiki_stc_saki_bnchigo"));
		// 場所住所補記・建物名
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_ADRTTM, paramMap.get(prefix + "kiki_stc_saki_adrttm"));
		// 場所住所補記・部屋番号
		setplaceDetailMap.put(EKKA0020002CBSMsg1List.KEY_SETPLACE_ADRRM, paramMap.get(prefix + "kiki_stc_saki_adrrm"));

		setplaceList.add(setplaceDetailMap);

		HashMap<String, Object> reqMap = mapper.setEKKA0020002(keepReqParam.get(), keepFixedText.get(), setplaceMap, setplaceList);

		Map<?, ?> resMap = scCall.run( reqMap, keepSesHandle.get() );
		ArrayList<HashMap<String, Object>> listEKKA0020002 = mapper.getEKKA0020002(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return listEKKA0020002;
	}

	
	/**
	 * EKK0251A01 サービス契約回線内訳一意照会
	 * 
	 * @param svcKeiNo	サービス契約回線内訳番号
	 * @return
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK0251A010(String svcKeiKaisenUcwkNo) throws Exception {
		
		// EKK0251A010_サービス契約回線内訳一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_KAIS_UCWK_NO, svcKeiKaisenUcwkNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0251A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0251A010 = mapper.getEKK0251A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0251A010;
	}

	/**
	 *  機器提供サービス契約登録部品の下りマッピング処理
	 * <br>
	 * @param param
	 * @param fixedText
	 * @param index
	 * @param svcListNm
	 * @param prefix
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void editOutAddKktkSvcKei(IRequestParameterReadWrite param, String fixedText, int index, String svcListNm, String prefix)
	throws Exception
	{
		ArrayList dataList = (ArrayList)((HashMap)param.getData(fixedText)).get(svcListNm);
		if (dataList == null)
		{
			dataList = new ArrayList();
			((HashMap)param.getData(fixedText)).put(svcListNm, dataList);
		}
		/* 業務データ設定 */
		HashMap dataMap = (HashMap)dataList.get(index);
		if (dataMap == null)
		{
			dataMap = new HashMap();
			param.setData(fixedText, dataMap);
		}
		
		// 更新年月日時分秒
		String lastDtm = (String)dataMap.get(prefix + "upd_dtm");
		
		//住所変更持ち回り
		HashMap<String, Object> dtmWorkMap = (HashMap<String, Object>) param.getData("KKSV0674Work");
		if (dtmWorkMap != null )
		{
			//更新年月日時分秒
			dtmWorkMap.put("eoh_tl_svc_kei_upd_dtm_bef", lastDtm);
		}
	}
	
	/**
	 * EKK0341A010 機器提供サービス契約一意照会
	 * 
	 * @param kktkSvcKeiNo		機器提供サービス契約番号
	 * @return					機器提供サービス契約一意照会結果
	 * @throws Throwable
	 */
	private Map<String, Object> getEKK0341A010(String kktkSvcKeiNo) throws Exception {

		// EKK2811D010_機器提供サービス契約登録
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0341A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> mapEKK0341A010 = mapper.getEKK0341A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return mapEKK0341A010;
	}
	
	/**
	 * EKK0341C030 機器提供サービス契約照査
	 * 
	 * @param mapEKK0341A010	機器提供サービス契約一意照会結果
	 * @param updDtm			更新年月日時分秒
	 * @return					機器提供サービス契約照査結果
	 * @throws Throwable
	 */
	private Map<String, Object> verifyEKK0341C030(Map<String, Object> mapEKK0341A010, String updDtm) throws Exception {

		// EKK0341C030 機器提供サービス契約照査
		HashMap<String, String> condMap = new HashMap<String, String>();
		// 機器提供サービス契約番号
		condMap.put(EKK0341C030CBSMsg.KKTK_SVC_KEI_NO, (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		// 異動区分
		condMap.put(EKK0341C030CBSMsg.IDO_DIV, (String)mapEKK0341A010.get(EKK0341A010CBSMsg1List.IDO_DIV));
		// 機器認証ID NULL
		condMap.put(EKK0341C030CBSMsg.KIKI_NINSHO_ID, null);
		// 機器認証IDパスワード NULL
		condMap.put(EKK0341C030CBSMsg.KIKI_NINSHO_ID_PWD, null);
		// 照査解約完了コード（照査OK）
		condMap.put(EKK0341C030CBSMsg.SHOSA_DSL_FIN_CD, SHOSA_DSL_FIN_CD_OK);
		// 更新年月日時分秒(更新前)
		condMap.put(EKK0341C030CBSMsg.UPD_DTM_BF, updDtm);

		HashMap<String, Object> reqMap = mapper.setEKK0341C030(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		Map<String, Object> mapEKK0341C320 = mapper.getEKK0341C320(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return mapEKK0341C320;
	}
	
	/**
	 * 作業マップ（申込）の値を取得します。
	 * 
	 * <br>
	 * @param param
	 * @param key
	 * @return 取得した値
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private String getMskmWorkMapValue(IRequestParameterReadWrite param, String key) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();

		HashMap inMap = null;
		/* 申込作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(CC_WORK_AREA_NAME_MSKM);
		}
		else
		{
			inMap = null;
		}

		String result = null;
		if (inMap != null)
		{
			result = (String)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}
	
	/**
	 * 作業マップ（申込明細）の値を取得します。
	 * 
	 * <br>
	 * @param param
	 * @param key
	 * @return 取得した値
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private String getMskmDtlWorkMapValue(IRequestParameterReadWrite param, String key) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap inMap = null;
		HashMap workDataMap_Mskm = null;
		String result = null;
		
		if (workMap != null)
		{
			workDataMap_Mskm = (HashMap)workMap.get(CC_WORK_AREA_NAME_MSKM);
			if (workDataMap_Mskm != null)
			{
				ArrayList inList1 = ((ArrayList)workDataMap_Mskm.get(CC_WORK_AREA_NAME_MSKM_LIST));
				int devCnt = inList1 != null ? inList1.size() : 0;
				for (int i = 0; i < devCnt; i++)
				{
					inMap = (HashMap)(inList1).get(i);
					if(inMap.containsKey(MSKM_DTL_NO_TEL))
					{	// 電話
						if (inMap != null)
						{
							result = (String)inMap.get(key);
							break;
						}
					}
				}
			}
		}
		
		return result;
	}
}
