/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKTaknZaikoCC
*   ソースファイル名：JKKTaknZaikoCC.java
*   作成者          ：富士通
*   日付            ：2013年06月21日
*＜機能概要＞
*   宅内機器在庫CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2013/06/21   FJ）        新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0341B032CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020504CBSMsg1List;

/**
 * 宅内機器在庫CCクラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKTaknZaikoCC extends AbstractCommonComponent {

	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** SC呼び出し部品 */
	private ServiceComponentRequestInvoker scCall = null;

	/** ユーザ任意文字列 */
	private String fixedTextGlobal = null;

	/**
	 * 宅内機器物流在庫更新処理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite zaikoToroku(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		
		this.fixedTextGlobal = fixedText;
		
		/** 照会 事前準備 */
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		this.scCall = new ServiceComponentRequestInvoker();
		
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<HashMap<String, Object>> kktkSvcKeiInfList = (ArrayList<HashMap<String, Object>>)paramMap.get("kktk_zaiko_upd_list");
		
		for (HashMap<String, Object> kktkSvcKeiInf : kktkSvcKeiInfList) {
			
			String kktkSvcKeiNo = (String)kktkSvcKeiInf.get("kktk_svc_kei_no");
			
			// 機器提供サービス契約一意照会
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD);
			reqMap = mapper.setEKK0341B032(param, fixedText, condMap);
			resMap = this.scCall.run(reqMap, handle);
			List<HashMap<String, Object>> kk0341_b032_map_af = mapper.getEKK0341B032( param, fixedText, resMap );
			mapper.scResultCheck(param);
			
			HashMap<String, Object> kk0341_a010_map = new HashMap<String, Object>();
			if (kk0341_b032_map_af.size() > 0) {
				kk0341_a010_map = kk0341_b032_map_af.get(0);
			}
			
			//宅内システムの在庫更新
			
			// 機器引当指定倉庫コード
			String soko_cd = (String)kk0341_a010_map.get(EKK0341B032CBSMsg1List.KIKI_HKAT_SHITEI_SOKO_CD);
			// 機器引当指定倉庫棚コード
			String shelf_cd = (String)kk0341_a010_map.get(EKK0341B032CBSMsg1List.KIKI_HKAT_SHITEI_SKDN_CD);
			// 宅内機器型式コード
			String taknkiki_model_cd = (String)kk0341_a010_map.get(EKK0341B032CBSMsg1List.TAKNKIKI_MODEL_CD);
			
			if (JKKBpCommon.isNull(soko_cd) || JKKBpCommon.isNull(shelf_cd) || JKKBpCommon.isNull(taknkiki_model_cd)) {
				continue;
			}
			
			// 宅内機器物流在庫更新
			callEKKA0020504SC(param, handle, soko_cd, shelf_cd, taknkiki_model_cd);
		}
		
		return param;
	}
	
	/**
	 * 宅内機器物流在庫更新S-IF呼出
	 * 
	 * @param param
	 * @param handle
	 * @param soko_cd
	 * @param shelf_cd
	 * @param taknkiki_model_cd
	 * @throws Throwable
	 */
	private void callEKKA0020504SC(IRequestParameterReadWrite param, SessionHandle handle
			, String soko_cd, String shelf_cd, String taknkiki_model_cd) throws Throwable {
		
		/** サービスインタフェース呼び出しで使用するマッパー群 */
		JKKButuryuCtrlMapper mapper = new JKKButuryuCtrlMapper();
		
		// 上り情報をマッピング
		HashMap<String, Object> sIFRequest = mapper.editInMsgEKKA0020504(param, soko_cd, shelf_cd, taknkiki_model_cd);
		
		// SIFの呼び出し
		Map<?, ?> sIFResult = this.scCall.run(sIFRequest, handle);
		
		// エラー情報のマッピング
		mapper.editResultRPEKKA0020504(sIFResult, param, this.fixedTextGlobal);
		
		// エラーチェック処理
		errChk(sIFResult);
	}
	
	public HashMap<String, Object> editInMsgEKKA0020504(IRequestParameterReadWrite param
			, String soko_cd, String shelf_cd, String taknkiki_model_cd) throws RequestParameterException {
		
		CAANMsg template = new CAANMsg(EKKA0020504CBSMsg.class.getName());
		
		// nullマッピングを実施
		fillCAANMSGNullMapping(template, new EKKA0020504CBSMsg().getContents());
		
		// 共通部を設定
		editInMsgBasicCmn(param, template);
		
		// テンプレートID(SIFのID)
		template.set(EKKA0020504CBSMsg.TEMPLATEID, "EKKA0020504");
		
		// 機能コード
		template.set(EKKA0020504CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		
		CAANMsg[] eKKA0020504CBSMsg1List = new CAANMsg[1];
		
		
		CAANMsg eKKA0020504CBSMsg1 = new CAANMsg(EKKA0020504CBSMsg1List.class.getName());
		fillCAANMSGNullMapping(eKKA0020504CBSMsg1, new EKKA0020504CBSMsg1List().getContents());
		
		// ＫＥＹ＿管理場所識別コード
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.KEY_KNRI_PLC_SKBT_CD, "1");
		
		// ＫＥＹ＿管理場所コード
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.KEY_KNRI_PLC_CD, soko_cd);
		
		// ＫＥＹ＿管理場所棚コード
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.KEY_KNRI_PLC_SLF_CD, shelf_cd);
		
		// ＫＥＹ＿宅内機器型式コード
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.KEY_TK_MDL_CD, taknkiki_model_cd);
		
		// 実在庫数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.JZAIKO_NUM, "0");
		
		// 配送受付（受注）数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.HAISO_UK_JUCHU_NUM, "1");
		
		// 配送出荷指示数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.HAISO_SHKA_SJI_NUM, "0");
		
		// 予備機器配送指示数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.YBKKHAI_SJI_NUM, "0");
		
		// 棚移動指示数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.SLF_MV_SJI_NUM, "0");
		
		// 予備機器配送中数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.YBKKHAI_CHU_NUM, "0");
		
		// 当日入荷数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.TJITU_NYUKA_NUM, "0");
		
		// 当日配送出荷数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.TJITU_HAISO_SHKA_NUM, "0");
		
		// 当日解約撤去返品数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.TJITU_DSL_TK_HMPIN_NUM, "0");
		
		// 当日故障交換返品数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.TJITU_TRB_KOKAN_HMPIN_NUM, "0");
		
		// 棚移動入荷完了数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.SLF_MV_NYUKA_FIN_NUM, "0");
		
		// 棚移動出荷完了数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.SLF_MV_SHKA_FIN_NUM, "0");
		
		// 予備機器出荷完了数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.YOBI_KKSHKA_FIN_NUM, "0");
		
		// 計画外入荷数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.PLN_GAI_NYUKA_NUM, "0");
		
		// 計画外出荷数
		eKKA0020504CBSMsg1.set(EKKA0020504CBSMsg1List.PLN_GAI_SHKA_NUM, "0");
		
		eKKA0020504CBSMsg1List[0] = eKKA0020504CBSMsg1;
		
		template.set(EKKA0020504CBSMsg.EKKA0020504CBSMSG1LIST, eKKA0020504CBSMsg1List);
		
		// 上り情報を生成
		return editInMsgCmn(param, template);
	}
	
	/**
	 * サービスI/F実行用の上り情報を生成する
	 * 
	 * @param param リクエストパラメータ
	 * @param template 条件の設定先
	 * @return S/I上り情報
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます
	 *                。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param, CAANMsg template) throws RequestParameterException  {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 持ちうるフィールドにNullマッピングで埋める
	 * 
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents) {
		// 要素ごとのループ
		for (int i = 0 ; i < contents.length ; i++) {
			
			Object element = null;
			
			// キーに該当する箇所の取得
			element = contents[i][0];
			
			// Nullでマッピング
			msg.setNull((String)element);
		}
	}
	
	/**
	 * 条件部の共通する項目の設定する
	 * 
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	private void editInMsgBasicCmn(IRequestParameterReadOnly param, CAANMsg template) throws RequestParameterException {
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
	}
	
	/**
	 * エラーチェック処理
	 * 
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private void errChk(Map<?, ?> msgList)  throws SCCallException {
		
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode || 0 != templateStatus) {
			throw new SCCallException(ERR_MSG, String.valueOf(returnCode), templateStatus);
		}
	}
}