/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0070002TPMA
*	ソースファイル名：JEKKA0070002TPMA.java
*	作成者			：FJ）吉田
*	日付			：2018年12月25日
*＜機能概要＞
*	登録済み割引情報照会独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v40.00.00	2018/12/25	FJ）吉田	【ANK-3521-00-00】セット割参照機能の追加
*	v57.00.00	2022/01/24	FJ) 南		【ANK-4195-00-00】eo光ネット×mineoセット割施策開始対応
********************************************************************************/
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.EKKA0070002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0070002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0070002CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0070002CBSMsg3List;
import eo.ejb.common.JCCModelCommon;
import gyomu.JKKcommonApiKKA0070002;


/**
 * 登録済み割引情報照会独自処理部品です。
 * <br>
 * @author FJ
 *
 */
public class JEKKA0070002TPMA implements TemplateMainHandler
{	

	/**
	 * 登録済み割引情報照会を行います。
	 * 
	 * @param inCBSMsg 登録済み割引情報照会メッセージ
	 * @param inContext AgentDispatchContext
	 */
	@SuppressWarnings("unchecked")
	public static void call_sdm00002(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();

		//依頼元区分
		serviceMap.put("channel", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0070002CBSMsg.CHANNEL)));
		//リクエストID
		serviceMap.put("requestID", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0070002CBSMsg.REQUESTID)));
		//運用日時
		serviceMap.put("operateDateTime", JCCModelCommon.getOpeDateTimeStamp(inCBSMsg, inContext, null));
		//サービス契約番号
		serviceMap.put("serviceNum", JKKStringUtil.nullToBlank(inCBSMsg.getString(EKKA0070002CBSMsg.SVC_KEI_NO)));

		// コマンド発行部品のインスタンスを取得
		JKKcommonApiKKA0070002 instance = new JKKcommonApiKKA0070002();

		try
		{
			// 共通API連携
			Map<String, Object> resServiceMap = instance.callApiKKA0070002(serviceMap);
			
			if(resServiceMap == null)
			{
				resServiceMap = new HashMap<String, Object>();
			}
			// 共通API連携実行結果判定
			// 処理結果コード"000":正常終了の場合
			if (resServiceMap.get("resultCode").equals("000"))
			{
				// ステータス設定（0:正常終了）
				inCBSMsg.set(EKKA0070002CBSMsg.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("errorCode");
					
					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(EKKA0070002CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
					}
					else if ("3000".equals(errorCode))
					{
					// "1100":関連チェックエラー
					inCBSMsg.set(EKKA0070002CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					}
				}
				else
				{
					// ステータス設定（6000:外部IFでエラー発生１）
					inCBSMsg.set(EKKA0070002CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
				}
				
			}
			// 処理結果コード"000""500"以外の場合
			else
			{
				// ステータス設定（6000:外部IFでエラー発生１）
				inCBSMsg.set(EKKA0070002CBSMsg.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");
		// 割引リスト
		List<Map<String, Object>> discountList = (ArrayList<Map<String, Object>>)body.get("discountList");
		if(discountList == null)
		{
			discountList = new ArrayList<Map<String, Object>>();
		}
		
		CAANMsg msg1 = new CAANMsg(EKKA0070002CBSMsg1List.class.getName());
		msg1.set(EKKA0070002CBSMsg1List.REQUESTID_OUT, JKKStringUtil.nullToBlank((String)body.get("requestID")));
		msg1.set(EKKA0070002CBSMsg1List.OPE_DATE_TIME_OUT, JKKStringUtil.nullToBlank((String)body.get("operateDateTime")));
		msg1.set(EKKA0070002CBSMsg1List.SVC_KEI_NO_OUT, JKKStringUtil.nullToBlank((String)body.get("serviceNum")));
		msg1.set(EKKA0070002CBSMsg1List.RSLT_CD, resultCode);
		msg1.set(EKKA0070002CBSMsg1List.RSLT_DTL_CD, resultDetailCode);
		msg1List.add(msg1);
		
		// 割引リスト作成
		// ANK-4195-00-00 ADD START
		// 登録日の降順に並び替え
		discountList = sortList(discountList);
		// ANK-4195-00-00 ADD END
		for (int i = 0; i < discountList.size(); i++)
		{
			CAANMsg msg2 = new CAANMsg(EKKA0070002CBSMsg2List.class.getName());
			//データリスト
			Map<String, Object> map = (Map<String, Object>)discountList.get(i);
			if(map == null)
			{
				map = new HashMap<String, Object>();
			}
			
			msg2.set(EKKA0070002CBSMsg2List.CAMPAIGN_CD, JKKStringUtil.nullToBlank((String)map.get("campaignCode")));
			msg2.set(EKKA0070002CBSMsg2List.RELEVANT_SERVICE_NUM, JKKStringUtil.nullToBlank((String)map.get("relevantServiceNum")));
			msg2.set(EKKA0070002CBSMsg2List.ENTRY_DATE, JKKStringUtil.nullToBlank((String)map.get("entryDate")));
			msg2.set(EKKA0070002CBSMsg2List.CNG_KBN, JKKStringUtil.nullToBlank((String)map.get("changeClassification")));
			// ANK-4195-00-00 ADD START
			msg2.set(EKKA0070002CBSMsg2List.STATUS, JKKStringUtil.nullToBlank((String)map.get("status")));
			msg2.set(EKKA0070002CBSMsg2List.WRIB_STAYMD, JKKStringUtil.nullToBlank((String)map.get("discountStartDate")));
			msg2.set(EKKA0070002CBSMsg2List.WRIB_ENDYMD, JKKStringUtil.nullToBlank((String)map.get("discountEndDate")));
			msg2.set(EKKA0070002CBSMsg2List.APPLY_METHOD, JKKStringUtil.nullToBlank((String)map.get("applyMethod")));
			// ANK-4195-00-00 ADD END
			msg2List.add(msg2);
		}
		
		for (int i = 0; i < errList.size(); i++)
		{
			CAANMsg msg3 = new CAANMsg(EKKA0070002CBSMsg3List.class.getName());
			Map<String, Object> map = (Map<String, Object>)errList.get(i);
			if(map == null)
			{
				map = new HashMap<String, Object>();
			}
			
			msg3.set(EKKA0070002CBSMsg3List.ERR_CD, JKKStringUtil.nullToBlank((String)map.get("errCode")));
			msg3.set(EKKA0070002CBSMsg3List.ERR_MSG, JKKStringUtil.nullToBlank((String)map.get("errMessage")));
			msg3List.add(msg3);
		}
		
		// Listから配列に変換して設定
		inCBSMsg.set(EKKA0070002CBSMsg.EKKA0070002CBSMSG1LIST, msg1List.toArray(new CAANMsg[msg1List.size()]));
		inCBSMsg.set(EKKA0070002CBSMsg.EKKA0070002CBSMSG2LIST, msg2List.toArray(new CAANMsg[msg2List.size()]));
		inCBSMsg.set(EKKA0070002CBSMsg.EKKA0070002CBSMSG3LIST, msg3List.toArray(new CAANMsg[msg3List.size()]));
	}
	
	/**
	 * エラーコードが期待値であるかを判定します。
	 * <br>
	 * @param errorCode エラーコード
	 * @param noExpValFlag 期待値フラグ
	 */
	private static int isExpectedValue(String errorCode,int noExpValFlag){
	
		if(!("1000".equals(errorCode) ||"3000".equals(errorCode)))
		{
			noExpValFlag = 1;
		}
		return noExpValFlag;
	}
	
	// ANK-4195-00-00 ADD START
	/**
	 * ArrayListをソートします。
	 * @param  ArrayList：リスト
	 * @return ArrayList：リスト
	 */
	@SuppressWarnings("unchecked")
	private static List<Map<String, Object>> sortList(List<Map<String, Object>> discountList)
	{
		// 内部使用変数の定義
		HashMap wBeforeList = new HashMap();
		HashMap wAfterList = new HashMap();
		String wBeforeKey = "";
		String wAfterKey = "";
		String wMaxEntryDate = "XXXXXXXX";
		
		// ソート
		for(int i = 0; i < discountList.size() - 1; i++)
		{
			for(int j = i + 1; j < discountList.size(); j++)
			{
				// ArrayListからHashMapを取り出す
				wBeforeList = (HashMap)discountList.get(i);
				wAfterList = (HashMap)discountList.get(j);
				
				// ソート対象項目を結合
				wBeforeKey = (String)wBeforeList.get("entryDate");
				if (wBeforeKey == "")
				{
					wBeforeKey =  wMaxEntryDate;
				}
				
				wAfterKey = (String)wAfterList.get("entryDate");
				if (wAfterKey == "")
				{
					wAfterKey =  wMaxEntryDate;
				}
				
				if (wBeforeKey.compareTo(wAfterKey) < 0)			// wBeforeKey < wAfterKey ⇒ 降順に並び替え
				{
					// 項目入れ替え
					discountList.set(i, wAfterList);
					discountList.set(j, wBeforeList);
				}
			}
		}
		return discountList;
	}
	// ANK-4195-00-00 ADD END
}
