/*********************************************************************
* All Rights reserved, Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム共通（共通マスタ）
*   モジュール名    ：ZMW04501SFLogic
*   ソースファイル名：ZMW04501SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年04月18日
*＜機能概要＞
*   固定ＩＰアドレス更新のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00       2011/04/18   FJ）岩元    新規作成
*   v3.00       2012/01/31   FJ）岩元    【UIZ-0004-00-00】視認性向上No.4
*
**********************************************************************/

package eo.web.webview.ZMW04501SF;

import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JZMScreenConst;
import eo.web.webview.common.JZMWebCommon;
import eo.web.webview.common.JZMWebConst;
import eo.web.webview.mapping.ZMSV0039_ZMSV0039OPDBMapper;
import eo.web.webview.mapping.ZMSV0040_ZMSV0040OPDBMapper;

/**
 * 固定ＩＰアドレス更新のビューロジックです。
 * @author 909281
 *
 */
@SuppressWarnings("serial")
public class ZMW04501SFLogic extends JCCWebBusinessLogic
{

	/** メッセージ置き換え文字 */
	private static final String[] ERROR_MESSAGE = {"固定ＩＰアドレス", "情報"};
	
	/** メッセージID EKB0370--I  */
	private static final String MESSAGE_ID_370 = JPCOnlineMessageConstant.EKB0370__I;

	/** メッセージID EKB0380--I  */
	private static final String MESSAGE_ID_380 = JPCOnlineMessageConstant.EKB0380__I;

	/** メッセージ置換文字列  */
	private static final String[] MESSAGE_VALUE = {"固定ＩＰアドレス情報更新"};

	/** 機能コード１  */
	private static final String FUNC_CD_1 = JPCModelConstant.FUNC_CD_1;

	/** 機能コード２  */
	private static final String FUNC_CD_2 = JPCModelConstant.FUNC_CD_2;

	/** 数値の正規表現 */
	private static final String NUMBER_REGEX = "[0-9]+";

	
	/**
	 * NGワード更新初期表示処理を行います。
	 * <br>
	 * @return 処理結果 
	 * @throws Exception 予期せぬエラー
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commonBean = getCommonInfoBean();
		
		if(JZMWebCommon.getScreenInfo(this) == null)
		{
			setBackScreenId(commonBean, true);
			return true;
		}

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// ユースケースIDの設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV39);
		
		// マッピングクラスのインスタンスを生成
		ZMSV0039_ZMSV0039OPDBMapper mapper = new ZMSV0039_ZMSV0039OPDBMapper();
		mapper.setZMSV003901SC(paramBean, dataMap, FUNC_CD_1);
		
		// 基準日を設定する
		if(dataMap.containsKey(JZMWebConst.SC3901))
		{
			HashMap<String, Object> inDataMap = (HashMap<String, Object>)dataMap.get(JZMWebConst.SC3901);
			inDataMap.put(JZMWebConst.KEY_STDARDYMD, JZMWebCommon.getOpeDate(this, null));
		}
		
		//エイジング処理区分に0を設定する
		JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.AGING_TRAN_DIV, JZMWebConst.ZERO);
		
		//マッピングを行う
		mapper.setZMSV003902SC(paramBean, dataMap, FUNC_CD_1);
		
		//エイジングＮｏが存在する場合マッピングを行う。
		String agingNo = JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_NO);
		
		boolean hasAgingNo = agingNo != null && !JZMWebConst.BLANK.equals(agingNo);
		
		// エイジングのマッピングを行う
		if(hasAgingNo)
		{
			mapper.setZMSV003903SC(paramBean, dataMap, FUNC_CD_1);
		}
		else
		{
			
			//エイジング番号が存在しない場合はエイジングステータス名称になしを設定する
			JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.AGING_STAT_NM, JZMWebConst.BLANK_NASI);
		}
		
		// サービスの呼び出し
		invokeService(paramMap, dataMap, outputMap);
		
		// マッピングクラスの呼び出し
		mapper.getZMSV003901SC(paramBean, outputMap);
		mapper.getZMSV003902SC(paramBean, outputMap);
		mapper.getZMSV003903SC(paramBean, outputMap);
		
		// 検索エラーフラグの取得
		String searchErrFlg = JZMWebCommon.getSearchErrFlg(JZMWebConst.SC3902, outputMap);
		
		// 検索エラーの場合、呼び元画面に強制遷移をする。
		if(JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(searchErrFlg))
		{
			
			JZMWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0300_KW, ERROR_MESSAGE);
			setBackScreenId(commonBean, true);
			return true;
		}
		
		if(hasAgingNo)
		{
			
			searchErrFlg = JZMWebCommon.getSearchErrFlg(JZMWebConst.SC3903, outputMap);
				
			if(JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
			{
				
				//エイジング番号が存在しない場合はエイジングステータス名称になしを設定する
				JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.AGING_STAT_NM, JZMWebConst.BLANK_NASI);
			}
		}
		
		// 適用開始年月日を分割設定する
		JZMWebCommon.setSplitYmd(bean,
				ZMW04501SFConst.TSTAYMD,
				ZMW04501SFConst.TSTAYMD_YEAR,
				ZMW04501SFConst.TSTAYMD_MON,
				ZMW04501SFConst.TSTAYMD_DAY);
		
		// 適用終了年月日を分割設定する
		JZMWebCommon.setSplitYmd(bean,
				ZMW04501SFConst.TENDYMD,
				ZMW04501SFConst.TENDYMD_YEAR,
				ZMW04501SFConst.TENDYMD_MON,
				ZMW04501SFConst.TENDYMD_DAY);
		
		// 固定IP取得種別コードのインデックスを取得する
		String index = JZMWebCommon.getPullDownIndex(bean,
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_INFO,
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_VALUE_LIST_01,
				JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD));
		
		// 固定IP取得種別コードインデックスにインデックスを設定する
		JZMWebCommon.setPullDownIndex(bean, 
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_INFO, 
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01, 
				index);
		
		// 遷移先画面ID、名称の設定
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW04501);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW04501);
		
		return true;
	}
	
	
	/**
	 * 更新確認ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	@SuppressWarnings("unchecked")
	public boolean updCfm() throws Exception
	{

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commonBean = getCommonInfoBean();

		// サービスフォームBean
		X31SDataBeanAccess bean = getServiceFormBean();

		// 固定IPコード取得種別コードの取得と設定
		String selectedValue = JZMWebCommon. getPullDownSelectedValue(bean,
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_INFO,
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_NM_LIST_01,
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01);
		bean.sendMessageString(ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_NM,
				X31CWebConst.DATABEAN_SET_VALUE,
				selectedValue);                                                                   
		
		// 固定ＩＰアドレス取得種別コード値の取得と設定
		selectedValue = JZMWebCommon. getPullDownSelectedValue(bean, 
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_INFO, 
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_VALUE_LIST_01, 
				ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01);
		bean.sendMessageString(ZMW04501SFConst.KOTEI_IP_STKU_SBT_CD, X31CWebConst.DATABEAN_SET_VALUE, selectedValue);   
		
		// 適用開始年月日の取得と設定
		String  ymd = JPCUtilCommon.concatYmd(
				bean.sendMessageString(ZMW04501SFConst.TSTAYMD_YEAR, X31CWebConst.DATABEAN_GET_VALUE), 
				bean.sendMessageString(ZMW04501SFConst.TSTAYMD_MON, X31CWebConst.DATABEAN_GET_VALUE), 
				bean.sendMessageString(ZMW04501SFConst.TSTAYMD_DAY, X31CWebConst.DATABEAN_GET_VALUE));
		bean.sendMessageString(ZMW04501SFConst.TSTAYMD , X31CWebConst.DATABEAN_SET_VALUE , JZMWebCommon.nullToBlank(ymd));
		
		// 適用終了年月日の取得と設定
		ymd = JPCUtilCommon.concatYmd(
				bean.sendMessageString(ZMW04501SFConst.TENDYMD_YEAR, X31CWebConst.DATABEAN_GET_VALUE),
				bean.sendMessageString(ZMW04501SFConst.TENDYMD_MON, X31CWebConst.DATABEAN_GET_VALUE), 
				bean.sendMessageString(ZMW04501SFConst.TENDYMD_DAY, X31CWebConst.DATABEAN_GET_VALUE));
		bean.sendMessageString(ZMW04501SFConst.TENDYMD, X31CWebConst.DATABEAN_SET_VALUE , JZMWebCommon.nullToBlank(ymd));

		boolean isToroku = JZMWebConst.ONE.equals(JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_TRAN_DIV));
				
		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV40);

		// マッピングクラス
		ZMSV0040_ZMSV0040OPDBMapper mapper = new ZMSV0040_ZMSV0040OPDBMapper();

		// エイジングのサービスマッピングを行う。
		agingMap(bean, dataMap, paramBean, mapper, FUNC_CD_2);
		
		// マッピング処理（上り）
		mapper.setZMSV004001SC(paramBean, dataMap, FUNC_CD_2);

		String useCnt = JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.USE_CNT);
		
		// エイジング処理区分が1の場合
		if(isToroku)
		{
			
			// 使用回数を＋１する
			if(useCnt.matches(NUMBER_REGEX))
			{
				useCnt = String.valueOf(Long.parseLong(useCnt) + 1);
			}
			else
			{
				useCnt = JZMWebConst.ONE;
			}
			((HashMap<String, Object>)dataMap.get("ZMSV004001SC")).put("use_cnt", useCnt);
		}
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		// エイジング処理区分が1の場合
		if(isToroku)
		{
			JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.USE_CNT, useCnt);
		}
		
		//メッセージを設定する
		JZMWebCommon.setMessageInfo(this, MESSAGE_ID_370, MESSAGE_VALUE);
		JZMWebCommon.setMessageAreaBackColor(this, JZMWebConst.ONE);
		
		// エイジング名称を設定する
		JZMWebCommon.setAgingStatTranDiv(bean, ZMW04501SFConst.AGING_STAT_NM,
				JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_TRAN_DIV));
		
		// 遷移先画面ID、名称の設定
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW04502);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW04502);
		
		return true;
	}

	/**
	 * 戻るボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean back() throws Exception
	{

		// 共有フォームBean
		X31SDataBeanAccess commonBean = getCommonInfoBean();
		
		// 画面遷移
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMWebCommon.getScreenId(this));
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE , JZMWebConst.BLANK);
		
		return true;
	}
	
	/**
	 * 確定ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean fix() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// ユースケースID格納用マップ
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// (3)サービス呼出処理
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV40);

		// マッピングクラス
		ZMSV0040_ZMSV0040OPDBMapper mapper = new ZMSV0040_ZMSV0040OPDBMapper();

		// エイジング更新の上りマッピングを行う
		agingMap(bean, dataMap, paramBean, mapper, FUNC_CD_1);
		
		// マッピング処理（上り）
		mapper.setZMSV004001SC(paramBean, dataMap, FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, dataMap, outputMap);

		JZMWebCommon.setMessageInfo(this, MESSAGE_ID_380, MESSAGE_VALUE);
		
		// 画面遷移
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW04503);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst. SCREEN_NAME_ZMW04503);
		
		return true;
	}
	
	/**
	 * 修正ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean shusei() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 共有フォームBean
		X31SDataBeanAccess commonBean = getCommonInfoBean();
		
		String agingStat = JZMWebCommon.getRidOfStatTranDiv(JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_STAT_NM));
		JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.AGING_STAT_NM, agingStat);
		
		// エイジング処理区分が1の場合
		if(JZMWebConst.ONE.equals(JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_TRAN_DIV)))
		{
			
			// 使用回数を＋１する
			String useCnt = JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.USE_CNT);
			if(useCnt.matches(NUMBER_REGEX))
			{
				useCnt = String.valueOf(Long.parseLong(useCnt) - 1);
			}
			else
			{
				useCnt = JZMWebConst.ZERO;
			}
			JZMWebCommon.setSendMessageString(bean, ZMW04501SFConst.USE_CNT, useCnt);
		}
		
		// 画面遷移
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW04501);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst. SCREEN_NAME_ZMW04501);
		
		return true;
	}
	
	/**
	 * 終了ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean fin() throws Exception
	{

		// 共有フォームBean
		X31SDataBeanAccess commonBean = getCommonInfoBean();
		// 戻り先画面を設定する
		setBackScreenId(commonBean, false);
				
		return true;
	}


	/**
	 * セッションから遷移先画面を取得し共通ビーンに設定する
	 * <br>
	 * @param commonBean 共通フォームBean
	 * @param transfer	強制転送するかどうか
	 */
	private void setBackScreenId(X31SDataBeanAccess commonBean, boolean transfer)
	{
		// 戻り先画面IDを取得する
		String screenId = JZMWebCommon.getScreenId(this);

		// 遷移先画面ID、名称の設定
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, screenId);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JZMWebConst.BLANK);
		
		if(transfer)
		{
			
			// 強制転送を行う
			setTransferPageId(screenId + JZMWebConst.PJP);
		}
	}
	
	/**
	 * エイジング更新のサービスIFを選択しマッピングに行います。
	 * @param bean サービスBean
	 * @param dataMap dataMap
	 * @param paramBean paramBean
	 * @param mapper マッピングクラス
	 * @param funcCd 機能コード
	 */
	private void agingMap(X31SDataBeanAccess bean,
			HashMap<String, Object> dataMap, X31SDataBeanAccess[] paramBean,
			ZMSV0040_ZMSV0040OPDBMapper mapper,
			String funcCd)
	{

		// エイジング処理区分の取得
		int agingTranDiv = Integer.parseInt(JZMWebCommon.getSendMessageString(bean, ZMW04501SFConst.AGING_TRAN_DIV));
		if(0 == agingTranDiv)
		{
			
			// 変更なしの場合処理なし
		}
		else if(1 == agingTranDiv)
		{
			
			// エイジング対象登録のマッピングを行う
			mapper.setZMSV004005SC(paramBean, dataMap, funcCd);
		}
		else if(2 == agingTranDiv)
		{
			
			// エイジング対象使用終了のマッピングを行う
			mapper.setZMSV004002SC(paramBean, dataMap, funcCd);			
		}
		else if(3 == agingTranDiv)
		{
			
			// エイジング対象回復のマッピングを行う
			mapper.setZMSV004003SC(paramBean, dataMap, funcCd);			
		}
		else if(4 == agingTranDiv)
		{
			
			// 回復可能期間終了のマッピングを行う
			mapper.setZMSV004004SC(paramBean, dataMap, funcCd);			
		}
		else if(5 == agingTranDiv)
		{
			
			// エイジング削除のマッピングを行う
			mapper.setZMSV004006SC(paramBean, dataMap, funcCd);			
		}
	}
	
}
