/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCallWrisvcAutoAplyCC
*	ソースファイル名：JKKCallWrisvcAutoAplyCC.java
*	作成者			：FJ
*	日付			：2012年05月15日
*＜機能概要＞ 
*	契約紐付変更登録の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/05/15	FJ			新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

/**
 * 
 * @author 909486
 *
 */
public class JKKCallWrisvcAutoAplyCC extends AbstractCommonComponent
{
	/**
	 *  割引自動適用CCの呼出を行います。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * 
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite callWrisvcAutoAply(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Throwable
	{
		// 割引自動適用CC
		JKKWrisvcAutoAplyCC wrisvcAutoAplyCC = new JKKWrisvcAutoAplyCC();
		
		HashMap<String, Object> paramMap = null;
		
		// ユーザデータ情報
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		// 変更対象のリストを取得
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0360WORK01");
		ArrayList<Object> svcList = (ArrayList<Object>)work01Map.get("svc_kei_list");
		
		//  割引自動適用CC用のメッセージを作成
		paramMap = editInMsg(param, dataMap, svcList, workDataMap, null);
		param.setData(fixedText, paramMap);
		
		// 割引CC実行
		wrisvcAutoAplyCC.execute(handle, param, fixedText);
		
		// 請求先同時併合の場合
		if("ON".equals((String)work01Map.get("seiky_doji_heigo")))
		{
			// 併合対象の請求契約番号の取得
			String[] seikyKeiNoList =  getSeikyKeiNoList(svcList);
			
			// 併合対象の請求契約番号の件数分繰り返す
			for(int i=0; i<seikyKeiNoList.length; i++)
			{
				// 請求契約内容変更(契約者併合)用のメッセージを作成
				paramMap = editInMsg(param, dataMap, svcList, workDataMap, seikyKeiNoList[i]);
				param.setData(fixedText, paramMap);
				
				// 割引CC実行				
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
		}
		
		return param;
	}
	
	/**
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		
		return paramMap;
	}
	
	/**
	 * 割引自動適用のメッセージを作成します。
	 * 
	 * @param param
	 * @param dataMap
	 * @param svcList
	 * @param workDataMap
	 * @param seikyKeiNo
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												HashMap<String, Object> dataMap,
												ArrayList<Object> svcList,
												HashMap<String, Object> workDataMap,
												String seikyKeiNo) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		HashMap<String, Object> childMap = new HashMap<String, Object>();
		HashMap<String, String> childMap2 = new HashMap<String, String>();
		HashMap<String, String> svcMap = null;
		ArrayList<Object> list = new ArrayList<Object>(); 
		
		paramMap.put("sysid", dataMap.get("sk_sysid"));						// 併合先＿SYSID
		
		// 契約者併合の場合
		if(isNull(seikyKeiNo))
		{
			paramMap.put("add_chge_div", "11");								// 登録／変更区分
			paramMap.put("old_sysid", dataMap.get("mt_sysid"));				// 併合元＿SYSID
		}
		// 請求併合の場合
		else
		{
			paramMap.put("add_chge_div", "13");								// 登録／変更区分
			paramMap.put("old_seiky_kei_no", seikyKeiNo);					// 旧請求契約番号併合元＿SYSID
		}
		
		paramMap.put("mskm_no", (String)workDataMap.get("mskm_no"));		// 申込番号
		paramMap.put("mskm_sbt_cd", "00011");								// 申込種別コード
		paramMap.put("ido_div", dataMap.get("ido_div"));					// 異動区分
		paramMap.put("func_code", "1");										// 機能コード
		
		// サービス契約グループリスト
		childMap.put("grp_div", "00");										// グループ区分
		
		ArrayList<Object> list2 = new ArrayList<Object>(); 
		// 併合元サービス契約一覧の件数分繰り返す
		for(int i=0; i<svcList.size(); i++)
		{
			svcMap = (HashMap<String, String>)svcList.get(i);
			
			// 画面で選択されている場合
			if((Boolean.valueOf(svcMap.get("isSelect"))))
			{
				childMap2 = new HashMap<String, String>();
				childMap2.put("tg_kei_skbt_cd", "01");							// 対象契約識別コード
				childMap2.put("svc_kei_no", svcMap.get("svc_kei_no"));			// サービス契約番号
				childMap2.put("svc_kei_stat", svcMap.get("svc_kei_stat"));		// サービス契約ステータス
				childMap2.put("svc_cd", svcMap.get("svc_cd_KK0081"));			// サービスコード
				childMap2.put("prc_grp_cd", svcMap.get("prc_grp_cd_KK0081"));	// 料金グループコード
				childMap2.put("pcrs_cd", svcMap.get("pcrs_cd_KK0081"));			// 料金コースコード
				childMap2.put("pplan_cd", svcMap.get("pplan_cd"));				// 料金プランコード
				list2.add(childMap2);
			}
		}
		
		// サービス契約リスト
		childMap.put("svc_kei_list", list2);
		
		list.add(childMap);
		paramMap.put("svc_kei_grp_list", list);
		
		return paramMap;
	}
	
	/**
	 * 併合対象の請求契約番号を取得します。
	 * <br>
	 * @param list
	 * @return String[]
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private String[] getSeikyKeiNoList(ArrayList<Object> list)
	{
		Set<String> set = new HashSet<String>();
		HashMap<String,String> svcMap = null;
		String seikyKeiNo = null;
		
		// 併合元サービス契約一覧の件数分繰り返す
		for(int i=0; i<list.size(); i++)
		{
			svcMap = (HashMap<String, String>)list.get(i);
			
			// 画面で選択されている場合
			if(Boolean.valueOf(svcMap.get("isSelect")))
			{
				// 請求契約番号の取得
				seikyKeiNo = svcMap.get("seiky_kei_no");
				
				// 請求契約番号が重複しない場合
				if(!set.contains(seikyKeiNo))
				{
					set.add(seikyKeiNo);
				}
			}
		}
		
		return (String[])set.toArray(new String[set.size()]);
	}
	
	/**
	 * 引数のNULL判定を行います。
	 * @param param
	 * @return 判定結果
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		return false;
	}
}
