/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0050001TPMA
*	ソースファイル名：JEKKA0050001TPMA.java
*	作成者			：FJ）藤本
*	日付			：2016年6月2日
*＜機能概要＞
*	お客様ランク情報一意照会独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v26.00.00	2016/06/02	FJ）藤本	【ANK-2687-00-00】プレミアムサポート施策
*	v26.01.00	2016/07/08	FJ）藤本	【IT1-2016-0000088】TRANKの不正な応答が正常に解析できた場合にシステムエラー
*	v64.00.00	2023/02/17	FJ）松永	【ANK-4307-00-00】【eo定期】プレミアムクラブリニューアル対応
*	   			2023/06/12	FJ）松永	【IT1-2023-0000021】TRANK側から返却されるレスポンスパラメータを修正
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
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.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg3List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg4List;
import eo.ejb.common.JZMCtrlTrankInfo;

/**
 * お客様ランク情報一意照会独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0050001TPMA implements TemplateMainHandler
{
	/** 外部インターフェイスID **/
	private static final String KKIFE333 = "KKIFE333";

	/** サービスＩＤ **/
	private static final String TASV0001 = "TASV0001";

	/** サービスインターフェースＩＤ **/
	private static final String TASV000101SC  = "TASV000101SC";

	/**
	 * お客様ランク情報一意照会を行います。
	 * 
	 * @param inCBSMsg お客様ランク情報一意照会メッセージ
	 * @param inContext AgentDispatchContext
	 */
	public static void ctrlTrankInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();

		// オペレータID
		serviceMap.put(JZMCtrlTrankInfo.OPERATORID, JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050001CBSMsg.OPERATORID)));

		// 運用日時
		serviceMap.put(JZMCtrlTrankInfo.OPERATEDATETIME, JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050001CBSMsg.OPERATEDATETIME)));
		
		// 外部インターフェイスID
		serviceMap.put(JZMCtrlTrankInfo.OUT_IF_ID, KKIFE333);

		// サービスID
		serviceMap.put(JZMCtrlTrankInfo.SERVICEID, TASV0001);

		// サービスインターフェースID
		serviceMap.put(JZMCtrlTrankInfo.SERVICEIFID, TASV000101SC);

		List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String, Object>>();
		LinkedHashMap<String, Object> serviceIf = new LinkedHashMap<String, Object>();

		// 機能コード
		serviceIf.put(JZMCtrlTrankInfo.FUNC_CODE, inCBSMsg.getString(EKKA0050001CBSMsg.FUNC_CODE));

		// SYSID
		serviceIf.put("sysid", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050001CBSMsg.KEY_SYSID)));
		// 会員種別コード
		serviceIf.put("kaiin_sbt_cd", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050001CBSMsg.KEY_KAIIN_SBT_CD)));
		// eonetID未移行フラグ
		serviceIf.put("eonetID_miiko_flg", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050001CBSMsg.KEY_EONETID_MIIKO_FLG)));
		// 予備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
		{
			// TRANK連携
			Map<String, Object> ret = instance.call_KKIFE333(serviceMap);
			// コマンド実行結果判定
			if (null != ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD))
			{
				// 結果コード"1":XML電文処理エラー発生, SOAP例外の場合
				if (ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD).equals("1"))
				{
					inCBSMsg.set(EKKA0050001CBSMsg.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(EKKA0050001CBSMsg.STATUS, StatusCodes.NORMAL_END);
						}
						// "1000":単項目チェックエラー
						else if ("1000".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1000:単項目チェックエラー）
							inCBSMsg.set(EKKA0050001CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "1100":関連チェックエラー
						else if ("1100".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1100:関連チェックエラー）
							inCBSMsg.set(EKKA0050001CBSMsg.STATUS, StatusCodes.RELATION_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "9010":システム計画停止中
						else if ("9010".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
						else
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
					}
				}
			}

			// レスポンス電文を設定　※異常が発生している場合でも空で作成する
			editOutMsg(inCBSMsg, ret);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * TRANKのレスポンス電文を設定します。
	 * <br>
	 * @param inCBSMsg お客様ランク情報一意照会メッセージ
	 * @param ret TRANKのレスポンス電文
	 */
	private static void editOutMsg(CAANMsg inCBSMsg, Map<String, Object> ret)
	{
		List<CAANMsg> msg1List = new ArrayList<CAANMsg>();
		List<CAANMsg> msg2List = new ArrayList<CAANMsg>();
		List<CAANMsg> msg3List = new ArrayList<CAANMsg>();
		List<CAANMsg> msg4List = new ArrayList<CAANMsg>();

		// 識別コード配下を取得
		List<Map<String, Object>> tasv000101sc = (List<Map<String, Object>>)ret.get(TASV000101SC);
		if (null != tasv000101sc && !tasv000101sc.isEmpty())
		{
			List<Map<String, Object>> serviceIfList = (List<Map<String, Object>>)tasv000101sc.get(0).get(JZMCtrlTrankInfo.SERVICEIF);

			if (null != serviceIfList && !serviceIfList.isEmpty())
			{
				Map<String, Object> serviceIfMap = serviceIfList.get(0);

				CAANMsg msg1 = new CAANMsg(EKKA0050001CBSMsg1List.class.getName());
				msg1.set(EKKA0050001CBSMsg1List.FUNC_CODE, (String)serviceIfMap.get("func_code"));
				msg1.set(EKKA0050001CBSMsg1List.SYSID, (String)serviceIfMap.get("sysid"));
				msg1.set(EKKA0050001CBSMsg1List.KAIIN_SBT_CD, (String)serviceIfMap.get("kaiin_sbt_cd"));
				msg1.set(EKKA0050001CBSMsg1List.EONETID_MIIKO_FLG, (String)serviceIfMap.get("eonetID_miiko_flg"));
				msg1.set(EKKA0050001CBSMsg1List.RNK_CD, (String)serviceIfMap.get("rnk_cd"));
				msg1.set(EKKA0050001CBSMsg1List.RNK_NM, (String)serviceIfMap.get("rnk_nm"));
				msg1.set(EKKA0050001CBSMsg1List.PRESUP_KISAN_DATE, (String)serviceIfMap.get("presup_kisan_date"));
				msg1.set(EKKA0050001CBSMsg1List.KEI_YEARS, (String)serviceIfMap.get("kei_years"));
				msg1.set(EKKA0050001CBSMsg1List.KEI_YEARS_STR, (String)serviceIfMap.get("kei_years_str"));
				// ANK-4307-00-00 MOD START
				// msg1.set(EKKA0050001CBSMsg1List.TIC_NUM, (String)serviceIfMap.get("tic_num"));
				msg1.set(EKKA0050001CBSMsg1List.TOTAL_PT_SU, (String)serviceIfMap.get("total_pt_su"));
				msg1.set(EKKA0050001CBSMsg1List.TOTAL_HOYU_PT_SU, (String)serviceIfMap.get("hoyu_pt_su"));
				// ANK-4307-00-00 MOD END
				msg1List.add(msg1);

				// 契約情報リスト
				List<Map<String, Object>> keiList = (List<Map<String, Object>>)serviceIfMap.get("keiList");
				if (null != keiList && !keiList.isEmpty())
				{
					List<Map<String, Object>> element = (List<Map<String, Object>>)keiList.get(0).get("element");
					for (Map<String, Object> kei : element)
					{
						CAANMsg msg2 = new CAANMsg(EKKA0050001CBSMsg2List.class.getName());
						msg2.set(EKKA0050001CBSMsg2List.SRV_KEI_NM, (String)kei.get("srv_kei_nm"));
						msg2.set(EKKA0050001CBSMsg2List.KEI_UM_FLG, (String)kei.get("kei_um_flg"));
						msg2List.add(msg2);
					}
				}

				// ANK-4307-00-00 MOD START
				// チケットリスト
//				List<Map<String, Object>> ticketList = (List<Map<String, Object>>)serviceIfMap.get("ticketList");
//				if (null != ticketList && !ticketList.isEmpty())
//				{
//					List<Map<String, Object>> element = (List<Map<String, Object>>)ticketList.get(0).get("element_1");
//					for (Map<String, Object> ticket : element)
//					{
//						CAANMsg msg3 = new CAANMsg(EKKA0050001CBSMsg3List.class.getName());
//						msg3.set(EKKA0050001CBSMsg3List.TIC_STS_CD, (String)ticket.get("tic_sts_cd"));
//						msg3.set(EKKA0050001CBSMsg3List.TIC_STS_CD_NM, (String)ticket.get("tic_sts_cd_nm"));
//						msg3.set(EKKA0050001CBSMsg3List.SISK_CD, (String)ticket.get("sisk_cd"));
//						msg3.set(EKKA0050001CBSMsg3List.SISK_NM, (String)ticket.get("sisk_nm"));
//						msg3.set(EKKA0050001CBSMsg3List.EXPIRE_DATE, (String)ticket.get("expire_date"));
//						msg3List.add(msg3);
//					}
//				}
// IT1-2023-0000021 MOD START
//				List<Map<String, Object>> pointDetailList = (List<Map<String, Object>>)serviceIfMap.get("pointDetailList");
//				if (null != pointDetailList && !pointDetailList.isEmpty())
				List<Map<String, Object>> hoyuPtList = (List<Map<String, Object>>)serviceIfMap.get("hoyuPtList");
				if (null != hoyuPtList && !hoyuPtList.isEmpty())
				{
//					List<Map<String, Object>> element = (List<Map<String, Object>>)pointDetailList.get(0).get("element_1");
//					for (Map<String, Object> ticket : element)
					List<Map<String, Object>> element = (List<Map<String, Object>>)hoyuPtList.get(0).get("element_1");
					for (Map<String, Object> hoyuPt : element)
					{
						CAANMsg msg3 = new CAANMsg(EKKA0050001CBSMsg3List.class.getName());
//						msg3.set(EKKA0050001CBSMsg3List.TEKIYO_ED_YMD, (String)ticket.get("tekiyo_ed_ymd"));
//						msg3.set(EKKA0050001CBSMsg3List.HOYU_PT_SU, (String)ticket.get("hoyu_pt_su"));
						msg3.set(EKKA0050001CBSMsg3List.TEKIYO_ED_YMD, (String)hoyuPt.get("tekiyo_ed_ymd"));
						msg3.set(EKKA0050001CBSMsg3List.HOYU_PT_SU, (String)hoyuPt.get("hoyu_pt_su"));
// IT1-2023-0000021 MOD END
						msg3List.add(msg3);
					}
				}
				// ANK-4307-00-00 MOD END
				
				// ランクアップ条件リスト
				List<Map<String, Object>> rankupList = (List<Map<String, Object>>)serviceIfMap.get("rankupList");
				if (null != rankupList && !rankupList.isEmpty())
				{
					List<Map<String, Object>> element = (List<Map<String, Object>>)rankupList.get(0).get("element_2");
					for (Map<String, Object> rankup : element)
					{
						CAANMsg msg4 = new CAANMsg(EKKA0050001CBSMsg4List.class.getName());
						msg4.set(EKKA0050001CBSMsg4List.RNKUP_TEXT, (String)rankup.get("rnkup_text"));
						msg4List.add(msg4);
					}
				}
			}
		}

		// Listから配列に変換して設定
		inCBSMsg.set(EKKA0050001CBSMsg.EKKA0050001CBSMSG1LIST, msg1List.toArray(new CAANMsg[msg1List.size()]));
		inCBSMsg.set(EKKA0050001CBSMsg.EKKA0050001CBSMSG2LIST, msg2List.toArray(new CAANMsg[msg2List.size()]));
		inCBSMsg.set(EKKA0050001CBSMsg.EKKA0050001CBSMSG3LIST, msg3List.toArray(new CAANMsg[msg3List.size()]));
		inCBSMsg.set(EKKA0050001CBSMsg.EKKA0050001CBSMSG4LIST, msg4List.toArray(new CAANMsg[msg4List.size()]));
	}

	/**
	 * TRANKからのエラー情報をお客様ランク情報一意照会メッセージにマッピングします。
	 * <br>
	 * @param inCBSMsg お客様ランク情報一意照会メッセージ
	 * @param ret TRANKのレスポンス電文
	 */
	private static void errorMapping(CAANMsg inCBSMsg, Map<String, Object> ret)
	{
		// IT1-2016-0000088 DEL START
//		// サービスIFリスト取得
//		List<Map<String, Object>> serviceIfList = (List<Map<String, Object>>)ret.get(JZMCtrlTrankInfo.SERVICEIF);
//		if (null != serviceIfList && !serviceIfList.isEmpty())
//		{
//			Map<String, Object> map = serviceIfList.get(0);
//			// 単項目チェックエラー発生項目設定
//			// E1:必須チェック
//			// E2:属性チェック
//			// E3:桁数チェック
//			Object[][] contents = new EKKA0050001CBSMsg().getContents();
//			for (int i = 0; null != contents && i < contents.length ; i++)
//			{
//				String itemNm = (String)contents[i][0];
//				if (itemNm.endsWith("_err"))
//				{
//					String errCd = (String)map.get(itemNm);
//					if (!JKKStringUtil.isNullBlank(errCd))
//					{
//						inCBSMsg.set(itemNm, errCd);
//					}
//				}
//			}
//		}
		// IT1-2016-0000088 DEL END
		// IT1-2016-0000088 ADD START
		// 識別コード配下を取得
		List<Map<String, Object>> tasv000101sc = (List<Map<String, Object>>)ret.get(TASV000101SC);
		if (null != tasv000101sc && !tasv000101sc.isEmpty())
		{
			List<Map<String, Object>> serviceIfList = (List<Map<String, Object>>)tasv000101sc.get(0).get(JZMCtrlTrankInfo.SERVICEIF);

			if (null != serviceIfList && !serviceIfList.isEmpty())
			{
				Map<String, Object> serviceIfMap = serviceIfList.get(0);
				// SYSIDエラー
				String sysidErr = (String)serviceIfMap.get("sysid_err");
				if (!JKKStringUtil.isNullBlank(sysidErr))
				{
					inCBSMsg.set(EKKA0050001CBSMsg.KEY_SYSID_ERR, sysidErr);
				}
				// 会員種別コードエラー
				String kaiinSbtCdErr = (String)serviceIfMap.get("kaiin_sbt_cd_err");
				if (!JKKStringUtil.isNullBlank(kaiinSbtCdErr))
				{
					inCBSMsg.set(EKKA0050001CBSMsg.KEY_KAIIN_SBT_CD_ERR, kaiinSbtCdErr);
				}
				// eonetID未移行フラグエラー
				String eonetIDMiikoFlgErr = (String)serviceIfMap.get("eonetID_miiko_flg_err");
				if (!JKKStringUtil.isNullBlank(eonetIDMiikoFlgErr))
				{
					inCBSMsg.set(EKKA0050001CBSMsg.KEY_EONETID_MIIKO_FLG_ERR, eonetIDMiikoFlgErr);
				}
			}
		}
		// IT1-2016-0000088 ADD END
	}
}
