/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：住所情報変更 SOD発行キャンセルマッピングコンポーネント部品クラス
 *  ソースファイル名：JKKSV0725303MappingCC.java
 *  作成者          ：FJ
 *  日付            ：2013年11月23日
 *＜機能概要＞
 *  住所変更本登録後の修正において、電話のサービス追加を取消しする場合に
 *  電話のSOD発行をキャンセルするためのマッピング処理を行う
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2013/11/13  FJ          新規作成
 *  v8.00.00    2014/05/25  FJ)星野     OM-2014-0001911対応
 ********************************************************************/
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.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;

public class JKKSV0725303MappingCC extends AbstractCommonComponent{

	/** セッションハンドル保持域 */
	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();

	/**
	 * ＳＯＤ発行キャンセルマッピング処理
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite mapping(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		try {
			/** リソース保持 */
			keepSesHandle.set( handle );	// セッションハンドル
			keepReqParam.set( param );		// リクエストパラメータ
			keepFixedText.set( fixedText );	// FixedText

			// SOD発行キャンセルCCのパラメータを取得
			ArrayList<HashMap<String, Object>> paramList = getSodCancelParamUpdateList();
			if (paramList == null) {
				return param;
			}

			// SOD基本情報取得
			HashMap<String, Object> sodBaseInfo =getSodBaseInfo();

			// サービス契約情報取得
			String svcKeiNo = getSvcKeiNo();
			HashMap<String, Object> svc_kei_info = getSvcKeiInfo(svcKeiNo);

			// サービス契約内訳一覧照会
			ArrayList<HashMap<String, Object>> listEKK0161B004 = getEKK0161B004(svcKeiNo);
			for (HashMap<String, Object> mapEKK0161B004 : listEKK0161B004) {

				// サービス契約内訳情報取得
				HashMap<String, Object> svc_kei_ucwk_info = getSvcKeiUcwkInfo(mapEKK0161B004);

				// SOD発行キャンセルCCのパラメータを上書きする
				HashMap<String, Object> sod_map_op = new HashMap<String, Object>();
				sod_map_op.put( "sod_kihon_info", sodBaseInfo );
				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>() );
// OM-2014-0001911対応 20140525 星野 ADD START
				sod_map_op.put( "isCancelTelSvcOnly", "1" );
// OM-2014-0001911対応 20140525 星野 ADD END
				paramList.add( sod_map_op );
			}

			return param;

		} finally {
			/** リソース開放 */
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();		// セッションハンドル開放
			}
			if (keepReqParam.get() != null) {
				keepReqParam.remove();		// リクエストパラメータ開放
			}
			if (keepFixedText.get() != null) {
				keepFixedText.remove();		// FixedText開放
			}
		}
	}

	/**
	 * SOD発行キャンセルCCのパラメータを取得する
	 * 
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getSodCancelParameter() throws Throwable {

		// 自身のCC用パラメータ取得
		HashMap<String, Object> ccParam = (HashMap<String, Object>)keepReqParam.get().getData(keepFixedText.get());
		if (ccParam == null || ccParam.isEmpty()) {
			return null;
		}

		// SOD発行キャンセルCCのパラメータ取得
		String paramKey = (String)ccParam.get("fixedText_sod_cancel");
		HashMap<String, Object> paramMap = (HashMap<String, Object>)keepReqParam.get().getData(paramKey);
		if (paramMap == null || paramMap.isEmpty()) {
			return null;
		}
		
		return paramMap;
	}

	/**
	 * SOD発行キャンセルCCのパラメータを取得する<br>
	 * 更新が必要なパラメータのみ取得
	 * 
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getSodCancelParamUpdateList() throws Throwable {

		// SOD発行キャンセルCCのパラメータ取得
		HashMap<String, Object> paramMap = getSodCancelParameter();
		if (paramMap == null || paramMap.isEmpty()) {
			return null;
		}

		ArrayList<HashMap<String, Object>> svcKeiList = (ArrayList<HashMap<String, Object>>)paramMap.get("odr_hakko_svc_kei_list");
		if (svcKeiList == null || svcKeiList.isEmpty()) {
			return null;
		}

		HashMap<String, Object> sodMap = (HashMap<String, Object>)svcKeiList.get(0);
		if (sodMap == null || sodMap.isEmpty()) {
			return null;
		}

		ArrayList<HashMap<String, Object>> sodList = (ArrayList<HashMap<String, Object>>)sodMap.get("hakko_trgr_trgt_list");
		if (sodList == null || sodList.isEmpty()) {
			return null;
		}

		HashMap<String, Object> hakkoSodMap = (HashMap<String, Object>)sodList.get(0);
		if (hakkoSodMap == null || hakkoSodMap.isEmpty()) {
			return null;
		}

		ArrayList<HashMap<String, Object>> optList = (ArrayList<HashMap<String, Object>>) hakkoSodMap.get("opt_trgt_data_list");

		return optList;
	}

	/**
	 * SOD発行キャンセルCCのパラメータよりSOD基本情報取得を取得する
	 * 
	 * @return
	 * @throws Throwable
	 */
	private HashMap<String, Object> getSodBaseInfo() throws Throwable {

		// SOD基本情報
		HashMap<String, Object> sodBaseInfo = new HashMap<String, Object>();

		HashMap<String, Object> paramMap = getSodCancelParameter();

		// SYSID
		String sysid = (String)paramMap.get("sysid");
		sodBaseInfo.put("sysid", sysid);

		// 異動区分
		String ido_div = (String)paramMap.get("ido_div");
		sodBaseInfo.put("ido_div", ido_div);

		return sodBaseInfo;
	}

	/**
	 * SOD発行キャンセルCCのパラメータより転居先のサービス契約番号を取得する
	 * 
	 * @return
	 * @throws Throwable
	 */
	private String getSvcKeiNo() throws Throwable {

		HashMap<String, Object> paramMap = getSodCancelParameter();

		// 転居先のサービス契約番号
		return (String)paramMap.get("saki_svc_kei_no");
	}

	/**
	 * サービス契約の一意照会
	 * 
	 * @param svcKeiNo
	 * @return
	 * @throws Throwable
	 */
	private HashMap<String, Object> getEKK0081A010(String svcKeiNo) throws Throwable {

		// EKK0081A010 サービス契約の一意照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE , JCCBPCommon.getOpeDate(null));
		HashMap<String, Object> reqMap = mapper.setEKK0081A010(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());

		return kk0081_a010_map;
	}

	/**
	 * サービス契約内訳の一覧照会
	 * 
	 * @param svcKeiNo
	 * @return
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> getEKK0161B004(String svcKeiNo) throws Throwable {

		// EKK0161B004 サービス契約内訳の一覧照会
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svcKeiNo);
		HashMap<String, Object> reqMap = mapper.setEKK0161B004(keepReqParam.get(), keepFixedText.get(), condMap);

		Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> kk0161_b004_map_list = mapper.getEKK0161B004(keepReqParam.get(), keepFixedText.get(), resMap);
		mapper.scResultCheck(keepReqParam.get());
		
		return kk0161_b004_map_list;
	}

	/**
	 * サービス契約情報を取得する
	 * 
	 * @param svcKeiNo
	 * @return
	 * @throws Throwable
	 */
	private HashMap<String, Object> getSvcKeiInfo(String svcKeiNo) throws Throwable {

		// サービス契約一意照会
		HashMap<String, Object> mapEKK0081A010 = getEKK0081A010(svcKeiNo);

		// サービス契約情報
		HashMap<String, Object> svc_kei_info = new HashMap<String, Object>();
		svc_kei_info.put("svc_kei_no", svcKeiNo);
		svc_kei_info.put("saki_svc_kei_no", "");
		svc_kei_info.put("chbf_svc_kei_gene_add_dtm", mapEKK0081A010.get(EKK0081A010CBSMsg1List.GENE_ADD_DTM));
		svc_kei_info.put("chaf_svc_kei_gene_add_dtm", "");

		return svc_kei_info;
	}

	/**
	 * サービス契約内訳情報を取得する
	 * 
	 * @param mapEKK0161B004
	 * @return
	 */
	private HashMap<String, Object> getSvcKeiUcwkInfo(HashMap<String, Object> mapEKK0161B004) {
		
		// サービス契約内訳情報
		HashMap<String, Object> svc_kei_ucwk_info = new HashMap<String, Object>();
		svc_kei_ucwk_info.put("svc_kei_ucwk_no", mapEKK0161B004.get(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO));
		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", mapEKK0161B004.get(EKK0161B004CBSMsg1List.GENE_ADD_DTM));
		
		return svc_kei_ucwk_info;
	}
}
