/*********************************************************************
* All Rights reserved, Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム共通（共通マスタ）
*   モジュール名    ：ZMW06401SFLogic
*   ソースファイル名：ZMW06401SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年04月18日
*＜機能概要＞
*   固定ＩＰアドレス一括登録のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v2.00.00    2011/04/18   FJ）岩元    新規作成
*   v3.00.00    2012/01/31   FJ）岩元    【UIZ-0004-00-00】視認性向上No.4
*
**********************************************************************/

package eo.web.webview.ZMW06401SF;

import java.util.ArrayList;
import java.util.HashMap;

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.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
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.ZMSV0085_ZMSV0085OPDBMapper;
import eo.web.webview.mapping.ZMSV0086_ZMSV0086OPDBMapper;
import eo.web.webview.mapping.ZMSV0087_ZMSV0087OPDBMapper;

/**
 *  固定ＩＰアドレス一括登録のビューロジックです。
 * @author 909281
 *
 */
@SuppressWarnings("serial")
public class ZMW06401SFLogic extends JCCWebBusinessLogic
{

	/** メッセージ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 MSG = "IPアドレスは、既に登録されています。（集約局：%1）";
	
	/** 置換文字 */
	private static final String REP_WORD = "%1";

	/** サービスＩＦ項目名 固定ＩＰアドレス */
	public static final String KOTEI_IP_AD = "kotei_ip_ad";
	
	/** 定数 "." */
	private static final String DOT = ".";
	
	/** 定数 " / "*/
	private static final String SLASH = " / ";
	
	/** 定数 "件" */
	private static final String KEN = "件";
	
	/**
	 * 固定ＩＰアドレス一括登録初期表示処理を行います。
	 * <br>
	 * @return 処理結果 
	 * @throws Exception 予期せぬエラー
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commonBean = getCommonInfoBean();
		
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 戻り先IDの取得
		boolean hasScreenId = null != JZMWebCommon.getScreenId(this);
		
		// 戻り先IDの有無で戻るボタン表示フラグを表示する
		JZMWebCommon.setSendMessageBoolean(bean, ZMW06401SFConst.BACK_BTN_DSP_FLG, hasScreenId);
		
		hasScreenId = null != JZMWebCommon.getScreenId(this, JZMScreenConst.SCREEN_ID_ZMW06403);
		
		JZMWebCommon.setSendMessageBoolean(bean, ZMW06401SFConst.BACK_SAKI_FLG, hasScreenId);
		
		// サービスフォーム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>();
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV85);
		
		ZMSV0085_ZMSV0085OPDBMapper mapper = new ZMSV0085_ZMSV0085OPDBMapper();
		mapper.setZMSV008501SC(paramBean, dataMap, FUNC_CD_1);

		HashMap<String, Object> inDataMap = (HashMap<String, Object>)dataMap.get(JZMWebConst.SC8501);
		inDataMap.put(JZMWebConst.KEY_STDARDYMD, JZMWebCommon.getOpeDate(this, null));
		
		// サービスの呼び出し
		invokeService(paramMap, dataMap, outputMap);
		
		// マッピングクラスの呼び出し
		mapper.getZMSV008501SC(paramBean, outputMap);
		
		
		// 固定IP取得種別コードのインデックスを取得する
		String index = JZMWebCommon.getPullDownIndex(bean,
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_INFO,
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_VALUE_LIST_01,
				JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD));
		
		// 固定IP取得種別コードインデックスにインデックスを設定する
		JZMWebCommon.setPullDownIndex(bean, 
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_INFO, 
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01, 
				index);
		
		// 遷移先画面ID、名称の設定
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW06401);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW06401);
		
		return true;
	}
	
	/**
	 * 登録確認ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean addCfm() throws Exception
	{

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commonBean = getCommonInfoBean();

		// サービスフォームBean
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// IPアドレスの設定
		String ipAd = getIpAd(bean);
		JZMWebCommon.setSendMessageString(bean, ZMW06401SFConst.IPAD, ipAd);
		
		// サービスフォーム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>();
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV86);
		
		ZMSV0086_ZMSV0086OPDBMapper mapper = new ZMSV0086_ZMSV0086OPDBMapper();
		mapper.setZMSV008601SC(paramBean, dataMap, FUNC_CD_1);
		
		// サービスの呼び出し
		invokeService(paramMap, dataMap, outputMap);
		
		JZMWebCommon.setSendMessageBoolean(bean, ZMW06401SFConst.FIX_BTN_DSP_FLG, true);
		
		StringBuilder sb = new StringBuilder();
		sb.append(ipAd)
		.append(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.IPAD4))
		.append(SLASH)
		.append(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.FIX_BIT_CNT));
		
		// サービスフォームBeanの編集
		JZMWebCommon.setSendMessageString(bean, ZMW06401SFConst.IPAD, sb.toString());
		
		String selectedValue = JZMWebCommon. getPullDownSelectedValue(bean,
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_INFO,
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_NM_LIST_01,
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01);
		JZMWebCommon.setSendMessageString(bean, ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_NM, selectedValue);
		
		selectedValue = JZMWebCommon. getPullDownSelectedValue(bean, 
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_INFO, 
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_VALUE_LIST_01, 
				ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD_IDX_01);
		JZMWebCommon.setSendMessageString(bean, ZMW06401SFConst.KOTEI_IP_STKU_SBT_CD, selectedValue);
		
		// 登録IPアドレスのチェック
		setAddIpAd(bean, outputMap);
		
		// メッセージの設定
		JZMWebCommon.setMessageInfo(this, MESSAGE_ID_370, MESSAGE_VALUE);
		JZMWebCommon.setMessageAreaBackColor(this, JZMWebConst.ONE);
		
		// 遷移先画面ID、名称の設定
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW06402);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME,
				X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW06402);
		
		return true;
	}
	

	/**
	 * 入力されたIPアドレス１、IPアドレス２、IPアドレス３を結合します。
	 * @param bean
	 * @return String
	 */
	private String getIpAd(X31SDataBeanAccess bean)
	{
		
		StringBuilder sb = new StringBuilder();
		sb.append(trimZero(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.IPAD1)))
		.append(DOT)
		.append(trimZero(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.IPAD2)))
		.append(DOT)
		.append(trimZero(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.IPAD3)))
		.append(DOT);
		return  sb.toString();
	}
	
	/**
	 * 
	 * 数値の文字列の前頭の0を削除します。
	 * @param str 数値の文字列
	 * @return String
	 */
	private String trimZero(String str)
	{
		return String.valueOf(Integer.parseInt(str));
	}
	
	/**
	 * 登録IPアドレスを作成します。
	 * @param bean
	 * @return ArrayList<String>
	 */
	private ArrayList<String> getAddIpAd(X31SDataBeanAccess bean)
	{
		
		String ip = getIpAd(bean);
		
		int sta = Integer.parseInt(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.IPAD4)) + 1;
		int kijun = 32 - Integer.parseInt(JZMWebCommon.getSendMessageString(bean, ZMW06401SFConst.FIX_BIT_CNT));
		int end = sta +  (int)Math.pow(2, kijun) - 2;

		ArrayList<String> list = new ArrayList<String>();
		
		for (int i = sta; i < end; i++)
		{
			list.add(ip + String.valueOf(i));
		}
		
		return list;
	}
	
	/**
	 * 登録IPアドレスをサービスフォームBeanに設定します。
	 * @param bean
	 * @param outputMap
	 */
	private void setAddIpAd(X31SDataBeanAccess bean, HashMap<?, ?> outputMap)
	{

		// 登録IPアドレスの作成
		ArrayList<String> listIp = getAddIpAd(bean);
		JZMWebCommon.setSendMessageString(bean, ZMW06401SFConst.ADD_IPAD_CNT, new Integer(listIp.size()).toString() + KEN);
		
		X31SDataBeanAccessArray listBean = bean.getDataBeanArray(ZMW06401SFConst.ADD_KOTEI_IP_AD_INFO);
		
		X31SDataBeanAccess subBean = null;
		
		HashMap<?, ?> parentMap = null;
		if(outputMap.containsKey(JZMWebConst.SC8601))
		{
			parentMap = (HashMap<?, ?>)outputMap.get(JZMWebConst.SC8601);
		}
		ArrayList<?> childList = null;
		if(parentMap != null && parentMap.containsKey(JZMWebConst.EZM0101B010CBSMSG1LIST))
		{
			childList = (ArrayList<?>)parentMap.get(JZMWebConst.EZM0101B010CBSMSG1LIST);
			int i = 0;
			String addIpAd = null;
			boolean is1st = true;
			for(int j = 0; j < listIp.size(); j++)
			{
				addIpAd = listIp.get(j);
				subBean = listBean.addDataBean();
				JZMWebCommon.setSendMessageString(subBean, ZMW06401SFConst.ADD_IPAD_02, addIpAd);
				JZMWebCommon.setSendMessageString(subBean, ZMW06401SFConst.ROW_NO_02, j + 1);
				for(; i < childList.size(); i++)
				{
					HashMap<?, ?> childMap = (HashMap<?, ?>)childList.get(i);
					if(addIpAd.equals((String)childMap.get(KOTEI_IP_AD)))
					{
						String shyakkChuskkCd = (String)childMap.get(JZMWebConst.EZM0101_SHYAKK_CHUSKK_CD);
						if(2 < shyakkChuskkCd.length())
						{
							shyakkChuskkCd = shyakkChuskkCd.substring(0, 2);
						}
						JZMWebCommon.setSendMessageString(subBean, ZMW06401SFConst.BIKO_02,
								MSG.replace(REP_WORD, shyakkChuskkCd));
						if(is1st)
						{
							JZMWebCommon.setSendMessageBoolean(bean, ZMW06401SFConst.FIX_BTN_DSP_FLG,  false);
							is1st = false;
						}
						break;
					}
					if(i == childList.size() - 1)
					{
						i = 0;
						break;
					}
				}
			}
			JZMWebCommon.setRowStyleClass(bean, ZMW06401SFConst.ADD_KOTEI_IP_AD_INFO, ZMW06401SFConst.ROW_STYLE_CLASS_02);
		}
	}

	
	/**
	 * 戻るボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean back1() 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 back2() throws Exception
	{

		// 共有フォームBean
		X31SDataBeanAccess commonBean = getCommonInfoBean();

		// サービスフォームBean
		X31SDataBeanAccess bean = getServiceFormBean();
		
		((X31SDataBeanAccessArray)bean.getDataBeanArray(ZMW06401SFConst.ADD_KOTEI_IP_AD_INFO)).clearArray();
		JZMWebCommon.setSendMessageBoolean(bean, ZMW06401SFConst.FIX_BTN_DSP_FLG, true);
		
		// 画面遷移
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW06401);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW06401);
		
		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>();
		
		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean};

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JZMWebConst.SV87);

		// マッピングクラス
		ZMSV0087_ZMSV0087OPDBMapper mapper = new ZMSV0087_ZMSV0087OPDBMapper();

		// マッピング処理（上り）
		mapper.setZMSV008701CC(paramBean, dataMap, FUNC_CD_1, JZMWebCommon.getOpeDate(this, null));

		// サービス実行
		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_ZMW06403);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst. SCREEN_NAME_ZMW06403);
		
		return true;
	}

	
	/**
	 * 完了確認ボタン処理を行います。
	 * <br>
	 * @return 処理結果
	 * @throws Exception 予期せぬエラー
	 */
	public boolean fin() 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;
	}
}
