/*******************************************************************************
* All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
* システム名        ：eo顧客基幹システム
* モジュール名      ：JKKNetMobileCheckCC
* ソースファイル名  ：JKKNetMobileCheckCC.java
* 作成者            ：富士通
* 日付              ：2012年09月19日
*＜機能概要＞
* ネットモバイルチェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン    修正日      修正者      修正内容
*   v3.00         2012/09/19  FJ) 新城    新規作成
*
********************************************************************************/
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.JKKAdchgConstCC;
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.EKK0081B023CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * ネットモバイルチェックコモンコンポーネント部品
 * @author FJ
 *
 */
public class JKKNetMobileCheckCC extends AbstractCommonComponent 
{

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKNetMobileCheckCC() {
	}
	
	/** eo光ネットホームタイプ */
	private static final String PRC_GRP_CD_02 = "02";
	/** eo光ネットメゾンタイプ */
	private static final String PRC_GRP_CD_03 = "03";
	/** eo光ネットマンションタイプ */
	private static final String PRC_GRP_CD_04 = "04";
	/** eoモバイル(EM) */
	private static final String PRC_GRP_CD_08 = "08";
	/** 3G 7.2M 光ハイブリッドタイプ */
	private static final String PCRS_CD_A59 = "A59";
	/** 3G 42M 光ハイブリッドタイプ */
	private static final String PCRS_CD_A60 = "A60";
	/**
	 * ネットモバイルチェック処理.
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 */
	@SuppressWarnings({ "null", "unchecked" })
	public IRequestParameterReadWrite netMobileCheck( SessionHandle handle, IRequestParameterReadWrite param, String fixedText ) throws Exception
	{
	
// OM-2013-0004303対応 20131120 星野 ADD START
		try {
// OM-2013-0004303対応 20131120 星野 ADD END
			/** 事前準備 */
			HashMap<String, Object> reqMap;
			HashMap<String, String> condMap = new HashMap<String, String>();
			HashMap<String, Object> paramMap = (HashMap<String, Object>)( param.getData(fixedText) );
			Map<?, ?> resMap;
	
			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set(handle);
	
			// 住所変更登録CCマッピングクラスインスタンスを取得
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
			
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
	
			// 判定結果初期化
			paramMap.put( "ctrl_net_mobile_flg", "1" );
			
			// ネットサービスある場合処理を行う。
			// 光ネットサービスに変更がある場合処理を行う。
			//if(!StringUtils.isEmpty((String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_NET_SVC_KEI_NO ))){
			String eohNetUseSvcChgDiv = (String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_EOHNT_USE_SVC_CHG_DIV );
			if( !JKKAdchgConstCC.CD00849_NON.equals(eohNetUseSvcChgDiv) ){
	
				// EZM0321A010  業務パラメータ管理一意照会
				condMap.put( JKKAdchgMapperCC.COND_KEY_WORK_PARAM_ID, (String)paramMap.get( JKKAdchgConstCC.PARAM_WORK_PARAM_ID ) );
				reqMap = mapper.setEZM0321A010( param, fixedText, condMap );
				resMap = scCall.run( reqMap, keepSesHandle.get() );
				HashMap<String, Object> zm0321_a010_map = mapper.getEZM0321A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
		
				//EKK0081B023  ネット・モバイルサービス契約一覧照会
				condMap.put( JKKAdchgMapperCC.COND_KEY_SEIKYU_CD, (String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_SEIKYU_NO ) );
				condMap.put( JKKAdchgMapperCC.COND_KEY_BASE_YMD, (String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_OPE_DATE ) );
				reqMap = mapper.setEKK0081B023( param, fixedText, condMap );
				resMap = scCall.run( reqMap, handle );
				ArrayList<HashMap<String, Object>> kk0081_b023_list = mapper.getEKK0081B023( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				if (kk0081_b023_list != null && kk0081_b023_list.size() > 0)
				{
					int eohntKeiCnt = 0;	// 光ネット契約数
					int hhbKeiCnt = 0;		// 光ハイブリッド契約数
					for (int i = 0; i < kk0081_b023_list.size(); i++)
					{
						HashMap<String, Object> map = kk0081_b023_list.get(i); 
						String pcrsGrpCd = (String) map.get(EKK0081B023CBSMsg1List.PRC_GRP_CD);
						String pcrsCd = (String) map.get(EKK0081B023CBSMsg1List.PCRS_CD);
						// 料金グループコードが"02"(eo光ネットホームタイプ)、"03"(eo光ネットメゾンタイプ)、"04"(eo光ネットマンションタイプ)
						if(PRC_GRP_CD_02.equals(pcrsGrpCd) || PRC_GRP_CD_03.equals(pcrsGrpCd) 
								|| PRC_GRP_CD_04.equals(pcrsGrpCd))
						{
							eohntKeiCnt++;
						}
						// 料金グループコードが"08"(eoモバイル(EM)) 
						//  且つ 料金コースコードが"A59"(3G 7.2M 光ハイブリッドタイプ)か"A60"(3G 42M 光ハイブリッドタイプ)  の場合
						else if (PRC_GRP_CD_08.equals(pcrsGrpCd) 
								&& (PCRS_CD_A59.equals(pcrsCd) || PCRS_CD_A60.equals(pcrsCd)))
						{
							hhbKeiCnt++;
						}
					}
					int netZougen = 0;
					//光ネットサービスの利用区分が追加の場合
					if( JKKAdchgConstCC.CD00849_ADD.equals(eohNetUseSvcChgDiv) ) {
						netZougen = 1;
					//光ネットサービスの利用区分が解約の場合
					} else if( JKKAdchgConstCC.CD00849_SLRE.equals(eohNetUseSvcChgDiv) ) {
						netZougen = -1;
					}
					//光ネット契約数 ≠ 0 且つ (光ハイブリッド契約数 + 1)  ＞ 光ネット契約数　*　サービス項目の光ハイブリッド最大契約数
					if(eohntKeiCnt != 0 && (hhbKeiCnt > (eohntKeiCnt + netZougen) * Integer.parseInt((String) zm0321_a010_map.get(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE))))
					{
						paramMap.put( "ctrl_net_mobile_flg", "0" );
						paramMap.put( "ctrl_eohnt_kei_no",String.valueOf(eohntKeiCnt +  + netZougen) );
						paramMap.put( "ctrl_eohnb_kei_no", String.valueOf(hhbKeiCnt) );
					}
				}
			}
	
			return param;
			
// OM-2013-0004303対応 20131120 星野 ADD START
		} finally {

			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}

// OM-2013-0004303対応 20131120 星野 ADD END
	}
	
}
