/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUGetElecTaioKirok
*	ソースファイル名：JFUGetElecTaioKirok.java
*	作成者			：富士通
*	日付			：2017年09月19日
*＜機能概要＞
*	eo電気見込みの「対応履歴」の編集を行う部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*  v35.00.00   2017/09/19  FJ) 美濃原 【ANK-3211-00-00】eo電気架電予約機能におけるCase連携の内容変更
*  v57.00.00   2022/03/08  FJ) 美濃原 【ANK-3692-00-00】量販Webガス架電予約対応
*
**********************************************************************/
package eo.web.webview.common;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.common.util.JPCCommonUtil;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * <p>
 * eo電気見込みの「対応履歴」の編集を行う部品です。
 * </p>
 * @author 富士通
 */
public class JFUGetElecTaioKirok extends JPCCommonUtil
{
	/** 置き換え文字列1 */
	private static final String RE_1 = "%1%";

	/** eo電気案内希望（eo電気見込み客）*/
	public static final String ELEC_TR = "ELEC_TR";

	/** eo電気案内希望（eo電気見込み客）*/
	public static final String ELEC_TR_TAIO_KIROK_RIREKI = "taio_kirok_rireki";
	/** eo電気案内希望（eo電気見込み客）【関電ガスｅｏ割（架電希望）】*/
	public static final String ELEC_GAS_TR_TAIO_KIROK_RIREKI = "gas_taio_kirok_rireki";

	/** 対応記録履歴．取扱コード１−１ */
	private static final String ELEC_TR_TAIO_KIROK_CD1 = "taio_kirok_cd1";
	/** 対応記録履歴．取扱コード１−２ */
	private static final String ELEC_TR_TAIO_KIROK_CD2 = "taio_kirok_cd2";
	/** 対応記録履歴．申込番号 */
	private static final String ELEC_TR_TAIO_KIROK_MSKM_NO = "taio_kirok_mskm_no";
	/** 対応記録履歴．入力者（従業員番号）の文言 */
	private static final String ELEC_TR_TAIO_KIROK_OPEACNT = "taio_kirok_opeacnt";
	/** 対応記録履歴．架電予約導線の文言 */
	private static final String ELEC_TR_TAIO_KIROK_WEB = "taio_kirok_web";
	/** 対応記録履歴．架電予約導線 [地プロ] */
	private static final String ELEC_TR_TAIO_KIROK_CHIPURO = "taio_kirok_chipuro";
	/** 対応記録履歴．架電予約導線 [量販] */
	private static final String ELEC_TR_TAIO_KIROK_RYOHAN = "taio_kirok_ryohan";
	/** 対応記録履歴．架電予約導線 [訪販] */
	private static final String ELEC_TR_TAIO_KIROK_HOHAN = "taio_kirok_hohan";
	/** 対応記録履歴．架電予約導線 [一般] */
	private static final String ELEC_TR_TAIO_KIROK_IPPAN = "taio_kirok_ippan";

	/** 対応記録履歴．架電希望時間 */
	private static final String ELEC_TR_TAIO_KIROK_TIME = "taio_kirok_time";
	/** 対応記録履歴．優先連絡先の続柄 */
	private static final String ELEC_TR_TAIO_KIROK_ZOKUGARA = "taio_kirok_zokugara";
	/** 対応記録履歴．新住所での利用(再点) */
	private static final String ELEC_TR_TAIO_KIROK_SAITEN = "taio_kirok_saiten";
	/** 対応記録履歴．架電希望時間 取得キー[日] */
	private static final String ELEC_TR_TAIO_KIROK_DAY_KEY = "taio_kirok_day_";
	/** 対応記録履歴．架電希望時間 取得キー[時間] */
	private static final String ELEC_TR_TAIO_KIROK_TIME_KEY = "taio_kirok_time_";
	/** 対応記録履歴．新住所での利用(再点) 取得キー */
	private static final String ELEC_TR_TAIO_KIROK_SAITEN_KEY = "taio_kirok_saiten_";

	/**
	 * 「対応記録履歴」文言取得処理。
	 * 
	 * 
	 * @param bean　[0]：共有フォームビーン
	 * @return String
	 */
	public static String getRireki(X31SDataBeanAccess[] bean) throws Exception
	{
		boolean isBlank = false;

		// WEB新規情報
		X31SDataBeanAccess bnWebinfo = getBeanInfo(bean[0], CommonInfoCFConst.WEB_NEW_INFO);
		// WEB新規情報/その他情報
		X31SDataBeanAccess elseInfoBean = getBeanInfo(bnWebinfo, CommonInfoCFConst.ELSE_INFO);
		// WEB新規情報/eo光ネット
		X31SDataBeanAccess eonetBean = getBeanInfo(bnWebinfo, CommonInfoCFConst.EONET);

		// 取扱コード１−１
		String wkStr = elseInfoBean.sendMessageString(CommonInfoCFConst.TORITEN_TORIATSUKAI_CD_18, X31CWebConst.DATABEAN_GET_VALUE);
		String tratCd1_1 = getElecWord(ELEC_TR_TAIO_KIROK_CD1, wkStr);
		if (JFUStrConst.EMPTY.equals(tratCd1_1))
		{
			// 取扱コードが設定されていない場合、以降の編集をしない。（切替前の対応用）
			isBlank = true;
		}
		// 取扱コード１−２
		wkStr = elseInfoBean.sendMessageString(CommonInfoCFConst.TNTSHA_TORIATSUKAI_CD_18, X31CWebConst.DATABEAN_GET_VALUE);
		String tratCd1_2 = getElecWord(ELEC_TR_TAIO_KIROK_CD2, wkStr);
		// 販売タイプ
		String hanbaiType = bnWebinfo.sendMessageString(CommonInfoCFConst.HANBAI_TYPE_06, X31CWebConst.DATABEAN_GET_VALUE);

		// 申込書番号（受付番号）
		String uketukeNo = getNetUketukeNo(bean);
		// WEB新規情報/マンション情報
		X31SDataBeanAccess mansioninfo = getBeanInfo(bnWebinfo, CommonInfoCFConst.MANSION_INFO);
		String knykeiMskmJokenCd = mansioninfo.sendMessageString(CommonInfoCFConst.KNYKEI_MSKM_JOKEN_CD_16, X31CWebConst.DATABEAN_GET_VALUE);
		String mskmNo = JFUStrConst.EMPTY;
		// 共有フォームBean.マンション情報.加入契約申込条件コードが"13"(全戸一括)の場合
		if (JFUStrConst.KNYKEI_MSKM_JOKEN_IKT.equals(knykeiMskmJokenCd) && JFUWebCommon.isNull(uketukeNo))
		{
			// 全戸一括の場合は、サービス側で受付番号を採番して置換（※通常は仮申込で受付番号採番）
			mskmNo = getElecWord(ELEC_TR_TAIO_KIROK_MSKM_NO);
		}
		else
		{
			mskmNo = getElecWord(ELEC_TR_TAIO_KIROK_MSKM_NO, uketukeNo);
		}

		// 入力者（初期値：ブランク）
		String opeacnt = JFUStrConst.EMPTY;
		// 架電予約導線（初期値：一般WEB）
		String webKey = ELEC_TR_TAIO_KIROK_IPPAN;

		// 販売タイプが提携住宅会社の場合
		if (JFUStrConst.HNBAI_TYPE_TKJCOMP.equals(hanbaiType))
		{
			webKey = ELEC_TR_TAIO_KIROK_CHIPURO;
		}
		// 販売タイプが量販の場合
		else if (JFUStrConst.HNBAI_TYPE_RYOHAN.equals(hanbaiType))
		{
			// その他情報.担当者ＩＤ
			opeacnt = elseInfoBean.sendMessageString(CommonInfoCFConst.TANTOSHA_ID_18, X31CWebConst.DATABEAN_GET_VALUE);
			webKey = ELEC_TR_TAIO_KIROK_RYOHAN;
		}
		// 販売タイプが訪販の場合
		else if (JFUStrConst.HNBAI_TYPE_HOHAN.equals(hanbaiType))
		{
			// その他情報.担当者ＩＤ
			opeacnt = elseInfoBean.sendMessageString(CommonInfoCFConst.TANTOSHA_ID_18, X31CWebConst.DATABEAN_GET_VALUE);
			webKey = ELEC_TR_TAIO_KIROK_HOHAN;
		}

		// 上記以外（販売タイプがコンシューマの場合は初期値）
		String opeacntStr = getElecWord(ELEC_TR_TAIO_KIROK_OPEACNT, opeacnt);
		String webDosenRep = JFUWebCommon.getDispText(ELEC_TR, webKey);
		String webDosen = getElecWord(ELEC_TR_TAIO_KIROK_WEB, webDosenRep);

		// ●架電希望時間
		StringBuffer elecGuideTimeBf = new StringBuffer();

		// 架電希望指定日/架電希望指定時間のいずれか選択された場合「true」
		boolean selElecGuideDay = false;

		// 架電希望指定日
		String elecGuideDay = eonetBean.sendMessageString(CommonInfoCFConst.ELEC_GUIDE_KIBO_DAY_11, X31CWebConst.DATABEAN_GET_VALUE);

		if ("1".equals(elecGuideDay) || "2".equals(elecGuideDay))
		{
			// 1:平日、2:土日

			// 架電希望指定日の指定がある場合
			selElecGuideDay = true;
			elecGuideTimeBf.append(JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_DAY_KEY + elecGuideDay));
		}

		// 架電希望指定時間
		String elecGuideTime = eonetBean.sendMessageString(CommonInfoCFConst.ELEC_GUIDE_KIBO_TIME_11, X31CWebConst.DATABEAN_GET_VALUE);

		if ("1".equals(elecGuideTime) || "2".equals(elecGuideTime))
		{
			// 1:AM、2:PM

			if (selElecGuideDay)
			{
				// 架電希望指定日の指定がある場合
				elecGuideTimeBf.append(JFUStrConst.SPACE);
			}
			elecGuideTimeBf.append(JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_TIME_KEY + elecGuideTime));
		}

		if ("0".equals(elecGuideDay) && "0".equals(elecGuideTime))
		{
			// 架電希望指定日/架電希望指定時間の両方が「0:指定なし」の場合
			elecGuideTimeBf.append(JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_DAY_KEY + elecGuideDay));
		}

		String elecGuideDayTime = getElecWord(ELEC_TR_TAIO_KIROK_TIME, elecGuideTimeBf.toString());

		// ●優先連絡先の続柄
		String elecGuideZokugara =
				getElecWord(ELEC_TR_TAIO_KIROK_ZOKUGARA, eonetBean.sendMessageString(CommonInfoCFConst.ELEC_GUIDE_ZOKUGARA_11, X31CWebConst.DATABEAN_GET_VALUE));

		boolean isGasKadenKikitori = JFUWebCommon.isGasKadenKikitori(bnWebinfo);

		// ●新住所での利用(再点)
		String elecGuideSaiten = JFUStrConst.EMPTY;
		if (!isGasKadenKikitori)
		{
			// eo電気（架電希望）
			elecGuideSaiten = eonetBean.sendMessageString(CommonInfoCFConst.ELEC_GUIDE_SAITEN_11, X31CWebConst.DATABEAN_GET_VALUE);

			if (JFUWebCommon.isNull(elecGuideSaiten))
			{
				elecGuideSaiten = getElecWord(ELEC_TR_TAIO_KIROK_SAITEN, JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_SAITEN_KEY + "0"));
			}
			else
			{
				elecGuideSaiten =
						getElecWord(ELEC_TR_TAIO_KIROK_SAITEN, JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_SAITEN_KEY + elecGuideSaiten));
			}
		}

		// ■対応記録履歴 結果編集■
		StringBuffer sb = new StringBuffer();
		String trTaioKirokRireki = JFUStrConst.EMPTY;
		if (isGasKadenKikitori)
		{
			// 関電ガスｅｏ割（架電希望）
			trTaioKirokRireki = JFUWebCommon.getDispText(ELEC_TR, ELEC_GAS_TR_TAIO_KIROK_RIREKI);
		}
		else
		{
			// eo電気（架電希望）
			trTaioKirokRireki = JFUWebCommon.getDispText(ELEC_TR, ELEC_TR_TAIO_KIROK_RIREKI);
		}
		sb.append(trTaioKirokRireki);
		if (!isBlank)
		{
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(tratCd1_1);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(tratCd1_2);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(mskmNo);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(opeacntStr);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(webDosen);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(elecGuideDayTime);
			sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
			sb.append(elecGuideZokugara);
			if (!JFUWebCommon.isNull(elecGuideSaiten))
			{
				sb.append(JFUStrConst.S_LINE_SEPARAOR_LF);
				sb.append(elecGuideSaiten);
			}
		}
		return sb.toString();
	}

	/**
	 * 受付番号（申込書番号）を取得します。<br>
	 * 
	 * <br>
	 * @param bean：共有フォームbean
	 * @return String
	 */
	private static String getNetUketukeNo(X31SDataBeanAccess[] bean)
	{
		// WEB新規情報
		X31SDataBeanAccess webNewInfoBean = getBeanInfo(bean[0], CommonInfoCFConst.WEB_NEW_INFO);

		// 契約サービス情報取得（ＷＥＢ新規情報/0/契約サービス情報）
		X31SDataBeanAccess keiyakuSvcInfoBean = JFUWebCommon.getDataBeanTypeByPath(bean[0], JFUWebCommon.KEIYAKU_SVC_INFO);
		// eo光ネット取得（ＷＥＢ新規情報/0/ｅｏ光ネット）
		X31SDataBeanAccess eonetBean = JFUWebCommon.getDataBeanTypeByPath(bean[0], JFUWebCommon.EONET);
		// eo光電話取得（ＷＥＢ新規情報/0/ｅｏ光電話）
		X31SDataBeanAccess eotelBean = JFUWebCommon.getDataBeanTypeByPath(bean[0], JFUWebCommon.EOTEL);
		// eo光テレビ取得（ＷＥＢ新規情報/0/ｅｏ光テレビ）
		X31SDataBeanAccess eotvBean = JFUWebCommon.getDataBeanTypeByPath(bean[0], JFUWebCommon.EOTV);
		// eoモバイル取得（ＷＥＢ新規情報/0/ｅｏモバイル）
		X31SDataBeanAccess eomobileBean = JFUWebCommon.getDataBeanTypeByPath(bean[0], JFUWebCommon.EOMOBILE);

		String uketsuke = JFUStrConst.EMPTY;

		// --- ■以下の判定は、申込完了画面のロジックを元に作成■ ---
		// 選択サービス（ネット）が"1"(選択中)の場合
		boolean isNetMskm = false;
		if (!isNullBean(keiyakuSvcInfoBean)
				&& JFUStrConst.SELECT_SVC_NET_CHOICE.equals(keiyakuSvcInfoBean.sendMessageString(CommonInfoCFConst.SELECT_SVC_NET_10,
						X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// eo光ネットタイプ：ホーム・マンション判定
			if (JFUStrConst.MSKM_KSN_SVC_HOME.equals(webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_KSN_SVC_06,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{
				if (!isNullBean(eonetBean))
				{
					isNetMskm = true;
				}
			}
			else if (JFUStrConst.MSKM_KSN_SVC_MANSION.equals(webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_KSN_SVC_06,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// eo光ネットタイプ：マンション・メゾン判定
				if (!isNullBean(eonetBean)
						&& JFUStrConst.MSKM_MNS_TYPE_MANSION.equals(webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_MNS_TYPE_06,
								X31CWebConst.DATABEAN_GET_VALUE)))
				{
					isNetMskm = true;
				}
				else if (!isNullBean(eonetBean)
						&& JFUStrConst.MSKM_MNS_TYPE_MEZON.equals(webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_MNS_TYPE_06,
								X31CWebConst.DATABEAN_GET_VALUE)))
				{
					isNetMskm = true;
				}
			}
			// サービス名・受付番号セット
			if (isNetMskm)
			{
				// 受付番号取得
				uketsuke = eonetBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_11, X31CWebConst.DATABEAN_GET_VALUE);
			}
		}

		// 選択サービス（電話）が"1"(選択中)の場合
		if (!isNullBean(eotelBean)
				&& JFUStrConst.SELECT_SVC_CHOICE.equals(keiyakuSvcInfoBean.sendMessageString(CommonInfoCFConst.SELECT_SVC_TEL_10,
						X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 受付番号取得
			uketsuke = eotelBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_12, X31CWebConst.DATABEAN_GET_VALUE);
		}

		// 選択サービス（テレビ）が"1"(選択中)の場合
		if (!isNullBean(eotvBean)
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(keiyakuSvcInfoBean.sendMessageString(CommonInfoCFConst.SELECT_SVC_TV_10,
						X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 受付番号取得
			uketsuke = eotvBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_13, X31CWebConst.DATABEAN_GET_VALUE);
		}

		// モバイル判定
		if (!isNullBean(eomobileBean)
				&& !isNullOrEmpty(eomobileBean.sendMessageString(CommonInfoCFConst.MOBILE_COURSE_14, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			if (!JFUStrConst.MOBILE_COURSE_NON.equals(eomobileBean.sendMessageString(CommonInfoCFConst.MOBILE_COURSE_14,
					X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// 受付番号取得
				uketsuke = eomobileBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_14, X31CWebConst.DATABEAN_GET_VALUE);
			}
		}

		// 受付番号が取得できない場合は、契約サービス情報 申込書番号を設定
		// ※量販・訪販含め、基本はここに設定される
		if (uketsuke == null || JFUStrConst.EMPTY.equals(uketsuke))
		{
			// 受付番号取得
			uketsuke = keiyakuSvcInfoBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_10, X31CWebConst.DATABEAN_GET_VALUE);
		}

		return uketsuke;
	}

	/**
	 * プロパティから文言を取得して文字列の置換を行います。「対応記録履歴」
	 * 
	 * <br>
	 * @param propKey プロパティキー
	 * @param repStr 「%1%」を置換する文字列
	 * @return 編集結果
	 * @throws Exception
	 */
	private static String getElecWord(String propKey, String repStr) throws Exception
	{
		String wkStr = JFUWebCommon.getDispText(ELEC_TR, propKey);
		if (wkStr == null)
		{
			return JFUStrConst.EMPTY;
		}
		String wkRepStr = JFUStrConst.EMPTY;
		if (repStr != null)
		{
			wkRepStr = repStr;
		}
		wkStr = wkStr.replaceAll(RE_1, wkRepStr);
		return wkStr;
	}

	/**
	 * プロパティから文言を取得して文字列の置換を行います。「対応記録履歴」
	 * 
	 * <br>
	 * @param propKey プロパティキー
	 * @param repStr 「%1%」を置換する文字列
	 * @return 編集結果
	 * @throws Exception
	 */
	private static String getElecWord(String propKey) throws Exception
	{
		String wkStr = JFUWebCommon.getDispText(ELEC_TR, propKey);
		if (wkStr == null)
		{
			return JFUStrConst.EMPTY;
		}
		return wkStr;
	}

	/**
	 * Null又は空文字かどうかを判定する。 <BR>
	 * 
	 * @param value
	 * @return （true:null、または空文字、false:null、または空文字以外）
	 */
	private static boolean isNullOrEmpty(String value)
	{
		return null == value || "".equals(value) || "null".equals(value);
	}

	/**
	 * Beanがnullかどうかを判定する。 <BR>
	 * 
	 * @param value
	 * @return （true:null、false:null以外）
	 */
	private static boolean isNullBean(X31SDataBeanAccess value)
	{
		return null == value;
	}

	/**
	 * 情報取得
	 * 
	 * @param bean　[0]：共有フォームビーン
	 * @param name 取得する情報名
	 * @return bn
	 */
	private static X31SDataBeanAccess getBeanInfo(X31SDataBeanAccess bean, String name)
	{
		X31SDataBeanAccessArray arr = bean.getDataBeanArray(name);
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}

}
