/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKKA0030001TPMA
*	ソースファイル名：JEKKA0030001TPMA.java
*	作成者			：
*	日付			：2015年6月2日
*＜機能概要＞
*	供給地点特定番号（SYSID）取得独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v16.00.00	2015/06/02	FJ)酒井		【ANK-2480-00-00】対応
********************************************************************************/
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.ejb.cbs.cbsmsg.ECKA9030001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECKA9030001CBSMsg1List;
import eo.ejb.common.JCKCtrlCisInfo;

public class JECKA9030001TPMA implements TemplateMainHandler {
	
	/** 外部インターフェイスID **/
	private static final String KKIFE264 = "KKIFE264";
	
	/** サービスＩＤ **/
	private static final String KKSV0815 = "KKSV0815";
	
	/** サービスインターフェースＩＤ **/
	private static final String KKSV081501SC  = "KKSV081501SC";
	
	/** 供給地点特定番号**/
	private static String KYKYCHTN_TKT_NO = "kykychtn_tkt_no";
	
	/** サービス契約番号 **/
	private static String SVC_KEI_NO = "svc_kei_no";

	/** SYSID **/
	private static String SYSID = "sysid";

	/**
	 * 
	 * eo電気契約一覧照会を行う
	 * 
	 * @param inCBSMsg
	 * @param inContext
	 */
	public static void ctrlCisInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		Map<String, Object> serviceMap = new LinkedHashMap<String, Object>();
		
		// オペレータ_ID
		String operatorId = inCBSMsg.getString(ECKA9030001CBSMsg.OPERATORID);
		if(operatorId != null)
		{
			serviceMap.put(JCKCtrlCisInfo.OPERATORID, operatorId);
		}
		else
		{
			serviceMap.put(JCKCtrlCisInfo.OPERATORID, "");
		}
		
		// 運用日時
		String operatoDateTime = inCBSMsg.getString(ECKA9030001CBSMsg.OPERATEDATETIME);
		if(operatoDateTime != null)
		{
			serviceMap.put(JCKCtrlCisInfo.OPERATEDATETIME, operatoDateTime);
		}
		else
		{
			serviceMap.put(JCKCtrlCisInfo.OPERATEDATETIME, "");
		}
		
		// 外部インターフェイスID
		serviceMap.put(JCKCtrlCisInfo.OUT_IF_ID, KKIFE264);

		// サービスＩＤ
		serviceMap.put(JCKCtrlCisInfo.SERVICEID, KKSV0815);
		
		// サービスインターフェースＩＤ
		serviceMap.put(JCKCtrlCisInfo.SERVICEIFID, KKSV081501SC);
		
		List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String, Object>>();
		LinkedHashMap<String, Object> serviceIf = new LinkedHashMap<String, Object>();		
		// 機能コード
		serviceIf.put(JCKCtrlCisInfo.FUNC_CODE, "1");
		// 供給地点特定番号
		if(inCBSMsg.getString(ECKA9030001CBSMsg.KEY_KYKYCHTN_TKT_NO) != null)
		{
			serviceIf.put(KYKYCHTN_TKT_NO, inCBSMsg.getString(ECKA9030001CBSMsg.KEY_KYKYCHTN_TKT_NO));
		}
		else
		{
			serviceIf.put(KYKYCHTN_TKT_NO, "");
		}
			
		list.add(serviceIf);
		serviceMap.put(JCKCtrlCisInfo.SERVICEIF,list);
		
		// コマンド発行部品のスタブ用、
		JCKCtrlCisInfo instance = JCKCtrlCisInfo.getInstance();
		
		try
		{
			// CIS連携
			Map<String, Object> ret = instance.call_KKIFE264(serviceMap);
			// コマンド実行結果判定
			if(null != ret.get(JCKCtrlCisInfo.CMD_RESULT_CD))
			{
				// 結果コード"1":XML電文処理エラー発生, SOAP例外の場合
				if(ret.get(JCKCtrlCisInfo.CMD_RESULT_CD).equals("1"))
				{
					inCBSMsg.set(ECKA9030001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
				}
				else if(ret.get(JCKCtrlCisInfo.CMD_RESULT_CD).equals("0"))
				{
					// リターンコードを判定しステータスをセットする。
					if(null != ret.get(JCKCtrlCisInfo.RETURN_CD))
					{
						// "0000":正常
						if("0000".equals((String)ret.get(JCKCtrlCisInfo.RETURN_CD)))
						{
							// ステータス(0:正常終了)セットする。
							inCBSMsg.set(ECKA9030001CBSMsg.STATUS, StatusCodes.NORMAL_END);
						}
						// "1000":単項目チェックエラー
						else if("1000".equals((String)ret.get(JCKCtrlCisInfo.RETURN_CD)))
						{
							// ステータス(1000:単項目チェックエラー)セットする。
							inCBSMsg.set(ECKA9030001CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
							
							// サービスＩＦリスト取得
							List<Map<String, Object>> serviceIfList = null;
							serviceIfList = (List<Map<String, Object>>)ret.get(JCKCtrlCisInfo.SERVICEIF);
							
							if(serviceIfList != null && !serviceIfList.isEmpty() ){
								
								Map<String, Object> map = serviceIfList.get(0);
								
								// 単項目チェックエラー発生項目設定
								// E1:必須チェック
								// E2:属性チェック
								// E3:桁数チェック
								if(map.get(KYKYCHTN_TKT_NO + "_err") != null)
								{
									inCBSMsg.set(ECKA9030001CBSMsg.KEY_KYKYCHTN_TKT_NO_ERR, (String)map.get(KYKYCHTN_TKT_NO + "_err"));
								}
							}
							
						}else{
							
							inCBSMsg.set(ECKA9030001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
						}
						
					}
					
					// SOAPレスポンス
					editInMsg(ret,inCBSMsg);
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * SOAPレスポンスを設定
	 * @param ret
	 * @param inCBSMsg
	 */
	private static void editInMsg(Map<String, Object> ret, CAANMsg inCBSMsg) {
		
		List<Map<String, Object>> serviceIfList = null;
		List<Map<String, Object>> recodeList = null;
		
		// サービスＩＦリスト取得
		serviceIfList = (List<Map<String, Object>>)ret.get(JCKCtrlCisInfo.SERVICEIF);
		// レコードリスト取得
		if(serviceIfList != null && !serviceIfList.isEmpty() ){
			Map<String, Object> map = serviceIfList.get(0);
			recodeList = (List<Map<String, Object>>)map.get(JCKCtrlCisInfo.RECORD);
		}
		
		// ｅｏ電気契約一覧照会明細の設定
		if(recodeList != null && !recodeList.isEmpty()){
			
			CAANMsg[] msgs =  new CAANMsg[recodeList.size()];
			
			for(int i = 0 ; i < recodeList.size() ; i ++){
				
				msgs[i] = new CAANMsg(ECKA9030001CBSMsg1List.class.getName());
				
				Map<String, Object> map = recodeList.get(i);
				// サービス契約番号
				msgs[i].set(ECKA9030001CBSMsg1List.SVC_KEI_NO, map.get(SVC_KEI_NO));
				// ＳＹＳＩＤ
				msgs[i].set(ECKA9030001CBSMsg1List.SYSID, map.get(SYSID));
			}
			
			inCBSMsg.set(ECKA9030001CBSMsg.ECKA9030001CBSMSG1LIST, msgs);
			
		}else{
			inCBSMsg.set(ECKA9030001CBSMsg.ECKA9030001CBSMSG1LIST, new CAANMsg[0]);
		}
	}
}
