/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetManmosKanriInfoCC
*   ソースファイル名：JFUGetManmosKanriInfoCC.java
*   作成者          ：富士通
*   日付            ：2022年06月13日
*＜機能概要＞
*  MT管理情報照会(MANMOS)の共通コンポーネント
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v60.00      2022/06/20   FJ）美濃原  【ANK-4244-00-00】【eo定期】MT既設賃貸対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

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.IRequestParameterReadWrite;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.util.JKKCommonUtil;

/**
 *MT管理情報照会(MANMOS)の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JFUGetManmosKanriInfoCC extends JKKGetMansionKanriInfoCC
{


	/** CBSMsgフォーマット */
	private static final String FMT_CBSMSG = "eo.ejb.cbs.cbsmsg.%sCBSMsg";

	// IN項目：MT管理情報照会(MANMOS) start--->
	/** ＫＥＹ＿ＰＩＤ */
	private static final String IN_PID = "key_pid";
	/** ＫＥＹ＿ＳＥＱ */
	private static final String IN_SEQ = "key_seq";
	/** ＩＮ＿光化マンションフラグ */
	private static final String IN_HIKARIKA_MANS_FLG = "hikarika_mans_flg";

	/** 棟番号（※画面で選択した棟名） */
	private static final String SELECT_TOU_NO = "select_tou_no";
	/** ＩＮ＿部屋番号（※画面で選択した部屋番号）  */
	private static final String SELECT_RM_NO = "select_rm_no";

	/** OUT項目：ＭＡＮＭＯＳ管理情報リスト（連番取得用） */
	private static final String OUT_MANMOS_KNRI_INFO_LIST = "manmos_knri_info_list";
	/** P-ID */
	public static final String OUT_PID = "pid";
	/** 連番 */
	public static final String OUT_SEQ = "seq";
	/** 棟番号 */
	public static final String OUT_TOU_NO = "tou_no";
	/** 部屋番号 */
	public static final String OUT_RM_NO = "rm_no";
	/** 前入居者工事案件番号 */
	public static final String OUT_MAE_KOJI_NO = "mae_koji_no";
	/** 確認結果コード */
	public static final String OUT_CFM_RSLT_CD = "cfm_rslt_cd";
	/** SPMポート上限数 */
	public static final String OUT_SPMPORT_MAX = "spmport_max";
	/** SPMポート使用数 */
	public static final String OUT_SPMPORT_USE = "spmport_use";
	/** 施工不可フラグ */
	public static final String OUT_SEKOU_NG_FLG = "sekou_ng_flg";
	/** コンセント設置内容 */
	public static final String OUT_CCT_SET_CD = "cct_set_cd";
	/** 工事備考欄 */
	public static final String OUT_BIKO = "biko";
	/** 更新日時 */
	public static final String OUT_UPDDT = "upddt";

	/** 画面表示用の棟情報 */
	public static final String OUT_TOU_INFO_LIST = "tou_info_list";
	/** 画面表示用の部屋情報 */
	public static final String OUT_RM_NO_LIST = "rm_no_list";

	/** 結果コード */
	public static final String OUT_RETURN_CD = "return_cd";
	/** リターンコード：正常値 */
	private static final String OUT_RETURN_CD_OK = "00";
//	/** リターンコード：エラー */
//	private static final String OUT_RETURN_CD_NG = "99";

	/** 取得フラグ ："1" 取得する */
	private static final String IN_ITEM_FLG_GET = "1";
	/** 取得フラグ ："0" 取得しない */
	private static final String IN_ITEM_FLG_NOT = "0";
	// MT管理情報照会(MANMOS) end <---

	/** OUT項目：APIエラーフラグ */
	private static final String OUT_API_ERR_FLG = "api_err_flg";
	/** APIエラーフラグ：正常値 */
	private static final String API_ERR_FLG_OK = "0";
	/** APIエラーフラグ：エラー値 */
	private static final String API_ERR_FLG_NG = "1";

	/**
	 * MT管理情報照会(MANMOS)取得処理です。
	 * 
	 * <br>
	 * KKIFExxx_MT管理情報照会(MANMOS)
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 処理結果
	 * @throws Throwable 例外
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getManmosMtInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		if (paramMap == null || paramMap.size() == 0)
		{
			return param;
		}
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put(IN_PID, paramMap.get(IN_PID)); //PID
		String keySeq = nullToEmpty(paramMap.get(IN_SEQ));
		resultMap.put(IN_SEQ, keySeq); //連番
		resultMap.put(IN_HIKARIKA_MANS_FLG, paramMap.get(IN_HIKARIKA_MANS_FLG)); //光化マンションフラグ
		resultMap.put(SELECT_TOU_NO, paramMap.get(SELECT_TOU_NO)); //棟
		resultMap.put(SELECT_RM_NO, paramMap.get(SELECT_RM_NO)); //部屋番号

		if (!JFUStrConst.HIKARIKA_MANS_FLG_1.equals(paramMap.get(IN_HIKARIKA_MANS_FLG)))
		{
			// ＭＡＮＭＯＳ管理物件以外は処理を抜ける
			JFUBPCommon.printBpDebugLog(this.getClass(), "▲ＭＡＮＭＯＳ管理物件以外▲");
			param.removeData(fixedText);
			return param;
		}

		// -----------------------------------------------------
		// ■EKKA1890001_MT管理情報照会 (API) start
		// -----------------------------------------------------
		// MT管理情報照会(MANMOS) 情報取得
		pamamset(param, fixedText);
//		JKKGetMansionKanriInfoCC jkkGetMansionKanriInfoCC = new JKKGetMansionKanriInfoCC();
		super.execMansionKnriInfo(handle, param, fixedText);
		// -----------------------------------------------------
		// ■EKKA1890001_MT管理情報照会 (API) end
		// -----------------------------------------------------

		ArrayList<HashMap<String, Object>> resultlist = new ArrayList<HashMap<String, Object>>();
		// リストに格納
		List<String> touInfoList = new ArrayList<String>();
		List<String> rmNoList = new ArrayList<String>();
		List<HashMap<String, String>> manmos_knri_info_list = new ArrayList<HashMap<String, String>>();
		String apiErrFlg = API_ERR_FLG_NG;
		HashMap<String, Object> getMap = (HashMap<String, Object>)param.getData(fixedText);
		String returnCd = (String)getMap.get("return_cd");

		if (OUT_RETURN_CD_OK.equals(returnCd))
		{
			outDebug("■■■ EKKA1890001_MT管理情報照会 (API) ■■■ returnCd[" + JFUBPCommon.nvl(returnCd, JFUStrConst.EMPTY) + "]");
			apiErrFlg = API_ERR_FLG_OK;
			resultlist = (ArrayList<HashMap<String, Object>>)getMap.get("mtMngInfoList");
			for (HashMap childMap : resultlist)
			{
				if (JFUBPCommon.isNull(childMap.get("seq")))
				{
					// ありえないデータ
					continue;
				}
				if ((!JFUBPCommon.isNull(keySeq)) && (!keySeq.equals(childMap.get("seq"))))
				{
					// SEQ指定時は1件のみ返却されるはず（ありえない前提）
					continue;
				}
				HashMap<String, String> resultChildMap = new HashMap<String, String>();

				// ※項目設定 null時空文字設定
				String sifTouInfo = nullToEmpty(childMap.get("tou_no"));
				String dspTouInfo = convTouInfo(sifTouInfo);
				String sifRmNo = nullToEmpty(childMap.get("rm_no"));
				// P-ID
				resultChildMap.put(OUT_PID, nullToEmpty(childMap.get("pid")));
				// 連番
				resultChildMap.put(OUT_SEQ, nullToEmpty(childMap.get("seq")));
				// 棟番号
				resultChildMap.put(OUT_TOU_NO, dspTouInfo);
				// 部屋番号
				resultChildMap.put(OUT_RM_NO, sifRmNo);
				// 前入居者工事案件番号
				resultChildMap.put(OUT_MAE_KOJI_NO, nullToEmpty(childMap.get("mae_koji_no")));
				// 確認結果コード
				resultChildMap.put(OUT_CFM_RSLT_CD, nullToEmpty(childMap.get("cfm_rslt_cd")));
				// SPMポート上限数
				resultChildMap.put(OUT_SPMPORT_MAX, nullToEmpty(childMap.get("spmport_max")));
				// SPMポート使用数
				resultChildMap.put(OUT_SPMPORT_USE, nullToEmpty(childMap.get("spmport_use")));
				// 施策ステータスコード
				resultChildMap.put(OUT_SEKOU_NG_FLG, nullToEmpty(childMap.get("sekou_ng_flg")));
				// コンセント設置内容
				String cctSetCd = nullToEmpty(childMap.get("cct_set_cd"));
				if (cctSetCd.trim().length() == 0)
				{
					cctSetCd = JFUStrConst.EMPTY;
				}
				resultChildMap.put(OUT_CCT_SET_CD, cctSetCd);
				// 工事備考欄
				resultChildMap.put(OUT_BIKO, nullToEmpty(childMap.get("biko")));
				// 更新日時
				resultChildMap.put(OUT_UPDDT, nullToEmpty(childMap.get("upddt")));

				// 画面表示連携用
				if (!JFUBPCommon.isNull(dspTouInfo) && !touInfoList.contains(dspTouInfo))
				{
					touInfoList.add(dspTouInfo);
				}
				if (!JFUBPCommon.isNull(sifRmNo) && !rmNoList.contains(sifRmNo))
				{
					rmNoList.add(sifRmNo);
				}
				manmos_knri_info_list.add(resultChildMap);
			}
		} else {
			printErrorLog("■■■ EKKA1890001_MT管理情報照会 (API) !!!!! returnCd[" + JFUBPCommon.nvl(returnCd, JFUStrConst.EMPTY) + "] エラー" 
					+ " pid[" + JFUBPCommon.nvl((String)paramMap.get(IN_PID), JFUStrConst.EMPTY) + "] seq[" + JFUBPCommon.nvl((String)paramMap.get(IN_SEQ), JFUStrConst.EMPTY) + "]");
		}

		// 結果コード
		resultMap.put(OUT_RETURN_CD, returnCd); //TODO:?
		// APIエラーフラグを設定
		resultMap.put(OUT_API_ERR_FLG, apiErrFlg);
		// ＭＡＮＭＯＳ管理情報リスト（連番取得用） を設定
		resultMap.put(OUT_MANMOS_KNRI_INFO_LIST, manmos_knri_info_list);
		// 棟情報
		resultMap.put(OUT_TOU_INFO_LIST, dspEditList(touInfoList));
		// 部屋番号
		resultMap.put(OUT_RM_NO_LIST, dspEditList(rmNoList));

		// 一度ユーザデータを削除し、再度設定する
		param.removeData(fixedText);
		param.setData(fixedText, resultMap);
		return param;
	}

	/**
	 * MT管理情報照会(MANMOS)の取得フラグ
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void pamamset(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

		paramMap.put("pid", paramMap.get(IN_PID)); //PID
		String keySeq = nullToEmpty(paramMap.get(IN_SEQ));
		paramMap.put("seq", keySeq); //連番

		paramMap.put("tou_no_get_flg", IN_ITEM_FLG_GET);//棟番号取得フラグ
		paramMap.put("rm_no_get_flg", IN_ITEM_FLG_GET);//部屋番号取得フラグ

		if (JFUBPCommon.isNull(keySeq)) {
			paramMap.put("cfm_rslt_cd_get_flg", IN_ITEM_FLG_NOT);//確認結果コード取得フラグ
			paramMap.put("sekou_ng_flg_get_flg", IN_ITEM_FLG_NOT);//施工不可フラグ取得フラグ
			paramMap.put("cct_set_cd_get_flg", IN_ITEM_FLG_GET);//コンセント設置内容取得フラグ
		} else {
			paramMap.put("cfm_rslt_cd_get_flg", IN_ITEM_FLG_GET);//確認結果コード取得フラグ
			paramMap.put("sekou_ng_flg_get_flg", IN_ITEM_FLG_GET);//施工不可フラグ取得フラグ
			paramMap.put("cct_set_cd_get_flg", IN_ITEM_FLG_GET);//コンセント設置内容取得フラグ
		}

		paramMap.put("mae_koji_no_get_flg", IN_ITEM_FLG_NOT);//前入居者工事案件番号取得フラグ
		paramMap.put("spmport_max_get_flg", IN_ITEM_FLG_NOT);//SPMポート上限数取得フラグ
		paramMap.put("spmport_use_get_flg", IN_ITEM_FLG_NOT);//SPMポート使用数取得フラグ
		paramMap.put("biko_get_flg", IN_ITEM_FLG_NOT);//工事備考欄取得フラグ
		paramMap.put("upddt_get_flg", IN_ITEM_FLG_NOT);//更新日時取得フラグ
	}

	/**
	 * 「棟情報」が未設定の文字列置換。
	 * 
	 * <br>
	 * @param touInfo 棟番号
	 * @return 棟番号
	 * @throws Exception
	 */
	private String convTouInfo(String touInfo) throws Exception
	{
		// ■P-IDに対して建物が１つしかない場合は棟情報は設定されない。
		// 棟情報（既存の光化マンションでの仕様として「棟情報」が未設定の場合は"−"(全角マイナス)が設定される仕様は踏襲）
		if (JKKCommonUtil.judgeMinusFullChar(touInfo))
		{
			// 全角マイナス(817C)のみの場合
			return JFUStrConst.EMPTY;
		}
		return touInfo;
	}

	/**
	 * 画面の棟／部屋情報の編集。
	 * 
	 * <br>
	 * @param paramList 棟／部屋の一覧
	 * @return 編集結果
	 */
	private String dspEditList(List<String> paramList)
	{
		// 並び替え
		Collections.sort(paramList);

		// カンマ区切りに編集
		String editInfo = JFUStrConst.EMPTY;

		for (int n = 0; n < paramList.size(); n++)
		{
			if (JFUBPCommon.isNull(editInfo))
			{
				editInfo = paramList.get(n);
			}
			else
			{
				editInfo = editInfo + JFUStrConst.COMMA + paramList.get(n);
			}
		}
		return editInfo;

	}

	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unused")
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));

		String svcIf = (String)mappingData[0][1];
		CAANMsg template = new CAANMsg(String.format(FMT_CBSMSG, svcIf));
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		for (int i = 0; i < mappingData.length; i++)
		{
			if (JFUStrConst.EMPTY.equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * nullの場合、空文字に変換します。
	 * 
	 * <br>
	 * @param value 入力値
	 * @return String nullの場合は空文字返却
	 */
	private String nullToEmpty(Object value)
	{
		if (JFUBPCommon.isNull(value))
		{
			return JFUStrConst.EMPTY;
		}
		return (String)value;
	}

	/**
	 * デバッグログを出力します。<BR>
	 *
	 * @param dumpObj 出力するオブジェクト
	 */
	private void outDebug(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}

	/**
	 * エラーログ出力
	 * @param errMsg エラーメッセージ
	 */
	private void printErrorLog(String errMsg)
	{
		JSYejbLog.println(JSYejbLog.ERROR, this.getClass(), errMsg + "\n" + errMsg);
	}

}
