/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0050003TPMA
*	ソースファイル名：JEKKA0050003TPMA.java
*	作成者			：FJ)柳
*	日付			：2017年11月21日
*＜機能概要＞
*	チケット申請履歴一覧照会独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v35.00.00	2017/11/21	FJ)柳		【ANK-3336-01-00】GH端末申込画面のチケット利用メニュー表示制御対応
*	v68.00.00	2023/12/21	FJ)藤本涼 	【#83654】eoメッシュWifiの12回割引のレスポンス不正
********************************************************************************/
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.EKKA0050003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0050003CBSMsg1List;
import eo.ejb.common.JZMCtrlTrankInfo;

/**
 * チケット申請履歴一覧照会独自処理部品です。
 * <br>
 * @author FJ)柳
 */
public class JEKKA0050003TPMA implements TemplateMainHandler
{
	/** 外部インターフェイスＩＤ **/
	private static final String FUIFE161 = "FUIFE161";
	
	/** サービスＩＤ **/
	private static final String TASV0004 = "TASV0004";
	
	/** サービスインターフェースＩＤ **/
	private static final String TASV000401SC  = "TASV000401SC";
	
	/**
	 * チケット申請履歴一覧照会を行います。
	 * 
	 * @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(EKKA0050003CBSMsg.OPERATORID)));
		
		// 運用日時
		serviceMap.put(JZMCtrlTrankInfo.OPERATEDATETIME, JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050003CBSMsg.OPERATEDATETIME)));
		
		// 外部インターフェイスID
		serviceMap.put(JZMCtrlTrankInfo.OUT_IF_ID, FUIFE161);
		
		// サービスID
		serviceMap.put(JZMCtrlTrankInfo.SERVICEID, TASV0004);
		
		// サービスインターフェースID
		serviceMap.put(JZMCtrlTrankInfo.SERVICEIFID, TASV000401SC);
		
		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(EKKA0050003CBSMsg.FUNC_CODE));
		// SYSID
		serviceIf.put("sysid", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050003CBSMsg.KEY_SYSID)));
		// 利用年
		serviceIf.put("use_year", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0050003CBSMsg.KEY_USE_YEAR)));
		// 予備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_FUIFE161(serviceMap);
			
			// コマンド実行結果判定
			if (null != ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD))
			{
				// 結果コード"1":XML電文処理エラー発生, SOAP例外の場合
				if (ret.get(JZMCtrlTrankInfo.CMD_RESULT_CD).equals("1"))
				{
					inCBSMsg.set(EKKA0050003CBSMsg.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(EKKA0050003CBSMsg.STATUS, StatusCodes.NORMAL_END);
						}
						// "1000":単項目チェックエラー
						else if ("1000".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1000:単項目チェックエラー）
							inCBSMsg.set(EKKA0050003CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "1100":関連チェックエラー
						else if ("1100".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（1100:関連チェックエラー）
							inCBSMsg.set(EKKA0050003CBSMsg.STATUS, StatusCodes.RELATION_ERR);
							// エラー情報のマッピング
							errorMapping(inCBSMsg, ret);
						}
						// "9010":システム計画停止中
						else if ("9010".equals((String)ret.get(JZMCtrlTrankInfo.RETURN_CD)))
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050003CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
						else
						{
							// ステータス設定（6000:外部IFでエラー発生１）
							inCBSMsg.set(EKKA0050003CBSMsg.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<Map<String, Object>> tasv000401sc = (List<Map<String, Object>>)ret.get(TASV000401SC);
		
		if (null != tasv000401sc && !tasv000401sc.isEmpty())
		{
			List<Map<String, Object>> serviceIfList = (List<Map<String, Object>>)tasv000401sc.get(0).get(JZMCtrlTrankInfo.SERVICEIF);
			
			if (null != serviceIfList && !serviceIfList.isEmpty())
			{
				Map<String, Object> serviceIfMap = serviceIfList.get(0);
				
				// チケット申請履歴一覧
				List<Map<String, Object>> sinsList = (List<Map<String, Object>>)serviceIfMap.get("sinsList");
				
				if (null != sinsList && !sinsList.isEmpty())
				{
					List<Map<String, Object>> element = (List<Map<String, Object>>)sinsList.get(0).get("element");
					
					for (Map<String, Object> sins : element)
					{
						CAANMsg msg1 = new CAANMsg(EKKA0050003CBSMsg1List.class.getName());
						
// ANK-4307-00-00（v66.00.00） ADD START
						msg1.set(EKKA0050003CBSMsg1List.SVC_KEI_NO, (String)sins.get("svc_kei_no"));
						msg1.set(EKKA0050003CBSMsg1List.SISK_CD, (String)sins.get("sisk_cd"));
						msg1.set(EKKA0050003CBSMsg1List.SISK_STS_CD, (String)sins.get("sisk_sts_cd"));
						msg1.set(EKKA0050003CBSMsg1List.SHORI_YMD, (String)sins.get("shori_ymd"));
// ANK-4307-00-00（v66.00.00） ADD END
// ANK-4307-00-00（v66.00.00） DEL START
//						msg1.set(EKKA0050003CBSMsg1List.SISK_SINS_EDA_NO, (String)sins.get("sisk_sins_eda_no"));
//						msg1.set(EKKA0050003CBSMsg1List.SVC_KEI_NO, (String)sins.get("svc_kei_no"));
//						msg1.set(EKKA0050003CBSMsg1List.SISK_CD, (String)sins.get("sisk_cd"));
//						msg1.set(EKKA0050003CBSMsg1List.SISK_NM, (String)sins.get("sisk_nm"));
						// #83654 MOD START
						msg1.set(EKKA0050003CBSMsg1List.NOTE_1, (String)sins.get("note_1"));
						// #83654 MOD END
//						msg1.set(EKKA0050003CBSMsg1List.NOTE_2, (String)sins.get("note_2"));
//						msg1.set(EKKA0050003CBSMsg1List.NOTE_3, (String)sins.get("note_3"));
//						msg1.set(EKKA0050003CBSMsg1List.USE_TIC_NUM, (String)sins.get("use_tic_num"));
//						msg1.set(EKKA0050003CBSMsg1List.SISK_STS_CD, (String)sins.get("sisk_sts_cd"));
//						msg1.set(EKKA0050003CBSMsg1List.SISK_STS_NM, (String)sins.get("sisk_sts_nm"));
//						msg1.set(EKKA0050003CBSMsg1List.SHORI_YMD, (String)sins.get("shori_ymd"));
//						msg1.set(EKKA0050003CBSMsg1List.SHORI_YMD_HMS, (String)sins.get("shori_ymd_hms"));
//						msg1.set(EKKA0050003CBSMsg1List.UPD_USER_NM, (String)sins.get("upd_user_nm"));
// ANK-4307-00-00（v66.00.00） DEL END
						msg1List.add(msg1);
					}
				}
			}
		}
		
		// Listから配列に変換して設定
		inCBSMsg.set(EKKA0050003CBSMsg.EKKA0050003CBSMSG1LIST, msg1List.toArray(new CAANMsg[msg1List.size()]));
	}
	
	/**
	 * TRANKからのエラー情報をお客様ランク情報一意照会メッセージにマッピングします。
	 * <br>
	 * @param inCBSMsg お客様ランク情報一意照会メッセージ
	 * @param ret TRANKのレスポンス電文
	 */
	private static void errorMapping(CAANMsg inCBSMsg, Map<String, Object> ret)
	{
		// 識別コード配下を取得
		List<Map<String, Object>> tasv000401sc = (List<Map<String, Object>>)ret.get(TASV000401SC);
		if (null != tasv000401sc && !tasv000401sc.isEmpty())
		{
			List<Map<String, Object>> serviceIfList = (List<Map<String, Object>>)tasv000401sc.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(EKKA0050003CBSMsg.KEY_SYSID_ERR, sysidErr);
				}
				
				// 利用年エラー
				String useYearErr = (String)serviceIfMap.get("use_year_err");
				
				if (!JKKStringUtil.isNullBlank(useYearErr))
				{
					inCBSMsg.set(EKKA0050003CBSMsg.KEY_USE_YEAR_ERR, useYearErr);
				}
			}
		}
	}
}
