/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：eo光テレビ住所変更コンポーネント部品（住所変更キャンセル用）クラス
 *  ソースファイル名：JKKAdchgSvcKeiDivJdgTV4CnclCC.java
 *  作成者          ：FJ
 *  日付            ：2012年12月14日
 *＜機能概要＞
 *  住所変更に伴うeo光テレビの
 *  変更区分の判定を行う部品クラス（住所変更キャンセル用）。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/12/14  FJ          新規作成(JKKAdchgSvcKeiDivJdgTVCCを流用）
 *
 ********************************************************************/
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.JKKAdchgConstCC.PCRS_CD;
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;

public class JKKAdchgSvcKeiDivJdgTV4CnclCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>() {
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ. <br>
	 */
	public JKKAdchgSvcKeiDivJdgTV4CnclCC() {
	}

	/** 住所変更登録方法:追加 */
	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;
	/** 住所変更登録方法:変更（継続）（機器追加など、料金プランなど変更なしの場合） */
	public static final int AD_CHG_CMT_MODKEEP = 6;

	/**
	 * 住所変更登録方法判定. <br>
	 * 
	 * @param handle
	 *            セッションマネージャなどを持ったハンドル情報
	 * @param param
	 *            モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param fixedText
	 *            ユーザ任意文字列
	 * @throws Throwable
	 *             例外が発生した場合
	 * @return リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite adchgSvcKeiDivJdgTv(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_tv", "");
				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 {

				/** 事前準備 */

				HashMap<String, Object> paramMap40CC = (HashMap<String, Object>) param
						.getData("KKSV072939CC");
				String jdg_cource_chg = (String) paramMap40CC
						.get("judge_cource_chg");

				// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
				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");

				/**
				 * 転居元 が「eo光テレビ（Ｋ−ＣＡＴ） 」で、 転居先 が「eo光テレビ（Ｋ−ＣＡＴ） 」以外の場合
				 */
// 品質強化試験追加分 故障No.100023対応 20121230 星野 MOD START
//				// IT1-2012-0002419対応 20121212 星野 MOD START
//				// if(JKKAdchgConstCC.CD00133_TV_KCAT.equals(pcr_grp_cd_bef) &&
//				// !JKKAdchgConstCC.CD00133_TV_KCAT.equals(pcr_grp_cd_aft)){
//				if (!(JKKAdchgConstCC.CD00133_TV_KCAT.equals(pcr_grp_cd_bef) && JKKAdchgConstCC.CD00133_TV_KCAT
//						.equals(pcr_grp_cd_aft))) {
//					// IT1-2012-0002419対応 20121212 星野 MOD END
				
				if( 
					!( 
						( JKKAdchgConstCC.CD00133_TV_KCAT.equals(pcr_grp_cd_bef) || 
						  PCRS_CD.A24_SAISOSIN_TACH_SD.equals(pcrs_cd_bef) || 
						  PCRS_CD.A64_SAISOSIN_TACH_HD.equals(pcrs_cd_bef) 
						) &&
						( JKKAdchgConstCC.CD00133_TV_KCAT.equals(pcr_grp_cd_aft) || 
						  PCRS_CD.A24_SAISOSIN_TACH_SD.equals(pcrs_cd_aft) || 
						  PCRS_CD.A64_SAISOSIN_TACH_HD.equals(pcrs_cd_aft) 
						)
					 )
				){
// 品質強化試験追加分 故障No.100023対応 20121230 星野 MOD END

					// 解約／新規を示す値を返却
					jdgVal = AD_CHG_CMT_SLRE_WITH_ADD;

					// ↓↓↓住所変更キャンセルの場合、ここを有効にする↓↓↓
					//
					// コース変更の異動予約が存在するかを判定し、変更または機器交換の判定を行う。
				} else if ("0".equals(jdg_cource_chg)) {

					// 変更（継続）を示す値を返却
					jdgVal = AD_CHG_CMT_MODKEEP;

					// ↑↑↑住所変更キャンセルの場合、ここを有効にする↑↑↑
					/** 転居元の料金グループ，料金コース，料金プランと転居先の料金グループ，料金コース，料金プランが完全一致しない場合 */
				} else {

					// 変更を示す値を返却
					jdgVal = AD_CHG_CMT_MODIFY;
				}
			}

			// 登録方法を格納
			paramMap.put("jdg_chg_div_tv", String.valueOf(jdgVal));

		} finally {

			// ・セッションハンドル保持域
			if (keepSesHandle.get() != null) {
				keepSesHandle.remove();
			}
		}

		return param;
	}
}