/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0080001TPMA
*	ソースファイル名：JEKKA0080001TPMA.java
*	作成者			：FJ)荒木
*	日付			：2020年6月08日
*＜機能概要＞
*	定額サービス契約情報一意照会独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v49.00.00	2020/06/08	FJ)荒木		【ANK-3840-00-00】テレビリースサービス新規申込対応　新規作成
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.HashMap;
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.EKKA0080001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0080001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0080001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0080001CBSMsg3List;
import gyomu.JKKcommonApiKKA0080001;


/**
 * 定額サービス契約情報一意照会依頼独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0080001TPMA implements TemplateMainHandler
{	
	/** eo顧客API呼出エラー **/
	private static final int NO_CALLABLE_EO_API_ERR = 5001;
	
	/**
	 * 定額サービス契約情報一意照会依頼を行います。
	 * 
	 * @param inCBSMsg 定額サービス契約情報一意照会依頼メッセージ
	 * @param inContext AgentDispatchContext
	 */
	@SuppressWarnings("unchecked")
	public static void call_KKIFE440(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();

		// 機能コード
		serviceMap.put("funcCode", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0080001CBSMsg.KEY_FUNC_CODE)));
		// 契約種別コード
		serviceMap.put("kykSbtCd", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0080001CBSMsg.KEY_KYK_SBT_CD)));
		// SYSID
		serviceMap.put("sysid", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0080001CBSMsg.KEY_SYSID)));

		// コマンド発行部品のインスタンスを取得
		JKKcommonApiKKA0080001 instance = new JKKcommonApiKKA0080001();

		try
		{
			// 共通API連携
			Map<String, Object> resServiceMap = instance.callApiKKA0080001(serviceMap);
			
			if(resServiceMap == null)
			{
				resServiceMap = new HashMap<String, Object>();
			}
			// 共通API連携実行結果判定
			// 処理結果コード"000":正常終了の場合
			if (resServiceMap.get("resultCode").equals("000"))
			{
				// ステータス設定（0:正常終了）
				inCBSMsg.set(EKKA0080001CBSMsg.STATUS, StatusCodes.NORMAL_END);
			}
			// 処理結果コード"500":業務エラーの場合
			else if (resServiceMap.get("resultCode").equals("500"))
			{
				List<Object> errList = (List<Object>)resServiceMap.get("gyomuErrorList");
				int starusNo = 0;
				int noExpValFlag = 0;
				for (int i = 0; i < errList.size(); i++)
				{
					// エラーリスト
					Map<String, Object> map = (Map<String, Object>)errList.get(i);
					String errorCode = (String)map.get("errCode");
					
					if(JKKStringUtil.isNullBlank(errorCode))
					{
						noExpValFlag = 1;
					}
					else
					{
						noExpValFlag = isExpectedValue(errorCode, noExpValFlag);
						int errorCodeNo = Integer.parseInt(errorCode);
						if(starusNo < errorCodeNo)
						{
							starusNo = errorCodeNo;
						}
					}
					
				}
				String errorCode = String.valueOf(starusNo);
				if(noExpValFlag == 0)
				{
					if ("1000".equals(errorCode))
					{
						// "1000":単項目チェックエラー
						inCBSMsg.set(EKKA0080001CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
					}
					else if ("5001".equals(errorCode))
					{
						// "5001":eo顧客API呼出エラー
						inCBSMsg.set(EKKA0080001CBSMsg.STATUS, NO_CALLABLE_EO_API_ERR);
					}
				}
				else
				{
					// ステータス設定（6000:外部IFでエラー発生１）
					inCBSMsg.set(EKKA0080001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
				}
				
			}
			// 処理結果コード"000""500"以外の場合
			else
			{
				// ステータス設定（6000:外部IFでエラー発生１）
				inCBSMsg.set(EKKA0080001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
			}
			
			// レスポンス電文を設定　※異常が発生している場合でも空で作成する
			editOutMsg(inCBSMsg, resServiceMap);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * 共通APIのレスポンス電文を設定します。
	 * <br>
	 * @param inCBSMsg 定額サービス契約情報一意照会依頼メッセージ
	 * @param resServiceMap レスポンスサービスマップ
	 */
	@SuppressWarnings("unchecked")
	private static void editOutMsg(CAANMsg inCBSMsg, Map<String, Object> resServiceMap)
	{
		List<CAANMsg> msg1List = new ArrayList<CAANMsg>();
		List<CAANMsg> msg2List = new ArrayList<CAANMsg>();
		List<CAANMsg> msg3List = new ArrayList<CAANMsg>();
		
		// 処理結果
		String resultCode = (String)resServiceMap.get("resultCode");
		// 処理結果詳細コード
		String resultDetailCode = (String)resServiceMap.get("resultDetailCode");
		// 業務エラーリスト
		List<Object> errList = (List<Object>)resServiceMap.get("gyomuErrorList");
		// 業務データ
		Map<String, Object> body = (Map<String, Object>)resServiceMap.get("body");
		
		CAANMsg msg1 = new CAANMsg(EKKA0080001CBSMsg1List.class.getName());
		msg1.set(EKKA0080001CBSMsg1List.FUNC_CODE, JKKStringUtil.nullToBlank((String)body.get("funcCode")));
		msg1.set(EKKA0080001CBSMsg1List.KYK_SBT_CD, JKKStringUtil.nullToBlank((String)body.get("kykSbtCd")));
		msg1.set(EKKA0080001CBSMsg1List.SYSID, JKKStringUtil.nullToBlank((String)body.get("sysid")));
		msg1.set(EKKA0080001CBSMsg1List.KYK_CHU_FLG, JKKStringUtil.nullToBlank((String)body.get("kykChuFlg")));
		msg1List.add(msg1);
		
		CAANMsg msg2 = new CAANMsg(EKKA0080001CBSMsg2List.class.getName());
		msg2.set(EKKA0080001CBSMsg2List.RSLT_CD, resultCode);
		msg2.set(EKKA0080001CBSMsg2List.RSLT_DTL_CD, resultDetailCode);
		msg2List.add(msg2);
		
		for (int i = 0; i < errList.size(); i++)
		{
			CAANMsg msg3 = new CAANMsg(EKKA0080001CBSMsg3List.class.getName());
			Map<String, Object> map = (Map<String, Object>)errList.get(i);
			if(map == null)
			{
				map = new HashMap<String, Object>();
			}
			String err_cd = JKKStringUtil.nullToBlank((String)map.get("errCode"));
			String err_msg = JKKStringUtil.nullToBlank((String)map.get("errMessage"));
			msg3.set(EKKA0080001CBSMsg3List.ERR_CD, err_cd);
			msg3.set(EKKA0080001CBSMsg3List.ERR_MSG, err_msg);
			msg3List.add(msg3);
		}
		
		// Listから配列に変換して設定
		inCBSMsg.set(EKKA0080001CBSMsg.EKKA0080001CBSMSG1LIST, msg1List.toArray(new CAANMsg[msg1List.size()]));
		inCBSMsg.set(EKKA0080001CBSMsg.EKKA0080001CBSMSG2LIST, msg2List.toArray(new CAANMsg[msg2List.size()]));
		inCBSMsg.set(EKKA0080001CBSMsg.EKKA0080001CBSMSG3LIST, msg3List.toArray(new CAANMsg[msg3List.size()]));
	}
	
	/**
	 * エラーコードが期待値であるかを判定します。
	 * <br>
	 * @param errorCode エラーコード
	 * @param noExpValFlag 期待値フラグ
	 */
	private static int isExpectedValue(String errorCode,int noExpValFlag){
	
		if(!("1000".equals(errorCode) || "5001".equals(errorCode)))
		{
			noExpValFlag = 1;
		}
		return noExpValFlag;
	}

}
