/*******************************************************************************
* All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0050002TPMA
*	ソースファイル名：JEKKA0050002TPMA.java
*	作成者			：
*   日付            ：2015年05月25日
*＜機能概要＞
*	チケット利用申請依頼独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v26.00.00   2016/06/06  FJ) 張本    【ANK-2687-00-00】プレミアムサポート施策
*	v26.00.01	2016/07/14	FJ）張本	【IT1-2016-0000095】外部IF KKIFE334 項目名間違い
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.ejb.cbs.cbsmsg.EKKA0050002CBSMsg;
import eo.ejb.common.JZMCtrlTrankInfo;

/**
 * チケット利用申請依頼独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0050002TPMA implements TemplateMainHandler
{

	/** 外部インターフェイスID **/
	private static final String KKIFE334 = "KKIFE334";

	/** サービスＩＤ **/
	private static final String TASV0003 = "TASV0003";

	/** サービスインターフェースＩＤ **/
	private static final String TASV000301SC = "TASV000301SC";

	/** SYSID**/
	private static final String SYSID = "sysid";

	/** サービス契約番号**/
	private static final String SVC_KEI_NO = "svc_kei_no";

	/** 施策コード */
	private static final String SISK_CD = "sisk_cd";

	/** キャンペーン登録契機コード */
	private static final String CP_ADD_KEIKI_CD = "cp_add_keiki_cd";

	/**キャンペーン登録契機対象キー1 */
	private static final String CP_ADD_KEIKI_KEY_1 = "cp_add_keiki_key_1";

	/**キャンペーン登録契機対象キー2 */
	private static final String CP_ADD_KEIKI_KEY_2 = "cp_add_keiki_key_2";

	/**キャンペーン登録契機対象キー3 */
	private static final String CP_ADD_KEIKI_KEY_3 = "cp_add_keiki_key_3";

	/**キャンペーン登録契機対象キー4 */
	private static final String CP_ADD_KEIKI_KEY_4 = "cp_add_keiki_key_4";

	/**キャンペーン登録契機対象キー5 */
	private static final String CP_ADD_KEIKI_KEY_5 = "cp_add_keiki_key_5";

	/**予備1 */
	private static final String YOBI_1 = "yobi_1";

	/**予備2 */
	private static final String YOBI_2 = "yobi_2";

	/**予備3 */
	private static final String YOBI_3 = "yobi_3";

	/**予備4 */
	private static final String YOBI_4 = "yobi_4";

	/**予備5 */
	private static final String YOBI_5 = "yobi_5";

	/**
	 * チケット利用申請依頼を行います。
	 * 
	 * @param inCBSMsg チケット利用申請依頼メッセージ
	 * @param inContext AgentDispatchContext
	 */
	@SuppressWarnings("unchecked")
	public static void ctrlTrankInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		Hashtable<String, Object> serviceMap = new Hashtable<String, Object>();

		// オペレータ_ID
		String operatorId = inCBSMsg.getString(EKKA0050002CBSMsg.OPERATORID);
		if (operatorId != null)
		{
			serviceMap.put(EKKA0050002CBSMsg.OPERATORID, operatorId);
		}
		else
		{
			serviceMap.put(EKKA0050002CBSMsg.OPERATORID, "");
		}

		// 運用日時
		String operatoDateTime = inCBSMsg.getString(EKKA0050002CBSMsg.OPERATEDATETIME);
		if (operatoDateTime != null)
		{
			serviceMap.put(EKKA0050002CBSMsg.OPERATEDATETIME, operatoDateTime);
		}
		else
		{
			serviceMap.put(EKKA0050002CBSMsg.OPERATEDATETIME, "");
		}

		// 外部インターフェイスID
		serviceMap.put(JZMCtrlTrankInfo.OUT_IF_ID, KKIFE334);

		// サービスＩＤ
		serviceMap.put(JZMCtrlTrankInfo.SERVICEID, TASV0003);

		// サービスインターフェースＩＤ
		serviceMap.put(JZMCtrlTrankInfo.SERVICEIFID, TASV000301SC);

		List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String, Object>>();
		LinkedHashMap<String, Object> serviceIf = new LinkedHashMap<String, Object>();

		// 機能コード
		serviceIf.put(JZMCtrlTrankInfo.FUNC_CODE, "1");

		// SYSID
		if (inCBSMsg.getString(EKKA0050002CBSMsg.SYSID) != null)
		{
			serviceIf.put(SYSID, inCBSMsg.getString(EKKA0050002CBSMsg.SYSID));
		}
		else
		{
			serviceIf.put(SYSID, "");
		}
		// サービス契約番号
		if (inCBSMsg.getString(EKKA0050002CBSMsg.SVC_KEI_NO) != null)
		{
			serviceIf.put(SVC_KEI_NO, inCBSMsg.getString(EKKA0050002CBSMsg.SVC_KEI_NO));
		}
		else
		{
			serviceIf.put(SVC_KEI_NO, "");
		}
		// 施策コード
		if (inCBSMsg.getString(EKKA0050002CBSMsg.SISK_CD) != null)
		{
			serviceIf.put(SISK_CD, inCBSMsg.getString(EKKA0050002CBSMsg.SISK_CD));
		}
		else
		{
			serviceIf.put(SISK_CD, "");
		}
		// キャンペーン登録契機コード
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_CD) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_CD, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_CD));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_CD, "");
		}
		// キャンペーン登録契機対象キー1
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_1) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_1, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_1));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_1, "");
		}
		// キャンペーン登録契機対象キー2
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_2) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_2, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_2));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_2, "");
		}
		// キャンペーン登録契機対象キー3
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_3) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_3, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_3));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_3, "");
		}
		// キャンペーン登録契機対象キー4
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_4) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_4, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_4));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_4, "");
		}
		// キャンペーン登録契機対象キー5
		if (inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_5) != null)
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_5, inCBSMsg.getString(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_5));
		}
		else
		{
			serviceIf.put(CP_ADD_KEIKI_KEY_5, "");
		}

		// 予備1
		serviceIf.put(YOBI_1, "");
		// 予備2
		serviceIf.put(YOBI_2, "");
		// 予備3
		serviceIf.put(YOBI_3, "");
		// 予備4
		serviceIf.put(YOBI_4, "");
		// 予備5
		serviceIf.put(YOBI_5, "");

		list.add(serviceIf);
		serviceMap.put(JZMCtrlTrankInfo.SERVICEIF, list);

		// コマンド発行部品のスタブ用、
		JZMCtrlTrankInfo instance = JZMCtrlTrankInfo.getInstance();

		try
		{
			// CIS連携
			Map ret = instance.call_KKIFE334(serviceMap);

			// コマンド実行結果判定
			if (null != ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD))
			{
				// 結果コード"1":XML電文処理エラー発生, SOAP例外の場合
				if (ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD).equals("1"))
				{
					inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
				}
				else if (ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD).equals("0"))
				{
					// リターンコードを判定しステータスをセットする。
					if (null != ret.get(JZMCtrlTrankInfo.RETURN_CD))
					{
						// "0000":正常
						if ("0000".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス(0:正常終了)セットする。
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.NORMAL_END);
						}
						// "1000":単項目チェックエラー
						else if ("1000".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1000:単項目チェックエラー）
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "1100":関連チェックエラー
						else if ("1100".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1100:関連チェックエラー）
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.RELATION_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "1150":状態チェック遷移エラー
						else if ("1150".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1150:状態チェック遷移エラー）
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "9010":システム計画停止中
						else if ("9010".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
						else
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050002CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
						// API結果コード
						inCBSMsg.set(EKKA0050002CBSMsg.API_RSLT_CD, ret.get(JZMCtrlTrankInfo.RETURN_CD));
					}

				}
			}

		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
		}
	}

	/**
	 * TRANKからのエラー情報をチケット利用申請依頼メッセージにマッピングします。
	 * <br>
	 * @param inCBSMsg チケット利用申請依頼メッセージ
	 * @param ret TRANKのレスポンス電文
	 */
	private static void errorMapping(CAANMsg inCBSMsg, Map<String, Object> ret)
	{
		// 識別コード配下を取得
		List<Map<String, Object>> tasv000301sc = (List<Map<String, Object>>)ret.get(TASV000301SC);
		if (null != tasv000301sc && !tasv000301sc.isEmpty())
		{
			// サービスＩＦリスト取得
			List<Map<String, Object>> serviceIfList = null;
			serviceIfList = (List<Map<String, Object>>)tasv000301sc.get(0).get(JZMCtrlTrankInfo.SERVICEIF);

			if (serviceIfList != null && !serviceIfList.isEmpty())
			{

				Map<String, Object> map = serviceIfList.get(0);

				// 単項目チェックエラー発生項目設定
				// E1:必須チェック
				// E2:属性チェック
				// E3:桁数チェック								
				if (map.get(EKKA0050002CBSMsg.SYSID_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.SYSID_ERR, (String)map.get(EKKA0050002CBSMsg.SYSID_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.SVC_KEI_NO_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.SVC_KEI_NO_ERR, (String)map.get(EKKA0050002CBSMsg.SVC_KEI_NO_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.SISK_CD_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.SISK_CD_ERR, (String)map.get(EKKA0050002CBSMsg.SISK_CD_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_CD_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_CD_ERR, (String)map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_CD_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_1_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_1_ERR, (String)map
							.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_1_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_2_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_2_ERR, (String)map
							.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_2_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_3_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_3_ERR, (String)map
							.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_3_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_4_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_4_ERR, (String)map
							.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_4_ERR));
				}
				if (map.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_5_ERR) != null)
				{
					inCBSMsg.set(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_5_ERR, (String)map
							.get(EKKA0050002CBSMsg.CP_ADD_KEIKI_KEY_5_ERR));
				}
			}
		}
		
	}
}
