/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：eo光ネット変更区分判定コンポーネント部品クラス
 *  ソースファイル名：JKKAdchgSvcKeiDivJdgNetCC.java
 *  作成者          ：FJ
 *  日付            ：2012年8月20日
 *＜機能概要＞
 *  住所変更に伴うeo光ネットの
 *  変更区分の判定を行う部品クラス。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/8/20  FJ          新規作成
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

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.EKK0081A010CBSMsg1List;

/**
 * eo光ネット住所変更コンポーネント部品クラス.
 * <br>
 * @author FJ
 */
public class JKKAdchgSvcKeiDivJdgNetCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgSvcKeiDivJdgNetCC() {
	}
	
	/** 住所変更登録方法:追加 */
	public static final int AD_CHG_CMT_ADD = 0;
	/** 住所変更登録方法:継続 */
	public static final int AD_CHG_CMT_KEEP = 1;
	/** 住所変更登録方法:変更 */
	public static final int AD_CHG_CMT_MODIFY = 2;
	/** 住所変更登録方法:解約 */
	public static final int AD_CHG_CMT_SLRE = 3;
	/** 住所変更登録方法:解約／新規 */
	public static final int AD_CHG_CMT_SLRE_WITH_ADD = 4;
	/** 住所変更登録方法:保留 */
	public static final int AD_CHG_CMT_HOLD = 5;

	/**
	 * 住所変更登録方法判定.
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite adchgSvcKeiDivJdgNet(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {

		try {

			/** 事前準備 */
			HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set(handle);


			/** 住所変更登録方法 特定 */
			int jdgVal;

			// param.利用サービス変更区分を取得し、処理を分岐
			String use_svc_chg_div = (String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_USE_SVC_CHG_DIV );
			if(StringUtils.isEmpty(use_svc_chg_div) || JKKAdchgConstCC.CD00849_NON.equals(use_svc_chg_div)){
				
				// 初期値を返却
				paramMap.put("jdg_chg_div_net", "");
				return param;
				
			} else if(JKKAdchgConstCC.CD00849_ADD.equals(use_svc_chg_div)){

				// 追加を示す値を返却
				jdgVal = AD_CHG_CMT_ADD;
			} else if(JKKAdchgConstCC.CD00849_KEEP.equals(use_svc_chg_div)){

				// 継続を示す値を返却
				jdgVal = AD_CHG_CMT_KEEP;
			} else if(JKKAdchgConstCC.CD00849_SLRE.equals(use_svc_chg_div)){

				// 解約を示す値を返却
				jdgVal = AD_CHG_CMT_SLRE;
			} else if(JKKAdchgConstCC.CD00849_HOLD.equals(use_svc_chg_div)){

				// 保留を示す値を返却
				jdgVal = AD_CHG_CMT_HOLD;
			} else {

				/** 事前準備 */
				// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
				JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

				// SCリクエストInvokerを取得
				ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();


				/** 転居元でのサービス契約を取得 */
				// ・EKK0081A010  サービス契約一意照会
				HashMap<String, String> condMap = new HashMap<String, String>();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO));
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_OPE_DATE));
				HashMap<String, Object> reqMap = mapper.setEKK0081A010(param, fixedText, condMap);
				Map<?, ?> resMap = scCall.run(reqMap, keepSesHandle.get());
				HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(param, fixedText, resMap);
				mapper.scResultCheck(param);


				/** 料金グループ，料金コース，料金プランを元に、登録方法を特定 */
				// 転居前情報
				String pcr_grp_cd_bef = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.PRC_GRP_CD);
				String pcrs_cd_bef = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.PCRS_CD);
				String pplan_cd_bef = (String)kk0081_a010_map.get(EKK0081A010CBSMsg1List.PPLAN_CD);
				String tkhoshiki_no_bef = (String) kk0081_a010_map.get(EKK0081A010CBSMsg1List.TK_HOSHIKI_KEI_NO);
				
				// 転居先情報
				String pcr_grp_cd_aft = (String)paramMap.get("pcr_grp_cd_aft");
				String pcrs_cd_aft = (String)paramMap.get("pcrs_cd_aft");
				String pplan_cd_aft = (String)paramMap.get("pplan_cd_aft");
				String tkhoshiki_no_aft = (String) paramMap.get("tkhoshiki_no_aft");
				
				if( JKKAdchgConstCC.CD00133_NET_MANTION.equals(pcr_grp_cd_bef) ||
					JKKAdchgConstCC.CD00133_NET_MANTION.equals(pcr_grp_cd_aft)){

					/** 転居元 または 転居先が「eo光ネットマンションタイプ」の場合 */
					// 解約／新規を示す値を返却
					jdgVal = AD_CHG_CMT_SLRE_WITH_ADD;
//				} else if(pcr_grp_cd_bef.equals(pcr_grp_cd_aft) &&
//						pcrs_cd_bef.equals(pcrs_cd_aft) &&
//						pplan_cd_bef.equals(pplan_cd_aft) &&
//						tkhoshiki_no_bef.equals(tkhoshiki_no_aft)){
//					
//					/* 転居元の料金グループ，料金コース，料金プランと転居先の料金グループ，料金コース，料金プラン, 提供方式契約番号が完全一致する場合 */
//					// 継続を示す値を返却
//					jdgVal = AD_CHG_CMT_KEEP;
				} else {

					/** 転居元の料金グループ，料金コース，料金プランと転居先の料金グループ，料金コース，料金プランが完全一致しない場合 */
					// 変更を示す値を返却
					jdgVal = AD_CHG_CMT_MODIFY;
				}
			}

			// 登録方法を格納
			paramMap.put("jdg_chg_div_net", String.valueOf(jdgVal));

			} finally {
				
			// ・セッションハンドル保持域
			if( keepSesHandle.get() != null ){
				keepSesHandle.remove();
			}
		}

		return param;
	}

}