/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：eo光サービス提供条件画面
*   ソースファイル名：FUW00162SFLogic.java
*   作成者          ：富士通
*   日付            ：2013年12月10日
*＜機能概要＞
*   eo光サービス提供条件画面処理用部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v8.00       2013/12/10   FJ)久瀬     新規作成
*
**********************************************************************/
package eo.web.webview.FUW00162SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x33.X33CUtil;
import com.fujitsu.futurity.web.x33.X33WSessionController;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCCcomEncryptionUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0277_FUSV0277OPDBMapper;

/**
 *  eo光サービス提供条件画面のビューロジッククラスです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW00162SFLogic extends JCCWebBusinessLogic
{

	/** ユースケースID（FUSV0277） */
	private static final String USECASE_ID_FUSV0277 = "FUSV0277";

	/** アプリケーションプロパティからMVNOのアクションパラメータを取得するキー */
	private static final String ACTION_MVNO = "FU_ACT_PARAM_MVNO";
	/** アプリケーションプロパティから共通暗号化キーを取得するキー */
	private static final String COMMON_ENCRYPTION_KEY = "COMMON_ENCRYPTION_KEY";

	/** ボディ情報からSYSIDを取得するキー */
	private static final String BODY_KEY_SYSID = "SYSID";
	/** ボディ情報から暗号化キーの値を取得するキー */
	private static final String BODY_KEY_CK = "CK";

	/** 割り込み画面ID付加文字列 */
	private static final String WARIKOMI_GAMEN_ID_FUKA_STR = "0PJP";

	/**
	 * 初期表示処理
	 * サービスフォームBeanの初期化処理を行います。
	 * <br>
	 * @author 富士通
	 * @return true固定
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{

		// ■共有フォームBean
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// ■WEB新規情報
		X31SDataBeanAccess webNewInfoBean = getDataBean(commonInfoBean, CommonInfoCFConst.WEB_NEW_INFO);
		// ■WEB新規情報.リダイレクト情報
		X31SDataBeanAccess redInfoBean = getDataBean(webNewInfoBean, CommonInfoCFConst.REDIRECT_INFO);
		// ■WEB新規情報.mineo情報
		X31SDataBeanAccess mineoInfoBean = getDataBean(commonInfoBean, CommonInfoCFConst.MINEO_SVC_INFO);

		// チェック結果
		boolean chkResult = true;

		// Requestオブジェクトの取得
		X33WSessionController sc = X33CUtil.getSession(this.getSessionId());
		HttpServletRequest req = sc.getServletRequest();

		// ●リクエストパラメータ値チェック
		boolean chkParamResult = chkReqParamVal(req);

		// チェック結果が「false：値不正」の場合、以降の処理を行わず戸建てマンション選択に遷移させる
		if(!chkParamResult)
		{
			DEBUG_LOG.debug("※リクエストパラメータ値不正の為、戸建てマンション選択に遷移させる");
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JFUScreenConst.SCREEN_ID_FUW00147);
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JFUScreenConst.SCREEN_NAME_FUW00147);
			// 割り込み設定
			super.setTransferPageId(JFUScreenConst.SCREEN_ID_FUW00147 + WARIKOMI_GAMEN_ID_FUKA_STR);

			return true;
		}

		// ●リクエストから必要パラメータを取得
		HashMap reqParamsMap = getRequestParams(req);
		// SYSID(Body)
		String bodySysId = (String)reqParamsMap.get(BODY_KEY_SYSID);

		// ●SYSIDチェック
		if(JFUWebCommon.isNull(bodySysId))
		{
			DEBUG_LOG.debug("※SYSIDが正常に取得できませんでした。 SYSID(Body)：" + bodySysId);
			chkResult = false;
		}

		// ●アクションチェック
		// 共有フォームBeanのアクション値を取得
		String commonInfoActVal = redInfoBean.sendMessageString(CommonInfoCFConst.RED_ACTION_17, X31CWebConst.DATABEAN_GET_VALUE);
		// アプリケーションプロパティからアクション値を取得
		String aplActVal = JFUWebCommon.getApplicationConst(ACTION_MVNO);
		if(JFUWebCommon.isNull(aplActVal))
		{
			setErrMsgAplVal(aplActVal);
		}
		// チェック実行
		if(chkResult)
		{
			chkResult = aplActVal.equals(commonInfoActVal);
		}

		if(chkResult)
		{
			// SSO認証チェック
			chkResult = JCCWebCommon.checkSsoToken(req);
		}

		// 申込受付実績登録部品実行
		JFUWebCommon.executeWebMskmUkJskAdd(this);

		// チェック結果で処理を決定
		if (chkResult)
		{
			// ●共有フォームBeanに値を設定
			// SYSID
			webNewInfoBean.sendMessageString(CommonInfoCFConst.SYSID_06, X31CWebConst.DATABEAN_SET_VALUE, bodySysId);
			// mineo同時申込フラグ
			mineoInfoBean.sendMessageString(CommonInfoCFConst.FROM_MINEO_FLG_57, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00002_1);
		}
		else
		{
			// ●遷移先を設定
			// 1つでもチェックがFALSEの場合、戸建てマンション選択に遷移
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JFUScreenConst.SCREEN_ID_FUW00147);
			commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JFUScreenConst.SCREEN_NAME_FUW00147);
			// 割り込み設定
			super.setTransferPageId(JFUScreenConst.SCREEN_ID_FUW00147 + WARIKOMI_GAMEN_ID_FUKA_STR);
		}

		return true;
	}

	/**
	 * 次へボタン押下処理です。
	 * 
	 * <br>
	 * @return
	 * @throws Exception
	 */
	public boolean next() throws Exception
	{
		// 共有フォームBeanのアクセッサーを取得します。
		X31SDataBeanAccess cfBean = getCommonInfoBean();

		// ■共有フォームBean
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// ■WEB新規情報
		X31SDataBeanAccess webNewInfoBean = getDataBean(commonInfoBean, CommonInfoCFConst.WEB_NEW_INFO);
		// ■WEB新規情報.その他情報
		X31SDataBeanAccess elseInfoBean = getDataBean(webNewInfoBean, CommonInfoCFConst.ELSE_INFO);
		// ■WEB新規情報.その他情報
		X31SDataBeanAccess keiInfoBean = getDataBean(webNewInfoBean, CommonInfoCFConst.KEIYAKUSHA_INFO);

		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0277);

		FUSV0277_FUSV0277OPDBMapper mapper = new FUSV0277_FUSV0277OPDBMapper();
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●上りマッピング
		// お客様一意照会
		mapper.setFUSV027701SC(commonInfoBean, dataMap, JPCModelConstant.FUNC_CD_2);
		// 連絡先(コンテンツ用メールアドレス)一覧照会
		mapper.setFUSV027702SC(commonInfoBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// ●サービス呼び出し
		try
		{
			invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●下りマッピング
		// お客様一意照会
		mapper.getFUSV027701SC(commonInfoBean, outputMap);
		// 連絡先(コンテンツ用メールアドレス)一覧照会
		mapper.getFUSV027702SC(commonInfoBean, outputMap);

		// ●共有フォームBeanに値を設定
		// 画面遷移モード
		webNewInfoBean.sendMessageString(CommonInfoCFConst.SCREEN_MODE_06, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.SCREEN_MODE_DEF);
		// 申込区分に追加を設定
		webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_KBN_06, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.MSKM_KBN_ADD);
		// 共有フォームBean.ＷＥＢ新規情報.契約種別にマスター会員を設定
		keiInfoBean.sendMessageString(CommonInfoCFConst.KIIN_SBT_09, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.KIIN_SBT_MASTER);
		// 共有フォームBean.その他情報.回線場所選択に新しい場所に回線追加を設定
		elseInfoBean.sendMessageString(CommonInfoCFConst.KAISEN_SELECT_18, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.KAISEN_SELECT_ADD_NEW_PLACE);
		
		// 遷移先設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW00147);
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW00147);

		return true;
	}

	/**
	 * リクエストパラメータ値をチェックします。
	 * 
	 * <br>
	 * @param req リクエスト
	 * @return チェック結果
	 */
	private boolean chkReqParamVal(HttpServletRequest req)
	{
		boolean result = true;

		// 暗号化キー取得
		String encKey = req.getParameter(BODY_KEY_CK);
		// SYSID
		String encSysid = req.getParameter(BODY_KEY_SYSID);

		// リクエストパラメータ値チェック
		if(JFUWebCommon.isNull(encKey) || JFUWebCommon.isNull(encSysid))
		{
			// 1つでも値が設定されていない場合、falseとする
			result = false;
		}

		return result;
	}

	/**
	 * リクエスト情報から各値を取得します。
	 * 
	 * <br>
	 * @param req HttpServletRequest
	 * @return リクエスト情報
	 */
	@SuppressWarnings("unchecked")
	private HashMap getRequestParams(HttpServletRequest req)
	{
		// 返却用マップ
		HashMap resultMap = new HashMap();

		// ●Body情報を複合化
		// 暗号化キー取得
		String encKey = req.getParameter(BODY_KEY_CK);
		// Body情報取得
		HashMap bodyParamsMap = getDecodedParams(req, encKey);

		// ●結果を格納
		// SYSID(Body)
		resultMap.put(BODY_KEY_SYSID, bodyParamsMap.get(BODY_KEY_SYSID));

		return resultMap;
	}

	/**
	 * パラメータ値の復号化処理を行います。
	 * <br>
	 * @param req HttpServletRequest
	 * @param encKey 暗号化キー（復号未）
	 * @return 各パラメータ値(複合)
	 */
	@SuppressWarnings("unchecked")
	private static HashMap getDecodedParams(HttpServletRequest req, String encKey)
	{
		// 結果格納用マップ
		HashMap decParamsMap = new HashMap();

		// 共通暗号化キーをAPLConstから取得
		String comKey = JCCWebCommon.getApplicationConst(COMMON_ENCRYPTION_KEY);
		// 共通暗号化キーのチェック
		if (JFUWebCommon.isNull(comKey))
		{
			// エラー処理
			setErrMsgAplVal(comKey);
		}

		// 復号化された暗号化キー格納用
		String decodedEncryptionKey = JFUStrConst.EMPTY;

		// ●暗号化キー自信が暗号化されているので、共通暗号化キーで復号する
		try
		{
			// 暗号化キー自信が暗号化されているので、共通暗号化キーで復号する
			decodedEncryptionKey = JCCcomEncryptionUtil.decrypt(comKey, encKey);
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("※暗号化キーの複合化処理でエラー");
			DEBUG_LOG.debug(e.toString());
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●パラメータ(未復号)の取得
		// SYSID
		String encSysid = req.getParameter(BODY_KEY_SYSID);

		// ●パラメータの復号化＆返却マップに格納
		decParamsMap.put(BODY_KEY_SYSID, decodedParam(decodedEncryptionKey, encSysid));

		return decParamsMap;
	}

	/**
	 * パラメータの復号化処理です。
	 * <br>
	 * @param encryptionKey 暗号化キー
	 * @param param パラメータ（復号未）
	 * @return 複合化したパラメータ
	 */
	private static String decodedParam(String encryptionKey, String param)
	{
		String decParam = JFUStrConst.EMPTY;

		if (!JFUWebCommon.isNull(param))
		{
			try
			{
				// 複合化
				decParam = JCCcomEncryptionUtil.decryptKey(encryptionKey, param);
			}
			catch (Exception e)
			{
				// エラー
				DEBUG_LOG.debug("※設定値の複合化処理でエラー 設定値：" + param);
				DEBUG_LOG.debug(e.toString());
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}

		return decParam;
	}

	/**
	 * アプリケーションプロパティのエラー処理です。
	 * 
	 * <br>
	 * @param key キー
	 */
	private static void setErrMsgAplVal(String key)
	{
		DEBUG_LOG.debug("※アプリケーションプロパティに指定されたキーが存在しません。KEY：" + key);
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 設定されたBeanから指定されたBeanを取得します。
	 * 
	 * <br>
	 * @param inBean 取得元のDataBean
	 * @param beanNm 取得するDataBean名
	 * @return DataBean
	 */
	private static X31SDataBeanAccess getDataBean(X31SDataBeanAccess inBean, String beanNm)
	{
		// 設定されたBeanから指定されたBeanを取得
		X31SDataBeanAccessArray bean = inBean.getDataBeanArray(beanNm);

		// 存在チェック
		if (bean == null || bean.getCount() == 0)
		{
			bean.addDataBean();
		}

		return bean.getDataBean(0);
	}
}
