/*******************************************************************************
* All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECRA0010001TPMA
*	ソースファイル名：JECRA0010001TPMA.java
*	作成者			：富士通
*	日付			：2012年03月06日
*＜機能概要＞
*	宅内機器一意照会用独自処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ32.00.00  2017/05/26  FJ)河邊     【OM-2017-0000488】オープンカーソルエラー
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import static eo.ejb.common.JCRModelCommon.msgToMap;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentConstant;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JCRStrConst;
import eo.ejb.cbm.entity.CR0011ETMsg;
import eo.ejb.cbs.cbsmsg.ECRA0010001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECRA0010001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECRA0010001ConditionList;
import eo.ejb.common.JCRCtrlTnInfo;

/**
 * <p>
 * 宅内機器一意照会対応履歴独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JECRA0010001TPMA implements TemplateMainHandler
{
	
	/**
	 * コンストラクタです。
	 */
	public JECRA0010001TPMA() 
	{
		
	}
	
	/**
	 * <p>
	 * 対応履歴宅内情報処理を呼び出します
	 * </p>
	 * 
	 * @param inCBSMsg 概念スキーマのCBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) 
	{
		// IN項目に値を設定
		Map<String, Object> serviceMap = msgToMap(inCBSMsg, ECRA0010001CBSMsg.class);

		// サービスIDの設定
		String serviceid = (String)inContext.getClientHashMapObjectByKey(AgentConstant.USECASE_ID_KEY);
		serviceMap.put(JCRCtrlTnInfo.SERVICEID, serviceid);

		// テーブルのコネクションを取得して、部品に受け渡しを行う。
		// コネクションを取得するのみのため、どのテーブルを用いても可
		Connection con = JSYejbConnection.getConnection(CR0011ETMsg.getTableName());
		// 宅内機器コマンド発行部品のスタブ用、
		JCRCtrlTnInfo instance = JCRCtrlTnInfo.getInstance();
		instance.setConnection(con);
		
		try 
		{
			// 宅内機器連携部品を呼び出す。
			Map ret = instance.ctrlTnInfo_CRA0001(serviceMap);

			if(ret.get(JCRStrConst.CMD_RESULT_CD) != null && ret.get(JCRStrConst.CMD_RESULT_CD).equals("1"))
			{
				inCBSMsg.set(ECRA0010001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
				return;
			}

			// 取得した戻り値を元に、inCBSMsgのアウト項目に値を設定して返す
			String errorLevel = (String)ret.get(ECRA0010001CBSMsg.ERROR_LEVEL);
			inCBSMsg.set(ECRA0010001CBSMsg.ERROR_LEVEL, errorLevel);
			String returnCd = (String)ret.get(ECRA0010001CBSMsg.RETURN_CD);
			inCBSMsg.set(ECRA0010001CBSMsg.RETURN_CD, returnCd);
			String returnMsg = (String)ret.get(ECRA0010001CBSMsg.RETURN_MESSAGE);
			inCBSMsg.set(ECRA0010001CBSMsg.RETURN_MESSAGE, returnMsg);

			//リターンコードにあわせてステータスをセットする
			if(ret.get("return_Cd") != null && !((String)ret.get("return_Cd")).equals("0000")) 
			{
				if(("1000").equals((String)ret.get("return_Cd")) || 
					("1050").equals((String)ret.get("return_Cd")))
				{
					inCBSMsg.set(ECRA0010001CBSMsg.STATUS, StatusCodes.SINGLEDATA_ERR);
				}
				else if(("1100").equals((String)ret.get("return_Cd")))
				{
					inCBSMsg.set(ECRA0010001CBSMsg.STATUS, StatusCodes.ITEM_RELATION_ERR);
				}
				

				ArrayList<Hashtable<String, Object>> list = (ArrayList<Hashtable<String, Object>>)ret.get(ECRA0010001CBSMsg.ECRA0010001CONDITIONLIST);
				if(list != null && !list.isEmpty())
				{
					// うまくいけば戻りの電文を設定して終了する。
					CAANMsg[] l_ecra001001conditionlist = new CAANMsg[list.size()];
					for(int i = 0 ; i < list.size() ; i++)
					{
						Map data = list.get(i);
						CAANMsg msg = new CAANMsg("eo.ejb.cbs.cbsmsg.ECRA0010001ConditionList");
						
						l_ecra001001conditionlist[i] = msg;

						// 宅内機器型式コードエラー
						if(data.get("key_tk_mdl_cd_err") != null)
						{
							msg.set(ECRA0010001ConditionList.KEY_TK_MDL_CD_ERR, (String)data.get("key_tk_mdl_cd_err"));
						}
						// 機器製造番号エラー
						if(data.get("key_kk_seizo_no_err") != null)
						{
							msg.set(ECRA0010001ConditionList.KEY_KK_SEIZO_NO_ERR, (String)data.get("key_kk_seizo_no_err"));
						}
						// STBIDエラー
						if(data.get("key_stbid_err") != null)
						{
							msg.set(ECRA0010001ConditionList.KEY_STBID_ERR, (String)data.get("key_stbid_err"));
						}
						// 宅内機器照会種別コードエラー
						if(data.get("key_tk_shokai_sbt_cd_err") != null)
						{
							msg.set(ECRA0010001ConditionList.KEY_TK_SHOKAI_SBT_CD_ERR, (String)data.get("key_tk_shokai_sbt_cd_err"));
						}
					}
					inCBSMsg.set(ECRA0010001CBSMsg.ECRA0010001CONDITIONLIST, l_ecra001001conditionlist);
				}
			}
			else
			{
				ArrayList<Hashtable<String, Object>> list = (ArrayList<Hashtable<String, Object>>)ret.get(ECRA0010001CBSMsg.ECRA0010001CBSMSG1LIST);
				if(list != null && !list.isEmpty())
				{
					// うまくいけば戻りの電文を設定して終了する。
					CAANMsg[] l_ecra001001csvmsglist = new CAANMsg[list.size()];
					for(int i = 0 ; i < list.size() ; i++)
					{
						Map data = list.get(i);
						CAANMsg msg = new CAANMsg("eo.ejb.cbs.cbsmsg.ECRA0010001CBSMsg1List");
						
						l_ecra001001csvmsglist[i] = msg;

						// 宅内機器型式コード
						msg.set(ECRA0010001CBSMsg1List.TK_MDL_CD, (String)data.get(ECRA0010001CBSMsg1List.TK_MDL_CD));
						// 機器製造番号
						msg.set(ECRA0010001CBSMsg1List.KK_SEIZO_NO, (String)data.get(ECRA0010001CBSMsg1List.KK_SEIZO_NO));
						// 宅内機器ステータス
						msg.set(ECRA0010001CBSMsg1List.TK_STAT, (String)data.get(ECRA0010001CBSMsg1List.TK_STAT));
						// 所有コード
						msg.set(ECRA0010001CBSMsg1List.SHOYU_CD, (String)data.get(ECRA0010001CBSMsg1List.SHOYU_CD));
						// 管理場所識別コード
						msg.set(ECRA0010001CBSMsg1List.KNRI_PLC_SKBT_CD, (String)data.get(ECRA0010001CBSMsg1List.KNRI_PLC_SKBT_CD));
						// 管理場所コード
						msg.set(ECRA0010001CBSMsg1List.KNRI_PLC_CD, (String)data.get(ECRA0010001CBSMsg1List.KNRI_PLC_CD));
						// 管理場所棚コード
						msg.set(ECRA0010001CBSMsg1List.KNRI_PLC_SLF_CD, (String)data.get(ECRA0010001CBSMsg1List.KNRI_PLC_SLF_CD));
						// 宅内機器基本T更新日付
						msg.set(ECRA0010001CBSMsg1List.KIHON_UPD_DTTM, (String)data.get(ECRA0010001CBSMsg1List.KIHON_UPD_DTTM));
						// STBID
						msg.set(ECRA0010001CBSMsg1List.STBID, (String)data.get(ECRA0010001CBSMsg1List.STBID));
						// 宅内機器STBT更新日付
						msg.set(ECRA0010001CBSMsg1List.STBT_UPD_DTTM, (String)data.get(ECRA0010001CBSMsg1List.STBT_UPD_DTTM));
					}
					inCBSMsg.set(ECRA0010001CBSMsg.ECRA0010001CBSMSG1LIST, l_ecra001001csvmsglist);
				}
			}
		}
		catch(Exception e) 
		{
			e.printStackTrace();
			inCBSMsg.set(ECRA0010001CBSMsg.STATUS, StatusCodes.EXTERNAL_IF_ERR1);
//			inCBSMsg.set(ECRA0010001CBSMsg.ERROR_LEVEL, "999");
//			inCBSMsg.set(ECRA0010001CBSMsg.RETURN_CD, "9000");
//			inCBSMsg.set(ECRA0010001CBSMsg.RETURN_MESSAGE, e.getMessage());
		}
// OM-2017-0000488 2017/05/26 ADD START
		finally
		{
			// 資源の解放
			if (con != null)
			{
				CAANConnectionMgr.getInstance().close(con);
			}
		}
// OM-2017-0000488 2017/05/26 ADD END
	}
}
