package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
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.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;

public class JKKSV072960MappingCC extends AbstractCommonComponent{

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};


	/**
	 * サービスオーダ発行マッピング処理
	 * <br>
	 * パラメータの件数分<br>
	 * サービスオーダ登録処理を呼び出します。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite mapping(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
// OM-2013-0004303対応 20131120 星野 ADD START
		try {
// OM-2013-0004303対応 20131120 星野 ADD END
	
		
			/** 事前準備 */
			HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData("KKSV072960CC");
			HashMap<String, String> condMap = new HashMap<String, String>();
			HashMap<String, Object> reqMap;
			ArrayList<HashMap<String, Object>> opSvcKeiList = null;
			Map<?, ?> resMap;
			
			ArrayList<HashMap<String, Object>> odr_hakko_svc_kei_list = (ArrayList<HashMap<String, Object>>) paramMap.get("odr_hakko_svc_kei_list");
			if(odr_hakko_svc_kei_list==null || odr_hakko_svc_kei_list.isEmpty()){
				return param;
			}
			
			HashMap<String, Object> trgt_data_map = (HashMap<String, Object>)odr_hakko_svc_kei_list.get(0);
			if(trgt_data_map==null || trgt_data_map.isEmpty()){
				return param;
			}
			
			ArrayList<HashMap<String, Object>> hakko_trgr_trgt_list = (ArrayList<HashMap<String, Object>>) trgt_data_map.get("hakko_trgr_trgt_list");
			if(hakko_trgr_trgt_list==null || hakko_trgr_trgt_list.isEmpty()){
				return param;
			}
			
			HashMap<String, Object> hakko_trgt_trgt_data_map = (HashMap<String, Object>)hakko_trgr_trgt_list.get(0);
			if(hakko_trgt_trgt_data_map==null || hakko_trgt_trgt_data_map.isEmpty()){
				return param;
			}
			
			ArrayList<HashMap<String, Object>> kiki_trgt_data_list = (ArrayList<HashMap<String, Object>>) hakko_trgt_trgt_data_map.get("kiki_trgt_data_list");
			ArrayList<HashMap<String, Object>> opt_trgt_data_list = (ArrayList<HashMap<String, Object>>) hakko_trgt_trgt_data_map.get("opt_trgt_data_list");
	
			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set(handle);
	
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
	
			// 住所変更明細取得処理
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
	
			/** 一覧照会*/
			
			// 光電話変更区分を取得
			HashMap<String, Object> jdgChgDivTelMap = null;
			String jdgChgDivTel = null;
			
			jdgChgDivTelMap = (HashMap<String, Object>)param.getData("KKSV072927CC");
			
			jdgChgDivTel = (String)jdgChgDivTelMap.get("jdg_chg_div_tel");
	
			trgt_data_map.put("use_svc_chg_div", jdgChgDivTel);
			// ＳＹＳＩＤ
			String sysid = (String)paramMap.get("sysid");
			// 異動区分
			String ido_div = (String)paramMap.get("ido_div");
	
			// SOD基本情報
			HashMap<String, Object> sod_kihon_info = new HashMap<String, Object>();
			// 共通＿ＳＹＳＩＤ → サービスオーダ発行ＣＣ（ネット）.SYSID
			sod_kihon_info.put("sysid", sysid);
			// 共通＿異動区分 → サービスオーダ発行ＣＣ（ネット）.異動区分
			sod_kihon_info.put("ido_div", ido_div);
	
			// サービス契約番号（変更前）
			String chbf_svc_kei_no = (String)paramMap.get("svc_kei_no");
			// サービス契約番号（変更後）
			String chaf_svc_kei_no = (String)paramMap.get("saki_svc_kei_no");
	
			if((chbf_svc_kei_no == null || "".equals(chbf_svc_kei_no)) && (chaf_svc_kei_no == null || "".equals(chaf_svc_kei_no)))
			{
				return param;
			}
					
			if(chbf_svc_kei_no == null || "".equals(chbf_svc_kei_no))
			{
				chbf_svc_kei_no = chaf_svc_kei_no;
			}
	
			if(chaf_svc_kei_no == null || "".equals(chaf_svc_kei_no) )
			{
				chaf_svc_kei_no = chbf_svc_kei_no;
			}
			
			
			// サービス契約情報
			HashMap<String, Object> svc_kei_info = new HashMap<String, Object>();
	
	
			// 変更前サービス契約の一意照会を呼び出す。
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, chbf_svc_kei_no);
			condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE , JCCBPCommon.getOpeDate(null));
			reqMap = mapper.setEKK0081A010(param, fixedText, condMap);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(param, fixedText, resMap);
			mapper.scResultCheck(param);
			
			String chbfGeneAddDtm = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM);
			
			// OM-2016-0000942 住変キャンセル時のECSオーダ不正 2016/04/13 ADD START
			// サービス契約の申込明細番号
			String kk0081MskmDtlNo = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO);
			// OM-2016-0000942 住変キャンセル時のECSオーダ不正 2016/04/13 ADD END
			
			// 変更前サービス番号
			svc_kei_info.put("svc_kei_no", chbf_svc_kei_no);
			// サービス契約情報.先サービス契約番号
			svc_kei_info.put("saki_svc_kei_no", "");
			// 変更前サービス契約世代登録年月日
			svc_kei_info.put("chbf_svc_kei_gene_add_dtm", chbfGeneAddDtm);
			//  サービス契約情報.変更後サービス契約世代登録年月日時分秒
			svc_kei_info.put("chaf_svc_kei_gene_add_dtm", "");
	
			// サービス契約内訳の一覧照会を行う。
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, chbf_svc_kei_no);
			reqMap = mapper.setEKK0161B004(param, fixedText, condMap);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			ArrayList<HashMap<String, Object>> kk0161_b004_map_list = mapper.getEKK0161B004(param, fixedText, resMap);
			mapper.scResultCheck(param);
	
			
			for(int i = 0 ; i < kk0161_b004_map_list.size() ; i ++)
			{
				HashMap<String,Object> kk0161_b001_map = kk0161_b004_map_list.get(i);
				
				// OM-2016-0000942 住変キャンセル時のECSオーダ不正 2016/04/13 ADD START
				// サービス契約内訳の申込明細番号
				String kk0161MskmDtlNo = (String)kk0161_b001_map.get(EKK0161B004CBSMsg1List.MSKM_DTL_NO);
				String kk0161IdoDiv = (String)kk0161_b001_map.get(EKK0161B004CBSMsg1List.IDO_DIV);
				
				// 住変キャンセル時に親サービス契約と同時解約された内訳のみをSOD発行対象とする
				if (!(
						!JKKStringUtil.isNullBlank(kk0081MskmDtlNo)
						&& kk0081MskmDtlNo.equals(kk0161MskmDtlNo)
						&& JKKStrConst.CD00576_ADCHG_ADD.equals(kk0161IdoDiv)
					  )
					)
				{
					continue;
				}
				// OM-2016-0000942 住変キャンセル時のECSオーダ不正 2016/04/13 ADD END
				
				String svc_kei_uwck_bf = (String)kk0161_b001_map.get(EKK0161B001CBSMsg1List.SVC_KEI_UCWK_NO);
				String svc_kei_uwck_bf_gen = (String)kk0161_b001_map.get(EKK0161B001CBSMsg1List.GENE_ADD_DTM);
				
				// サービス契約内訳情報
				HashMap<String, Object> svc_kei_ucwk_info = new HashMap<String, Object>();
				
				// ｅｏ光ネット＿変更前＿サービス契約内訳番号 → サービスオーダ発行ＣＣ（ネット）.サービス契約内訳情報.サービス契約内訳番号
				svc_kei_ucwk_info.put( "svc_kei_ucwk_no", svc_kei_uwck_bf);
				svc_kei_ucwk_info.put( "chbf_svc_kei_ucwk_gene_add_dtm", "");
				svc_kei_ucwk_info.put( "saki_svc_kei_ucwk_no", "");
				svc_kei_ucwk_info.put( "chaf_svc_kei_ucwk_gene_add_dtm", svc_kei_uwck_bf_gen);
	
				HashMap<String, Object> sod_map_op = new HashMap<String, Object>();
				sod_map_op.put( "sod_kihon_info", sod_kihon_info );
				sod_map_op.put( "svc_kei_info", svc_kei_info);
				sod_map_op.put( "svc_kei_ucwk_info", svc_kei_ucwk_info);
				sod_map_op.put( "opsvkei_info", new HashMap<String, Object>() );
				
				opt_trgt_data_list.add( sod_map_op );
			}
	
	
			
			return param;
			
// OM-2013-0004303対応 20131120 星野 ADD START
		} finally {

			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}

// OM-2013-0004303対応 20131120 星野 ADD END
	}

}
