/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：住所検索
 *   ソースファイル名：FUW09902SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年10月21日
 *＜機能概要＞
 *  住所検索のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/10/21   FJ）	     新規作成
 *  v40.00.00    2018/12/10   FJ)澤田    変更【ANK-3248-00-00】引越しNavi対応
 **********************************************************************/

package eo.web.webview.FUW09902SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.Arrays;
import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
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.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.FUW09902SF.FUW09902SFConst;
import eo.web.webview.mapping.FUSV0174_FUSV0174OPDBMapper;
import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;

/**
 * 住所検索画面（フロント）のビューロジッククラスです。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW09902SFLogic extends JCCWebBusinessLogic {
	/** 画面遷移モード：0:通常遷移 */
	private static final String SCREEN_MODE_0 = "0";
	/** 機能コード：1:チェック＆登録 */
	private static final String FUNC_CODE_1 = "1";
	/** 取得パラメータキー：郵便番号１ */
	private static final String PCD_KEY1 = "pcd_1";
	/** 取得パラメータキー：郵便番号２ */
	private static final String PCD_KEY2 = "pcd_2";
	/** メソッド判定文字列：初期表示 */
	private static final String INIT = "init";
	/** メソッド判定文字列：検索 */
	private static final String SEARCH = "search";
	/** メソッド判定文字列：検索 */
	private static final String ERROR = "error";
	/** 検索キー */
	private static final String ADD_INFO_ERR = "add_info";
	/** ページング処理：行番号 */
	private static final String PAGING_GYO_NO = "0";
	/** サービスID */
	private static final String SERVICE_ID = "FUSV0174";
	/** 検索結果マップID */
	private static final String SEARCH_MAP_ID = "FUSV017402SC";
	
	/** 住所検索情報一覧照会 */
	private static final String REL_CHK_TMP_ID_PCD = "EZM0081B080";
	/** プラン変更不可チェックエラー(アイテム) */
	private static final String RELATION_CHECK_PCD = "key_pcd";
	
	/** 郵便番号が単関連チェックエラーになった際のメッセージID */
	private static final String MSGID_PCD_DOMAIN_ERR = "EKF0140-TW";
	
	/** 郵便番号が単関連チェックエラーになった際のメッセージID */
	private static final String MSGID_PCD_KETA_ERR = "EKF0390-NW";
	
	/** DISPTEXT要素取得キー：メッセージID：EKF1500-KWの置換文字(%1) */
	private static final String DISPTEXT_PCD__ERR = "REP_EKF0140-TW";
	
	/** エラーアイテムID：電話番号 */
	private static final String ITEMID_ZIPFRONT = "zip";
	
	/** 住所検索用 */
	private static final String STATE_MODE = "STATE_MODE";
	
	/**
	 * 初期表示処理を行います。
	 * 
	 * @return true
	 * @throws Exception
	 *             例外
	 */
	public boolean init() throws Exception {

		String pcd_1 = "";
		String pcd_2 = "";

		// サービスフォームBean取得
		X31SDataBeanAccess serviceBean = super.getServiceFormBean();

		// ページング情報の設定
		JFUWebCommon.clearPageLinkInfo(this, JFUScreenConst.SCREEN_ID_FUW09902);

		// 親画面からもらう情報をHashMapに設定する
		HashMap paramMap = new HashMap();

		// 親画面からの情報を取得する
		paramMap = JFUWebCommon.getScreenInfo(this,
				JFUScreenConst.SCREEN_ID_FUW09902);

		// 郵便番号
		if ((null != paramMap) && (null != paramMap.get(PCD_KEY1))
				&& (!("".equals(paramMap.get(PCD_KEY1))))
				&& (null != paramMap.get(PCD_KEY2))
				&& (!("".equals(paramMap.get(PCD_KEY2))))) {
			pcd_1 = (String) paramMap.get(PCD_KEY1);
			pcd_2 = (String) paramMap.get(PCD_KEY2);
		}

		serviceBean.sendMessageString(FUW09902SFConst.SRC_PCD,
				X31CWebConst.DATABEAN_SET_VALUE, pcd_1 + pcd_2);
		serviceBean.sendMessageString(FUW09902SFConst.PCD_1,
				X31CWebConst.DATABEAN_SET_VALUE, pcd_1);
		serviceBean.sendMessageString(FUW09902SFConst.PCD_2,
				X31CWebConst.DATABEAN_SET_VALUE, pcd_2);

		// サービスフォームBean都道府県リスト取得
		X31SDataBeanAccessArray arystate = serviceBean
				.getDataBeanArray(FUW09902SFConst.STATE_LIST);
		arystate.clearArray();
		X31SDataBeanAccess statelist = arystate.addDataBean();

		// サービスフォームBean住所リスト取得
		X31SDataBeanAccessArray aryAddress = serviceBean
				.getDataBeanArray(FUW09902SFConst.AD_LIST);
		aryAddress.clearArray();
		X31SDataBeanAccess adresslist = aryAddress.addDataBean();

		// 遷移先画面の設定を行います。
		setNextScreen(SCREEN_MODE_0, JFUScreenConst.SCREEN_ID_FUW09902,
				JFUScreenConst.SCREEN_NAME_FUW09902);

		String stateMode = (String) paramMap.get(STATE_MODE);
		if (stateMode == null)
		{
			stateMode =  "";
		}

		try
		{
			// サービスを呼び出します。
			setService(serviceBean, statelist, adresslist, stateMode, INIT);
		}
		catch (JCCWebServiceException jwse)
		{
			// サービスを呼び出します。
			setService(serviceBean, statelist, adresslist, stateMode, ERROR);
			X31CMessageResult msgRes = jwse.getMessageList();

			for (X31CMessageMoreInfo moreInfo : Arrays.asList(msgRes.getMessageMoreInfoList()))
			{
				// 関連チェック
				// ドメインチェックエラー
				if (String.valueOf(JPCModelConstant.SINGLEDATA_ERR).equals(moreInfo.getStatus())
						&& REL_CHK_TMP_ID_PCD.equals(moreInfo.getTemplateId()) && RELATION_CHECK_PCD.equals(moreInfo.getItemId())
						&& JFUStrConst.DMN_ERR.equals(moreInfo.getItemCheckErr()))
				{
					// メッセージ置換文字列取得
					String replaceTxt = "郵便番号";
					
					// 単項目チェックエラーとしてユーザーに入力内容確認を促す。
					JFUWebCommon.setMessageInfo(this, MSGID_PCD_DOMAIN_ERR, new String[] { replaceTxt }, ITEMID_ZIPFRONT);
					return true;
				}
				
				// 桁数チェックエラー
				if (String.valueOf(JPCModelConstant.SINGLEDATA_ERR).equals(moreInfo.getStatus())
						&& REL_CHK_TMP_ID_PCD.equals(moreInfo.getTemplateId()) && RELATION_CHECK_PCD.equals(moreInfo.getItemId())
						&& JFUStrConst.KETA_ERR.equals(moreInfo.getItemCheckErr()))
				{
					// メッセージ置換文字列取得
					String replaceTxt1 = "郵便番号を入力";
					String replaceTxt2 = "郵便番号を全て入力";
					
					// 単項目チェックエラーとしてユーザーに入力内容確認を促す。
					JFUWebCommon.setMessageInfo(this, MSGID_PCD_KETA_ERR, new String[] { replaceTxt1, replaceTxt2}, ITEMID_ZIPFRONT);
					return true;
				}
			}
			// 上記以外はシステムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		return true;
	}

	/**
	 * 検索ボタン押下時の処理を行います。
	 * 
	 * @return true
	 * @throws Exception
	 *             例外
	 */
	public boolean search() throws Exception {
		String pcd_1 = "";
		String pcd_2 = "";
		String srcPcd = "";// 検索郵便番号

		// サービスフォームBean取得
		X31SDataBeanAccess serviceBean = getServiceFormBean();

		// サービスフォームBean都道府県リスト取得
		X31SDataBeanAccessArray stateValList = serviceBean
				.getDataBeanArray(FUW09902SFConst.STATE_LIST);

		X31SDataBeanAccess stateValBean = stateValList.getDataBean(0);

		// サービスフォームBean住所リスト取得
		X31SDataBeanAccessArray aryAddress = serviceBean
				.getDataBeanArray(FUW09902SFConst.AD_LIST);
		aryAddress.clearArray();
		X31SDataBeanAccess adresslist = aryAddress.addDataBean();

		pcd_1 = serviceBean.sendMessageString(FUW09902SFConst.PCD_1,
				X31CWebConst.DATABEAN_GET_VALUE);
		pcd_2 = serviceBean.sendMessageString(FUW09902SFConst.PCD_2,
				X31CWebConst.DATABEAN_GET_VALUE);
		// 検索郵便番号
		if (pcd_1 != null && pcd_2 != null) {
			srcPcd = pcd_1 + pcd_2;
			serviceBean.sendMessageString(FUW09902SFConst.SRC_PCD,
					X31CWebConst.DATABEAN_SET_VALUE, srcPcd);
		}

		// 選択された都道府県のindexを取得します。
		String index = serviceBean.sendMessageString(FUW09902SFConst.SRC_STATE,
				X31CWebConst.DATABEAN_GET_VALUE);

		// indexより都道府県名を取得します。
		String state_nm = stateValBean.sendMessageString(
				FUW09902SFConst.FUKEN_NAME_LIST_01,
				X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(index));

		// 検索都道府県名称をセットします。
		serviceBean.sendMessageString(FUW09902SFConst.SRC_STATE,
				X31CWebConst.DATABEAN_SET_VALUE, state_nm);

		// サービスを呼び出します。
		setService(serviceBean, null, adresslist, "", SEARCH);
		
		// 検索府県名称をindexに置き換えなおします。
		serviceBean.sendMessageString(FUW09902SFConst.SRC_STATE,
				X31CWebConst.DATABEAN_SET_VALUE, index);

		// 遷移先画面の設定を行います。
		setNextScreen(SCREEN_MODE_0, JFUScreenConst.SCREEN_ID_FUW09902,
				JFUScreenConst.SCREEN_NAME_FUW09902);

		return true;
	}

	/**
	 * ページングを処理します。 <br>
	 * 
	 * @return boolean
	 * @throws Exception
	 */
	public boolean paging() throws Exception {
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 検索処理を行います。
		if (!search()) {
			return false;
		}

		// 行番号
		serviceFormBean.sendMessageString(FUW09902SFConst.L_NO_02,
				X31CWebConst.DATABEAN_SET_VALUE, PAGING_GYO_NO);

		// 遷移先画面の設定を行います。
		setNextScreen(SCREEN_MODE_0, JFUScreenConst.SCREEN_ID_FUW09902,
				JFUScreenConst.SCREEN_NAME_FUW09902);

		return true;
	}

	/**
	 * サービス呼出処理を行います。
	 * 
	 * @param bean
	 *            : サービスフォームBeanのインスタンス
	 * @param statebean
	 *            : 都道府県リストのインスタンス
	 * @param addbean
	 *            : 住所リストのインスタンス
	 * @return 成否
	 * @throws Exception
	 *             データベースアクセスエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private boolean setService(X31SDataBeanAccess bean,
			X31SDataBeanAccess statebean, X31SDataBeanAccess addbean,
			String stateMode,
			String method) {
		String srcPst = "";
		String state_search_flg = "";// 都道府県一覧取得処理
		String address_search_flg = "";// 住所一覧取得処理

		// 結果表示フラグに"0"(非表示)を設定します。
		bean.sendMessageString(FUW09902SFConst.RET_INIT_FLG,
				X31CWebConst.DATABEAN_SET_VALUE, "0");

		// paramMapを生成します。
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);

		// マッピングクラスのインスタンスを生成します。
		FUSV0174_FUSV0174OPDBMapper mapper = new FUSV0174_FUSV0174OPDBMapper();

		// 検索用郵便番号取得
		srcPst = bean.sendMessageString(FUW09902SFConst.SRC_PCD,
				X31CWebConst.DATABEAN_GET_VALUE);

		// 上りマッピング用
		HashMap dataMap = new HashMap();

		// 実行判定用フラグ設定
		if (method.equals(ERROR)) 
		{
			//mapper.setFUSV017401SC(bean, dataMap, FUNC_CODE_1); // 都道府県一覧照会
			//都道府県モードが１の場合
			if ("1".equals(stateMode))
			{
				mapper.setMskmUcwkMap(bean, dataMap, FUNC_CODE_1, JFUWebCommon.getOpeDate(this, null)); // 都道府県一覧照会
			}
			else
			{
			mapper.setFUSV017401SC(bean, dataMap, FUNC_CODE_1); // 都道府県一覧照会
			}
			state_search_flg = "1";
			
		}else if (method.equals(INIT)) {
			
			//mapper.setFUSV017401SC(bean, dataMap, FUNC_CODE_1); // 都道府県一覧照会
			//都道府県モードが１の場合
			if ("1".equals(stateMode))
			{
				mapper.setMskmUcwkMap(bean, dataMap, FUNC_CODE_1, JFUWebCommon.getOpeDate(this, null)); // 都道府県一覧照会
			}
			else
			{
			mapper.setFUSV017401SC(bean, dataMap, FUNC_CODE_1); // 都道府県一覧照会
			}
			state_search_flg = "1";
			
			// 検索用郵便番号に値があれば、都道府県一覧取得処理を行う。
			if (srcPst.length() > 0) {
				mapper.setFUSV017402SC(bean, dataMap, FUNC_CODE_1); // 住所検索情報一覧照会
				address_search_flg = "1";
			}
		} else if (method.equals(SEARCH)) {
			
			mapper.setFUSV017402SC(bean, dataMap, FUNC_CODE_1); // 住所検索情報一覧照会
			address_search_flg = "1";
		}

		if (address_search_flg.equals("1")) {
			// ページング用マップ取得
			HashMap<String, Object> pagingMap = (HashMap) dataMap
					.get("FUSV017402SC");

			// 検索処理パターン設定
			pagingMap.put(JFUStrConst.PAGING_INFO_SEARCH_TYPE,
					JPCModelConstant.SAERCH_TYPE_BBN);
			// 最大検索件数設定
			pagingMap.put(JFUStrConst.PAGING_INFO_MAX_SEARCH_NUM, JFUWebCommon
					.getSearchConst("FUW09902_MAX_SHOW_CNT"));
			// 表示件数設定
			pagingMap.put(JFUStrConst.PAGING_INFO_DISPLAY_NUM, JFUWebCommon
					.getSearchConst("FUW09902_ROW_PER_PAGE"));
			// ページング初期設定
			JFUWebCommon.upmapperPageLinkInfo(this, "0", SEARCH_MAP_ID,
					dataMap);
		}

		// 検索結果格納用マップを生成します。
		HashMap outputMap = new HashMap();

		// サービスを呼び出します。
		X31CMessageResult msgResult = invokeService(paramMap, dataMap,
				outputMap);

		// 都道府県一覧照会の取り出し
		if (state_search_flg != null && state_search_flg.equals("1")) {
			//都道府県モードが１の場合
			if ("1".equals(stateMode))
			{
				mapper.getMskmUcwkMap(statebean, outputMap);
			}
			else
			{
			mapper.getFUSV017401SC(statebean, outputMap);
			}
		}

		// 住所検索情報一覧照会の取り出し
		if (address_search_flg != null && address_search_flg.equals("1")) {
			mapper.getFUSV017402SC(addbean, outputMap);

			// 検索エラーフラグの取得
			String searchError = JFUWebCommon.getSearchErrFlg(SEARCH_MAP_ID,
					outputMap);
			if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchError)) {
				// 検索結果が0件の場合の処理
				JFUWebCommon.setMessageInfo(this
								,JPCOnlineMessageConstant.EKB0330__I
								,ADD_INFO_ERR);
				// 結果表示フラグに"1"(表示)を設定します。
				bean.sendMessageString(FUW09902SFConst.RET_INIT_FLG,
						X31CWebConst.DATABEAN_SET_VALUE, "0");
				// 検索ボタン押下フラグに"1"(押下)を設定します。
				bean.sendMessageString(FUW09902SFConst.SRC_BTN_FLG,
						X31CWebConst.DATABEAN_SET_VALUE, "1");
				return true;
			} else if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX
					.equals(searchError)) {
				// 検索最大件数がオーバーした場合の処理
				JFUWebCommon.setMessageInfo(this,
						JPCOnlineMessageConstant.EKB0340__I,
						new String[] { (String) ((HashMap<?, ?>) dataMap
								.get(SEARCH_MAP_ID)).get("max_search_num") },
						ADD_INFO_ERR);
				// 結果表示フラグに"1"(表示)を設定します。
				bean.sendMessageString(FUW09902SFConst.RET_INIT_FLG,
						X31CWebConst.DATABEAN_SET_VALUE, "0");
				// 検索ボタン押下フラグに"1"(押下)を設定します。
				bean.sendMessageString(FUW09902SFConst.SRC_BTN_FLG,
						X31CWebConst.DATABEAN_SET_VALUE, "1");
				return true;
			}

			// ページング情報の設定
			JFUWebCommon.downmapperPageLinkInfo(this, "0", SEARCH_MAP_ID,
					outputMap);

			// 検索のコマンドIDを設定する。
			JFUWebCommon.setSearchCommand(this, "PAGING");

			// 結果表示フラグに"1"(表示)を設定します。
			bean.sendMessageString(FUW09902SFConst.RET_INIT_FLG,
					X31CWebConst.DATABEAN_SET_VALUE, "1");
			// 検索ボタン押下フラグに"1"(押下)を設定します。
			bean.sendMessageString(FUW09902SFConst.SRC_BTN_FLG,
					X31CWebConst.DATABEAN_SET_VALUE, "1");

		}

		return true;

	}

	/**
	 * 画面遷移先を設定します。
	 * 
	 * @author 富士通
	 * @param screenMode
	 * @param nextScreenId
	 *            遷移先画面ＩＤ
	 * @param nextScreenName
	 *            遷移先画面名
	 * 
	 */
	private void setNextScreen(String screenMode, String nextScreenId,
			String nextScreenName) {
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// WEB新規情報
		X31SDataBeanAccess bn = getWebInfo(commoninfoBean);

		bn.sendMessageString(CommonInfoCFConst.SCREEN_MODE_06,
				X31CWebConst.DATABEAN_SET_VALUE, screenMode);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		DEBUG_LOG.debug(String.format("遷移先 CD：%s NM：%s", nextScreenId,
				nextScreenName));
	}

	/**
	 * WEB新規情報のインスタンスを取得します。
	 * 
	 * @param bean
	 * @return bn
	 */
	@SuppressWarnings("unchecked")
	private X31SDataBeanAccess getWebInfo(X31SDataBeanAccess bean) {

		X31SDataBeanAccessArray arr = bean
				.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO);
		if (arr.getCount() == 0) {
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}

}