/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSV902001CC
*   ソースファイル名：JCKSV902001CC.java
*   作成者          ：富士通
*   日付            ：2018年04月11日
*＜機能概要＞
*  PMPから受け取ったデータを元に、SYSIDの取得を行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v37.00.00   2018/04/11   FJ）岩本    【ANK-3326-00-00】お客さま情報仮登録状態でのエラー処理変更 新規作成
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static eo.common.constant.JCKStrConst.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9020_CKSV9020OP_CKSV902001CC;
import com.fujitsu.futurity.bp.custom.constant.CKSV9020_CKSV9020OP_CKSV902001CC_dataList1;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
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.CCException;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.ECK0011B060CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B060CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;

/**
 * SYSIDの取得を行い、返却データを設定する。
 * <BR>
 * @ author 富士通
 */
public class JCKSV902001CC extends AbstractCommonComponent
{
	/** 当CCの内部でしか使わないエラーコード */
	private static final String PMP_ERR_OTHER = "OTHER";

	/**
	 * SYSID取得メイン処理。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeMain(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ取得
		Map inMap = (Map)param.getData(fixedText);
		String keyShkEoId = (String)inMap.get(CKSV9020_CKSV9020OP_CKSV902001CC.KEY_SHK_EOID);
		String keyShkEoIdPwd = (String)inMap.get(CKSV9020_CKSV9020OP_CKSV902001CC.KEY_SHK_EOID_PWD);
		
		// 返却値を初期化
		String returnCd = PMP_NORMAL_END;

		//***************************************************
		// SYSID取得
		//***************************************************
		CAANMsg[] dataList = null;
		CAANMsg[] idoRsvList = null;
		List list = new ArrayList();
		String sysid = null;
		Map<?, ?> resultIdoRsvMap = null;

		Map<?, ?> result = callECK0011B060(handle, param, "2", "", "", "", keyShkEoId, keyShkEoIdPwd, "", "");
		if (isSuccess(result))
		{
			dataList = getResultMsgList(result, ECK0011B060CBSMsg.ECK0011B060CBSMSG1LIST);
			if ((dataList == null) || (dataList.length == 0))
			{
				returnCd = PMP_ERR_NODATA;   // データなし
			}
			else
			{
				for (CAANMsg msg : dataList)
				{
					sysid = msg.getString(ECK0011B060CBSMsg1List.SYSID);
					if (PMP_NORMAL_END.equals(returnCd))
					{
						//***************************************************
						// 異動予約情報取得
						//***************************************************
						resultIdoRsvMap = callEKK1681B001(handle, param, "1", "00089", "031", "04", sysid);
						if (isSuccess(resultIdoRsvMap))
						{
							idoRsvList = getResultMsgList(resultIdoRsvMap, EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
							if (idoRsvList != null && idoRsvList.length > 0)
							{
								//返却パラメータの設定の処理を行う
								returnCd = PMP_ERR_KARI_ADD_CHU;   // 仮登録中エラー
							}
							else
							{
								Map recMap = new HashMap();
								recMap.put(CKSV9020_CKSV9020OP_CKSV902001CC_dataList1.SYSID, sysid);
								list.add(recMap);
								returnCd = PMP_NORMAL_END;   // 正常終了
							}
						}
					}
					else
					{
						returnCd = PMP_ERR_OTHER;   // その他のエラー
					}
				}
			}
		}
		else
		{
			returnCd = PMP_ERR_OTHER;   // その他のエラー
		}

		//***************************************************
		// 返却パラメータ設定
		//***************************************************
		// 下り電文コントロールマップをセットする
		JCKBPCommon.setResultCtrlData(param, result, fixedText);

		// SC実行エラーの場合は、結果に応じてリターンコードを設定
		if (PMP_ERR_OTHER.equals(returnCd))
		{
			String scReturnCd = getReturnCode(result).toString();
			String scStatusCd = getStatus(result).toString();
			returnCd = ("0".equals(scReturnCd) && "1000".equals(scStatusCd)) ? PMP_ERR_PARAM : PMP_ERR_SYSTEM;
		}

		// 下りユーザデータマップをセットする
		Map<String, Object> resultMap = new HashMap();
		resultMap.put(CKSV9020_CKSV9020OP_CKSV902001CC.DATALIST1, list);
		resultMap.put(CKSV9020_CKSV9020OP_CKSV902001CC.RETURN_CD, returnCd);
		// 下りユーザデータマップを設定する。
		setResultUserData(param, fixedText, resultMap);

		//*************************************************
		// 処理結果の判定
		//*************************************************
		if (isError(result))
		{
			String errMsg = "PMP連携SYSID取得CCでエラーが発生しました";
			throw new CCException(errMsg, new Exception(errMsg));
		}
		return param;
	}

	/**
	 * BPチェック用パラメータ作成。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return BPチェック用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// BPチェックはスキップする
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。<br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}
}
