/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAddSjishoCtrl
*   ソースファイル名：JKKAddSjishoCtrl.java
*   作成者          ：富士通
*   日付            ：2014年04月23日
*＜機能概要＞
*   契約管理の各ＢＰサービスおよびＣＣ部品にて指示書CC取込みを取りまとめる部品です
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/04/23  富士通        新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAddSjishoConst;
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;


/**
 * 指示書CC呼出し制御
 * 
 * @author 富士通
 * @since 2012-04-23 巻取@　指示書CC取込み対応
 */
public class JKKAddSjishoCtrl extends AbstractCommonComponent
{


	/**
	 * 最大値
	 */
	private static final int MAX_P = 11;

	/**
	 * 連携データ区分01〜11で、付随情報をセットするリストの名称
	 */
	private static final String[] O1LISTNM = {
		null,
		null,									// 01 お客様のグループ情報
		JKKAddSjishoConst.SVC_KEI_LIST,			// 02 回線契約にかかるサービス契約番号とSYSIDとの紐付け情報
		JKKAddSjishoConst.OP_SVC_KEI_LIST,		// 03 POPIDの情報
		JKKAddSjishoConst.OP_SVC_KEI_LIST,		// 04 WEBIDの情報
		JKKAddSjishoConst.SVC_KEI_UCWK_LIST,	// 05 認証IDの情報
		// 2012/08/07 ST1-2012-0000211 MOD START 請求契約番号情報の追加
		JKKAddSjishoConst.SVC_KEI_LIST,			// 06 請求契約番号（#T）の情報
		// 2012/08/07 ST1-2012-0000211 MOD END
		JKKAddSjishoConst.SVC_KEI_LIST,			// 07 回線契約に紐づく各種サービス契約の情報
		JKKAddSjishoConst.SVC_KEI_LIST,			// 08 支払方法入力支援の情報
		null,
		null,
		JKKAddSjishoConst.SVC_KEI_LIST			// 11 お客様の基本情報
	};


	/**
	 * 連携データ区分01〜11で、付随情報をセットする際のマップ名
	 */
	private static final String[] O1MAPNM = {
		null,
		JKKAddSjishoConst.SYSID,				// 01 お客様のグループ情報
		JKKAddSjishoConst.SVC_KEI_NO,			// 02 回線契約にかかるサービス契約番号とSYSIDとの紐付け情報
		JKKAddSjishoConst.OP_SVC_KEI_NO,		// 03 POPIDの情報
		JKKAddSjishoConst.OP_SVC_KEI_NO,		// 04 WEBIDの情報
		JKKAddSjishoConst.SVC_KEI_UCWK_NO,		// 05 認証IDの情報
		// 2012/08/07 ST1-2012-0000211 MOD START 請求契約番号情報の追加
		JKKAddSjishoConst.SVC_KEI_NO,			// 06 請求契約番号（#T）の情報
		// 2012/08/07 ST1-2012-0000211 MOD END
		JKKAddSjishoConst.SVC_KEI_NO,			// 07 回線契約に紐づく各種サービス契約の情報
		JKKAddSjishoConst.SVC_KEI_NO,			// 08 支払方法入力支援の情報
		null,
		null,
		JKKAddSjishoConst.SVC_KEI_NO			// 11 お客様の基本情報
	};


//	/**
//	 * 連携データ区分をセット<br/>
//	 * 付随データが単一の場合のAPI
//	 * 
//	 * @param param リクエストパラメータ
//	 * @param mapNm 格納先マップの名称
//	 * @param renkeiKbn 連携データ区分
//	 * @param trnKbn 処理区分
//	 * @param arg1 付随データ
//	 * @return マップ
//	 */
//	public static Map<String, Object> putAxMRenkeiDataKbn(RequestParameter param, String mapNm, String renkeiKbn, String trnKbn, String arg1)
//	{
//		return putAxMRenkeiDataKbn(param, mapNm, renkeiKbn, trnKbn, new String[]{arg1});
//	}


	/**
	 * 連携データ区分をセット<br>
	 * 付随データが複数の場合のAPI<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	mapNm		格納先マップの名称
	 * @param	renkeiKbn	連携データ区分
	 * @param	trnKbn		処理区分
	 * @param	arg1		付随データ
	 * @return				マップ
	 */
	public static Map<String, Object> putAxMRenkeiDataKbn(
			IRequestParameterReadWrite param,
			String mapNm,
			String renkeiKbn,
			String trnKbn,
			String[] arg1
	)
	{
		Map<String, Object> baseMap = getOrCreateRenkeiDataMap(param, mapNm);

		HashMap<String, Object> xMap = new HashMap<String, Object>();
		// 連携区分
		xMap.put(JKKAddSjishoConst.RENKEI_DATA_KBN, renkeiKbn);
		// 処理区分
		xMap.put(JKKAddSjishoConst.TRN_KBN, trnKbn);
		// サービス契約情報リストの調整（Listは必須）
		getOrCreateList(xMap, JKKAddSjishoConst.SVC_KEI_LIST);
		// サービス契約内訳情報リスト（Listは必須）
		getOrCreateList(xMap, JKKAddSjishoConst.SVC_KEI_UCWK_LIST);
		// オプションサービス契約情報リスト（Listは必須）
		getOrCreateList(xMap, JKKAddSjishoConst.OP_SVC_KEI_LIST);
		// 更新対象項目リスト（Listは必須）
		getOrCreateList(xMap, JKKAddSjishoConst.UPD_TG_KMK_LIST);

		int k = Integer.parseInt(renkeiKbn);
		if (MAX_P >= k)
		{
			// 子リストを取得
			List<Map<String, Object>> list = getOrCreateList(xMap, O1LISTNM[k]);

			// 所定の情報を子リストに追加
			for (int i = 0; null != arg1 && i < arg1.length; i++)
			{
				if (null != arg1[i] && 0 < arg1[i].length())
				{
					HashMap<String, Object> yMap = null;
					if (null != list)
					{
						yMap = new HashMap<String, Object>();
						list.add(yMap);
					}
					else
					{
						yMap = xMap;
					}
					yMap.put(O1MAPNM[k], arg1[i]);
				}
			}
		}

		// 連携データ区分リストに追加
		getOrCreateList(baseMap, JKKAddSjishoConst.RENKEI_DATA_KBN_LIST).add(xMap);

		return xMap;
	}


	/**
	 * 連携データ区分をセット（01〜10）<br>
	 * 付随データが複数の場合のAPI<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	mapNm		格納先マップの名称
	 * @param	renkeiKbn	連携データ区分
	 * @param	trnKbn		処理区分
	 * @param	arg1		サービス契約番号
	 * @param	sysid		SYSID
	 * @return				マップ
	 */
	public static Map<String, Object> putAxMRenkeiDataKbn(
			IRequestParameterReadWrite param,
			String mapNm,
			String renkeiKbn,
			String trnKbn,
			String[] arg1,
			String sysid
	)
	{
		Map<String, Object> xMap = putAxMRenkeiDataKbn(param, mapNm, renkeiKbn, trnKbn, arg1);

		// 引数２: SYSID
		xMap.put(JKKAddSjishoConst.SYSID, sysid);

		return xMap;
	}


	/**
	 * 連携データ区分 07 ：回線契約に紐づく各種サービス契約の情報<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	mapNm		格納先マップの名称
	 * @param	trnKbn		処理区分
	 * @param	svc_kei_no	サービス契約番号
	 * @param	prc_grp_no	料金グループ番号
	 * @return				マップ
	 */
	public static Map<String, Object> putAxMRenkeiDataKbn07(
			IRequestParameterReadWrite param,
			String mapNm,
			String trnKbn,
			String[] svc_kei_no,
			String prc_grp_no
	)
	{
		Map<String, Object> xMap = putAxMRenkeiDataKbn(param, mapNm, JKKAddSjishoConst.RENKEI_DATA_KBN_ANY_KEI, trnKbn, svc_kei_no);

//		// 引数２: 料金グループ番号		設定不要となっている（2012-04-28）
//		xMap.put(JKKAddSjishoConst.PRC_GRP_NO, prc_grp_no);

		return xMap;
	}


	/**
	 * 連携データ区分 11 ：お客様の基本情報<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	mapNm		格納先マップの名称
	 * @param	trnKbn		処理区分
	 * @param	arg1		サービス契約番号
	 * @param	sysid		SYSID
	 * @param	updTrgt		更新対象項目
	 * @return				マップ
	 */
	public static Map<String, Object> putAxMRenkeiDataKbn11(
			IRequestParameterReadWrite param,
			String mapNm,
			String trnKbn,
			String[] arg1,
			String sysid,
			String[] updTrgt
	)
	{
		Map<String, Object> xMap = putAxMRenkeiDataKbn(param, mapNm, JKKAddSjishoConst.RENKEI_DATA_KBN_CUST_INF, trnKbn, arg1);

		// 更新対象項目をセット
		setUpdTgKmKNo(param, mapNm, updTrgt);

		// 引数２: SYSID
		xMap.put(JKKAddSjishoConst.SYSID, sysid);

		return xMap;
	}
	
	// IT1-2013-0000609 2013/04/02 ADD START
	/**
	 * 連携データ区分 08 ：支払方法入力支援の情報<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	mapNm		格納先マップの名称
	 * @param	trnKbn		処理区分
	 * @param	arg1		サービス契約番号
	 * @param	sysid		SYSID
	 * @param	updTrgt		更新対象項目
	 * @return				マップ
	 */
	public static Map<String, Object> putAxMRenkeiDataKbn08(
			IRequestParameterReadWrite param,
			String mapNm,
			String trnKbn,
			String[] arg1,
			String sysid
	)
	{
		Map<String, Object> xMap = putAxMRenkeiDataKbn(param, mapNm, JKKAddSjishoConst.RENKEI_DATA_KBN_PAYWAY, trnKbn, arg1);

		// 引数２: SYSID
		xMap.put(JKKAddSjishoConst.SYSID, sysid);

		return xMap;
	}
	// IT1-2013-0000609 2013/04/02 ADD END


	/**
	 * 制御用データマップを取得<br>
	 * <br>
	 * @param	param	リクエストパラメータ
	 * @param	mapNm	マップ名
	 * @return			マップ
	 */
	@SuppressWarnings("unchecked")
	private static Map<String, Object> getOrCreateRenkeiDataMap(IRequestParameterReadWrite param, String mapNm)
	{
		Map<String, Object> workAreaMap = null;

		try
		{
			workAreaMap = (Map<String, Object>)param.getData(mapNm);
			if (null == workAreaMap)
			{
				workAreaMap = new HashMap<String, Object>();
				param.setData(mapNm, workAreaMap);
			}
		}
		catch (RequestParameterException e)
		{
			workAreaMap = null;
		}

		return workAreaMap;
	}


	/**
	 * 制御用リストを取得<br>
	 * <br>
	 * @param	inMap	
	 * @param	listNm	
	 * @return			リスト
	 */
	@SuppressWarnings("unchecked")
	private static List<Map<String, Object>> getOrCreateList(Map<String, Object> inMap, String listNm)
	{
		List<Map<String, Object>> list = null;

		if (null != listNm)
		{
			list = (List<Map<String, Object>>)inMap.get(listNm);
			if (null == list)
			{
				list = new ArrayList<Map<String, Object>>();
				inMap.put(listNm, list);
			}
		}

		return list;
	}

	/**
	 * 
	 * @param	param
	 * @param	mapNm
	 * @param	arg1
	 */
	private static void setUpdTgKmKNo(IRequestParameterReadWrite param, String mapNm, String[] arg1)
	{
		// 
		Map<String, Object> workAreaMap = null;

		try
		{
			workAreaMap = (Map<String, Object>)param.getData(mapNm);
		}
		catch(RequestParameterException e)
		{
			return;
		}

		// 連携データ区分リスト取得
		List<Map<String, Object>> list = (List<Map<String, Object>>)workAreaMap.get(JKKAddSjishoConst.RENKEI_DATA_KBN_LIST);
		// IT1-2013-0000609 2013 ADD START
//		Map<String, Object> dataMap = list.get(0);
		Map<String, Object> dataMap = list.get(list.size() - 1);
		// IT1-2013-0000609 2013 ADD END
		
		// 更新対象項目リスト取得
		List<Map<String, Object>> updList = (List<Map<String, Object>>)dataMap.get(JKKAddSjishoConst.UPD_TG_KMK_LIST);

		for (int i = 0; i < arg1.length; i++)
		{
			Map<String, Object> workMap = new HashMap<String, Object>();

			workMap.put(JKKAddSjishoConst.UPD_TG_KMK_NO, arg1[i]);
			updList.add(workMap);
		}
	}

}
