/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：取扱店ログイン(量販・訪販)
 *   ソースファイル名：FUW00901SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2012年06月18日
 *＜機能概要＞
 *  担当者ログイン(量販・訪販)のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00.00    2012/06/18   FJ）大塚    新規作成
 *   v5.00.00    2013/04/19   FJ）大村    Cookie制御(Cookie存在時は担当者ログイン画面に遷移)
 *   v29.00.00   2017/02/09   FJ）川島    【ANK-3112-00-00】訪販チャネルのタブレット対応
 *   v29.00.00   2017/03/10   FJ）岡井    【IT1-2017-0000020】タブレット区分の保持対応
 *   v35.00      2017/11/06   FJ) 美濃原  【ANK-3319-00-00】auショップでのタブレット申し込み対応
 *   v70.00      2024/02/05   FJ) 美濃原  【ANK-4551-00-00】202404CP対応
 **********************************************************************/
package eo.web.webview.FUW00901SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CHashMap;
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.DispatchContext;
import com.fujitsu.futurity.web.x33.DispatchContextFactory;
import com.fujitsu.futurity.web.x33.HttpDispatchContext;
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.constant.JPCOnlineMessageConstant;
import eo.common.util.JCCFrameworkException;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0228_FUSV0228OPDBMapper;

/**
 * 担当者ログインのビューロジッククラスです。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW00901SFLogic extends JCCWebBusinessLogic
{
	/** ユースケースID（FUSV0228） */
	private static final String USECASE_ID_FUSV0228 = "FUSV0228";
	/** 画面エラー用のid */
	private static final String TRATCD = "tratcd";
	/** 画面エラー用のid */
	private static final String STR_TRAT_CD = "正しい取扱コード";
	/** 画面エラー用のid */
	private static final String STR_TRAT_CD2 = "正しい取扱コード";
	/** 画面エラー用のid */
	private static final String INPUT = "入力";

	/** 有効なCookieが設定されているかどうかの判断を行うCookieのKEY */
	private static final String TRAT_CD = "trat_cd";
	/** 有効なCookieが設定されているかどうかの判断を行うCookieのKEY */
	private static final String TRAT_NM = "trat_nm";
	/** 有効なCookieが設定されているかどうかの判断を行うCookieのKEY */
	private static final String HANBAI_TYPE = "hanbai_type";
	
// ANK-3112-00-00 ADD START
	/** タブレットか判定するためのキー */
	private static final String PARAM_KEY_TABLET = "kbn";
	/** タブレットか判定するための値 */
	private static final String PARAM_VALUE_TABLET = "tablet";
	/** タブレットフラグ - タブレット端末での申込 */
	private static final String TABLET_FLG_TABLET = "1";
	/** タブレットフラグ - クッキー用項目 */
	private static final String TABLET_FLG = "tflg";
// ANK-3112-00-00 ADD END

	/**
	 * 初期表示処理 <BR>
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		// ●共有フォームBeanの取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// ●フロント共有情報を取得
		X31SDataBeanAccess frontCommonInfoBean = getFrontCommonInfo(commonInfoBean);

		// フロント区分を設定
		frontCommonInfoBean.sendMessageString(CommonInfoCFConst.FU_KBN_05, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.FU_KBN_R);
		
		//クッキーが存在する場合は、担当者ログインへ直接遷移 >>>
		Map<String, String> cookieMap = getCookie();
		String trat_nm = cookieMap.get(TRAT_NM);
		String trat_cd = cookieMap.get(TRAT_CD);
		String hanbai_type = cookieMap.get(HANBAI_TYPE);
		String tablet_flg = cookieMap.get(TABLET_FLG);

		// ANK-3112-00-00 ADD START
		// ●WEB新規情報を取得
		X31SDataBeanAccess webNewInfoBean = getWebNewInfo(commonInfoBean);

		// タブレットから遷移してきたか判定する
		X31CHashMap reqParams  = this.getRequestParams();
		if(null != reqParams && PARAM_VALUE_TABLET.equals(reqParams.get(PARAM_KEY_TABLET)) || TABLET_FLG_TABLET.equals(tablet_flg))
		{
			// cookieに設定する値(一時的に保存、ブラウザが閉じられたら削除)
			HashMap<String, String> cookieTempMap = new HashMap<String, String>();
			cookieTempMap.put(TABLET_FLG, TABLET_FLG_TABLET);
			setCookieTemporary(cookieTempMap);

			webNewInfoBean.sendMessageString(CommonInfoCFConst.TABLET_FLG_06, X31CWebConst.DATABEAN_SET_VALUE, TABLET_FLG_TABLET);
		}
		// ANK-3112-00-00 ADD END

		if (trat_nm != null  && trat_cd != null && hanbai_type != null)
		{
//			DEBUG_LOG.info("----- ★★★Cookie★★★ 有 -----");
			// サービスフォームBean
			X31SDataBeanAccess serviceFormBean = getServiceFormBean();
			serviceFormBean.sendMessageString(FUW00901SFConst.DSP_TRAT_CD_NM_01, X31CWebConst.DATABEAN_SET_VALUE, trat_nm);
			serviceFormBean.sendMessageString(FUW00901SFConst.TRAT_CD, X31CWebConst.DATABEAN_SET_VALUE, trat_cd);
			serviceFormBean.sendMessageString(FUW00901SFConst.FRNT_LOGIN_CTRL_CD_01, X31CWebConst.DATABEAN_SET_VALUE, hanbai_type);
			//ログインボタン押下処理を呼び出す
			login();
		}
		else
		{
//			DEBUG_LOG.info("----- ★★★Cookie★★★ 無 -----");
		
			// 自画面ID設定
			this.setNextScreenInfo(JFUScreenConst.SCREEN_ID_FUW00901, JFUScreenConst.SCREEN_NAME_FUW00901);
		}
		//クッキーが存在する場合は、担当者ログインへ直接遷移 <<<E
		return true;
	}

	/**
	 * ログインボタン押下処理 <BR>
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean login() throws Exception
	{
		// 代理店情報取得サービス
		this.callFUSV0228Service();

		// サービスフォームBean
		X31SDataBeanAccess serviceFormBean = getServiceFormBean();

		// 検索件数をチェック
		Integer iResultCount = serviceFormBean.getDataBeanArray(FUW00901SFConst.AGNT_CD_LIST).getCount();

		// 検索結果が0件
		if (iResultCount < 1)
		{
			// 取扱コードの存在チェックエラー表示
			JFUWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKF0420_TW, new String[] { STR_TRAT_CD, INPUT }, TRATCD);
			this.setNextScreenInfo(JFUScreenConst.SCREEN_ID_FUW00901, JFUScreenConst.SCREEN_NAME_FUW00901);
			return true;
		}

		// cookieに設定する値
		HashMap<String, String> cookieMap = new HashMap<String, String>();

		// 入力から取扱コード取得
		String trat_cd = serviceFormBean.sendMessageString(FUW00901SFConst.TRAT_CD, X31CWebConst.DATABEAN_GET_VALUE);

		// 取扱コード(取扱ID)
		cookieMap.put(TRAT_CD, trat_cd);

		X31SDataBeanAccess agntBean = serviceFormBean.getDataBeanArray(FUW00901SFConst.AGNT_CD_LIST).getDataBean(0);

		// ●共有フォームBeanの取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// ●WEB新規情報を取得
		X31SDataBeanAccess webNewInfoBean = getWebNewInfo(commonInfoBean);

		// ●その他情報を取得
		X31SDataBeanAccess elseInfoBean = getelseInfo(webNewInfoBean);

		// 共有フォームBeanに設定する。

		// 取扱コード → その他情報.取扱店用取扱コード
		cpStr(elseInfoBean, CommonInfoCFConst.TORITEN_TORIATSUKAI_CD_18, serviceFormBean, FUW00901SFConst.TRAT_CD);

		// 取扱店名
		cpStr(elseInfoBean, CommonInfoCFConst.TORIATSUKAI_NM_18, agntBean, FUW00901SFConst.DSP_TRAT_CD_NM_01);

		// 取扱店ID
		cpStr(elseInfoBean, CommonInfoCFConst.TORIATSUKAI_ID_18, serviceFormBean, FUW00901SFConst.TRAT_CD);

		// ａｕショップ取扱フラグ
		elseInfoBean.sendMessageString(CommonInfoCFConst.AU_SHOP_TRAT_FLG_18, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getAuShopFlg(trat_cd));

		// フロントログイン制御コードを取得
		String type = agntBean.sendMessageString(FUW00901SFConst.FRNT_LOGIN_CTRL_CD_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 販売タイプを設定
		if (JFUStrConst.CD01400_3.equals(type) || JFUStrConst.CD01400_1.equals(type))
		{
			// 量販
			webNewInfoBean.sendMessageString(CommonInfoCFConst.HANBAI_TYPE_06, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.HNBAI_TYPE_RYOHAN);
			cookieMap.put(HANBAI_TYPE, JFUStrConst.HNBAI_TYPE_RYOHAN);
		}
		else if (JFUStrConst.CD01400_2.equals(type) || JFUStrConst.CD01400_4.equals(type))
		{
			// 訪販
			webNewInfoBean.sendMessageString(CommonInfoCFConst.HANBAI_TYPE_06, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.HNBAI_TYPE_HOHAN);
			cookieMap.put(HANBAI_TYPE, JFUStrConst.HNBAI_TYPE_HOHAN);
		}
		else
		{
			// 取扱コードの妥当性チェックエラー表示
			JFUWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKF0420_TW, new String[] { STR_TRAT_CD2, INPUT }, TRATCD);
			this.setNextScreenInfo(JFUScreenConst.SCREEN_ID_FUW00901, JFUScreenConst.SCREEN_NAME_FUW00901);
			return true;
		}

		// 取扱店名
		String trat_nm = agntBean.sendMessageString(FUW00901SFConst.DSP_TRAT_CD_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		cookieMap.put(TRAT_NM, trat_nm);

		setCookie(cookieMap);

		// 申込区分（新規固定）
		webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_KBN_06, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.MSKM_KBN_NEW);
		// 申込経路 (ANK-4551-00-00)
		String mskmRoute = JFUWebCommon.getMskmRoute(this);
		webNewInfoBean.sendMessageString(CommonInfoCFConst.MSKM_ROUTE_06, X31CWebConst.DATABEAN_SET_VALUE, mskmRoute);

		this.setNextScreenInfo(JFUScreenConst.SCREEN_ID_FUW00902, JFUScreenConst.SCREEN_NAME_FUW00902);

		// 画面IDを設定
		JFUWebCommon.setScreenId(this, JFUScreenConst.SCREEN_ID_FUW00902, JFUScreenConst.SCREEN_ID_FUW00901);

		//クッキーが存在する場合は、担当者ログインへ直接遷移 >>>
		super.setTransferPageId("FUW009020PJP");//担当者ログイン画面を指定
		//クッキーが存在する場合は、担当者ログインへ直接遷移 >>>

		return true;
	}

	/**
	 * 代理店情報取得サービスを呼び出す。
	 * 
	 * @throws Exception
	 */
	private void callFUSV0228Service() throws Exception
	{
		// サービスフォームBean
		X31SDataBeanAccess serviceFormBean = getServiceFormBean();

		HashMap<String, String> paramMap = new HashMap<String, String>();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0228);

		// 設定値格納用マップを生成。
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// 予約適用年月日を設定
		serviceFormBean.sendMessageString(FUW00901SFConst.RSV_APLY_YMD, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getOpeDate(this, null));

		X31SDataBeanAccess[] paramBean = { serviceFormBean };

		// DataBean-BPマッピング
		FUSV0228_FUSV0228OPDBMapper mapper = new FUSV0228_FUSV0228OPDBMapper();

		// サービスの入力値設定
		// 機能コード:"2"
		mapper.setFUSV022801SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);

		try
		{
			// サービス呼出
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException jwse)
		{
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };
		mapper.getFUSV022801SC(paramBeanOut, outputMap);
	}

	/**
	 * Bean項目の転記(記述シンプル化目的)
	 * 
	 * @param t_bean 転記先Bean(to)
	 * @param t_name 転記先項目名
	 * @param f_bean 転記元Bean(from)
	 * @param f_name 転記元項目名
	 */
	private void cpStr(X31SDataBeanAccess t_bean, String t_name, X31SDataBeanAccess f_bean, String f_name)
	{
		t_bean.sendMessageString(t_name, X31CWebConst.DATABEAN_SET_VALUE, f_bean.sendMessageString(f_name, X31CWebConst.DATABEAN_GET_VALUE));
	}

	/**
	 * WEB新規情報
	 * 
	 * @param commonInfoBean
	 * @return webNewInfoBean
	 */
	private X31SDataBeanAccess getWebNewInfo(X31SDataBeanAccess commonInfoBean)
	{
		X31SDataBeanAccessArray array = commonInfoBean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO);
		if (array.getCount() == 0)
		{
			array.addDataBean();
		}
		X31SDataBeanAccess webNewInfoBean = array.getDataBean(0);

		return webNewInfoBean;
	}

	/**
	 * フロント共有情報
	 * 
	 * @param commonInfoBean
	 * @return frontCommonInfoBean
	 */
	private X31SDataBeanAccess getFrontCommonInfo(X31SDataBeanAccess commonInfoBean)
	{
		X31SDataBeanAccessArray array = commonInfoBean.getDataBeanArray(CommonInfoCFConst.FRONT_COMMON_INFO);
		if (array.getCount() == 0)
		{
			array.addDataBean();
		}
		X31SDataBeanAccess frontCommonInfoBean = array.getDataBean(0);

		return frontCommonInfoBean;

	}

	/**
	 * その他情報
	 * 
	 * @param webNewInfoBean
	 * @return elseInfoBean
	 */
	private X31SDataBeanAccess getelseInfo(X31SDataBeanAccess webNewInfoBean)
	{
		X31SDataBeanAccessArray array = webNewInfoBean.getDataBeanArray(CommonInfoCFConst.ELSE_INFO);
		if (array.getCount() == 0)
		{
			array.addDataBean();
		}
		X31SDataBeanAccess elseInfoBean = array.getDataBean(0);

		return elseInfoBean;
	}

	/**
	 * 共有フォームBeanに遷移先情報を設定する。 <BR>
	 * 
	 * @param pstrNextScreenId 遷移先画面ID
	 * @param pstrNextScreenName 遷移先画面名
	 */
	private void setNextScreenInfo(String pstrNextScreenId, String pstrNextScreenName)
	{

		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// 遷移先画面ID
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, pstrNextScreenId);

		// 遷移先画面名
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, pstrNextScreenName);
	}

	
	//クッキーが存在する場合は、担当者ログインへ直接遷移 >>>
	/**
	 * Cookieの取得処理です。
	 * 
	 * @return map クッキー情報
	 */
	private Map getCookie()
	{
		Map<String, String> cookieMap = new HashMap<String, String>();
		
//		DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
//		HttpServletRequest request = ((HttpDispatchContext)context).getServletRequest();
		
		// Requestオブジェクトの取得
		X33WSessionController sc = X33CUtil.getSession(this.getSessionId());
		HttpServletRequest request = sc.getServletRequest();

		Cookie[] cookies = request.getCookies();
		if (null == cookies || cookies.length == 0)
		{
			return cookieMap;
		}
		for (Cookie cookie : cookies)
		{
			if (cookie != null)
			{
				cookieMap.put(cookie.getName(), cookie.getValue());
				DEBUG_LOG.info("----- ★★★Cookie★★★ -----" + cookie.getName() + ":" + cookie.getValue());
			}
		}
		return cookieMap;
	}
	//クッキーが存在する場合は、担当者ログインへ直接遷移 <<<E
	
	/**
	 * Cookieの生成処理です。
	 * 
	 * @param map クッキー情報
	 */
	private static void setCookie(HashMap<String, String> map)
	{

		// String cookieDomain = "ek4owh01.test-order.eonet.jp";
		// String cookiePath = "/";
		// String cookieAge = "999999999";
		// String cookieSecure = "true";
		// String cookieUrlencode = "UTF-8";

		// アプリケーションプロパティファイルよりCookieの属性値を取得する。
		String domain = getAplConstVal("RYOHAN_COOKIE_DOMAIN");
		String path = getAplConstVal("RYOHAN_COOKIE_PATH");
		String age = getAplConstVal("RYOHAN_COOKIE_AGE");
		String isSecure = getAplConstVal("RYOHAN_COOKIE_SECURE");
		String urlEncode = getAplConstVal("RYOHAN_COOKIE_URLENCODE");

		DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
		HttpServletResponse res = ((HttpDispatchContext)context).getServletResponse();

		try
		{
			Set<Entry<String, String>> entrys = map.entrySet();
			for (Entry<String, String> entry : entrys)
			{
				String key = entry.getKey();
				String value = entry.getValue();
				String valueEn = URLEncoder.encode(value, urlEncode);

				// Cookieオブジェクトの生成
				Cookie cookie = new Cookie(key, valueEn);

				// Cookieへ属性を設定する。
				cookie.setDomain(domain); // Cookieの有効ドメインを設定
				cookie.setPath(path); // Cookieの有効パスを設定
				cookie.setMaxAge(Integer.parseInt(age)); // Cookieの最長存続期間を設定
				cookie.setSecure(Boolean.parseBoolean(isSecure)); // Cookieのsecure属性を設定

				// Cookieのセット
				res.addCookie(cookie);
			}
		}
		catch (UnsupportedEncodingException ue)
		{
			throw new JCCFrameworkException("不正なエンコードが指定されました。", ue);
		}
	}

	/**
	 * アプリケーションプロパティファイル値の取得処理です。
	 * 
	 * @param key キー
	 * @return 値
	 */
	private static String getAplConstVal(String key)
	{
		String value = JFUWebCommon.getApplicationConst(key);
		// アプリケーションプロパティファイルの必須チェック
		if (JFUWebCommon.isNull(value))
		{
			throw new JCCFrameworkException("APLConst.propertiesに" + key + "が設定されていません。");
		}
		return value;
	}

	/**
	 * 一時的なCookie情報を生成します。
	 * 
	 * @param map クッキー情報
	 */
	private static void setCookieTemporary(HashMap<String, String> map)
	{

		// アプリケーションプロパティファイルよりCookieの属性値を取得する。
		String domain = getAplConstVal("RYOHAN_COOKIE_DOMAIN");
		String path = getAplConstVal("RYOHAN_COOKIE_PATH");
		String isSecure = getAplConstVal("RYOHAN_COOKIE_SECURE");
		String urlEncode = getAplConstVal("RYOHAN_COOKIE_URLENCODE");

		DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
		HttpServletResponse res = ((HttpDispatchContext)context).getServletResponse();

		try
		{
			Set<Entry<String, String>> entrys = map.entrySet();
			for (Entry<String, String> entry : entrys)
			{
				String key = entry.getKey();
				String value = entry.getValue();
				String valueEn = URLEncoder.encode(value, urlEncode);

				// Cookieオブジェクトの生成
				Cookie cookie = new Cookie(key, valueEn);

				// Cookieへ属性を設定する。
				cookie.setDomain(domain); 							// Cookieの有効ドメインを設定
				cookie.setPath(path); 								// Cookieの有効パスを設定
				cookie.setSecure(Boolean.parseBoolean(isSecure)); 	// Cookieのsecure属性を設定

				// Cookieのセット
				res.addCookie(cookie);
			}
		}
		catch (UnsupportedEncodingException ue)
		{
			throw new JCCFrameworkException("不正なエンコードが指定されました。", ue);
		}
	}
}
