/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW04901SFLogic
*   ソースファイル名：FUW04901SFLogic.java
*   作成者          ：富士通
*   日付            ：2012年01月05日
*＜機能概要＞
*   eo-netフォンユーザー情報変更･照会メニュー画面ビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/01/05   FJ）西川    新規作成
*
**********************************************************************/
package eo.web.webview.FUW04901SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
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.X31SRuntimeException;

import eo.common.constant.JFUStrConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW05101SF.FUW05101SFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * FUW04901_eo-netフォンユーザー情報変更･照会メニュー画面ビューロジック.
 * <br>
 * @author 富士通
 */
public class FUW04901SFLogic extends JCCWebBusinessLogic
{

	/** 外部コマンドリターンコード:正常 */
	private static final String EXIT_CODE_OK = "0";

	/** ステータス:"000"(該当するeoユーザIDの情報の取得に成功) */
	private static final String STATUS_O00 = "000";

	/** ステータス:"101"(該当するeoユーザIDのエントリが存在しない) */
	private static final String STATUS_101 = "101";

	/** 外部コマンドステータスＯＫリスト: */
	private static final List<String> STATUS_OK_LIST = Arrays.asList(STATUS_O00, STATUS_101);

	/** 外部コマンド実行結果取得インデックス:ステータス[0] */
	private static final int IDX_STATUS = 0;

	/** 外部コマンド実行結果取得インデックス:VoIPユーザID数[1] */
	private static final int IDX_VOIP_USER_ID_CNT = 1;

	/** VoIPユーザ情報インデックス:VoIPユーザーID[0] */
	private static final int IDX_VOIP_USER_ID = 0;

	/** VoIPユーザ情報インデックス:VoIP電話番号[1] */
	private static final int IDX_VOIP_TELNO = 1;

	/** VoIPユーザ情報インデックス:eoサービス区分[2] */
	private static final int IDX_EO_SVC_KBN = 2;

	/** VoIPユーザ情報インデックス:登録完了フラグ[3] */
	private static final int IDX_ADD_FIN_FLG = 3;

	/** VoIPユーザ情報インデックス:メールアドレス[4] */
	private static final int IDX_MLAD = 4;

	/** VoIPユーザ情報インデックス:利用停止フラグ[5] */
	private static final int IDX_RIYO_STP_FLG = 5;

	/** VoIPユーザ情報インデックス:公衆番号[6] */
	private static final int IDX_KOSHU_NO = 6;

	/** VoIPユーザ情報インデックス:ルーター利用[7] */
	private static final int IDX_ROUTER_USE = 7;

	/** 利用停止フラグ:"1"(利用停止中) */
	private static final String RIYO_STP_FLG_TEISHI = "1";

	/**
	 * 初期表示処理
	 * 
	 * @return boolean true(固定)
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		//----------------------------------------------
		// Bean取得
		//----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = getServiceFormBean();

		//----------------------------------------------
		// サービスフォームBean初期化(リロード対応)
		//----------------------------------------------
		initBean(bean);

		//----------------------------------------------
		// 外部コマンド実行・結果取得
		//----------------------------------------------
		List<String> execSyncRsltList = getVoipUserInfoVc(commonInfoBean);

		//----------------------------------------------
		// 取得データチェック
		//----------------------------------------------
		chkGetData(execSyncRsltList, bean);

		//----------------------------------------------
		// サービスフォームBean設定
		//----------------------------------------------
		setSvcFormBean(bean);

		//----------------------------------------------
		// 共有フォームBean設定
		//----------------------------------------------
		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW04901);
		// 遷移先画面名
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW04901);

		return true;
	}


	/**
	 * [eo-netフォンコースVoIPユーザー情報照会依頼コマンド]実行
	 * <br>
	 * @param commonInfoBean	共有フォームBean
	 * @return 外部コマンド実行結果リスト
	 * @throws Exception	すべての例外
	 */
	private List<String> getVoipUserInfoVc(X31SDataBeanAccess commonInfoBean) throws Exception
	{
		// サービス契約番号[共有フォームBean.サービス契約情報(0).サービス契約番号]
		String svcKeiNo = JFUWebCommon.getDataBeanItemByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO + JFUWebCommon.SEP_0
																+ CommonInfoCFConst.SVC_KEI_NO_23);

		//----------------------------------------------
		// 外部コマンド実行処理
		//----------------------------------------------
		return execSyncVoip(svcKeiNo);
	}

	/**
	 * 取得データチェック<br>
	 * <br>
	 * @param execSyncRsltList	外部コマンド実行結果リスト
	 * @param bean				サービスフォームBean
	 * @throws Exception		すべての例外
	 */
	private void chkGetData(List<String> execSyncRsltList, X31SDataBeanAccess bean) throws Exception
	{
		//--------------------------------------------------------------------------------------------
		// 【取得データチェック】
		//--------------------------------------------------------------------------------------------
		if (JFUWebCommon.isNull(execSyncRsltList) || (0 >= execSyncRsltList.size()))
		{
			DEBUG_LOG.debug("FUW049_chkGetData【システムエラー】 外部コマンド実行結果リストが未設定");
			// 結果リストが未設定の場合、システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ステータスを取得 ← 外部コマンド実行結果配列[0]
		String status = execSyncRsltList.get(IDX_STATUS);

		DEBUG_LOG.debug("★ ステータス ★：＝" + status);

		//----------------------------------------------
		// ＜ステータス異常時＞
		//----------------------------------------------
		// ステータスが"000"(該当するeoユーザIDの情報の取得に成功)、
		// または"101"(該当するeoユーザIDのエントリが存在しない)以外の場合
		if (!STATUS_OK_LIST.contains(status))
		{
			DEBUG_LOG.debug("FUW049_chkGetData【システムエラー】 ステータスが 000 or 101 以外");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		//----------------------------------------------
		// ＜ステータス正常時＞
		//----------------------------------------------
		// ステータスが＝000の場合
		if (STATUS_O00.equals(status))
		{
			//----------------------------------------------
			// 外部コマンド実行結果配列Bean設定
			//----------------------------------------------
			setGetDataToBean(execSyncRsltList, bean);

			//----------------------------------------------
			// 利用停止チェック
			//----------------------------------------------
			chkRiyoStop(bean);
		}
	}

	/**
	 * サービスフォームBean設定
	 * <br>
	 * @param bean					サービスフォームBean
	 * @throws Exception			すべての例外
	 */
	private void setSvcFormBean(X31SDataBeanAccess bean) throws Exception
	{
		// VoIPユーザー情報が1件以上の場合
		if (1 <= bean.getDataBeanArray(FUW04901SFConst.VOIP_USER_IF).getCount())
		{
			// 受付終了メッセージ表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.UK_END_MSG_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.FALSE);
			// ユーザー情報・通話明細照会表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.USER_IF_TUWA_DTL_SHOKAI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.TRUE);
			// ユーザー解約表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.USER_DSL_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.TRUE);

		}
		// VoIPユーザー情報が0件の場合
		//--------------------------------------------------------------------
		// ステータスが"101"(該当するeoユーザIDのエントリが存在しない)の場合、
		// 未加入のため、VoIPユーザー情報の設定を行わない
		//     ⇒ 受付終了メッセージ表示・各ボタン非表示
		//--------------------------------------------------------------------
		else
		{
			// 受付終了メッセージ表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.UK_END_MSG_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.TRUE);
			// ユーザー情報・通話明細照会表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.USER_IF_TUWA_DTL_SHOKAI_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.FALSE);
			// ユーザー解約表示フラグ
			bean.sendMessageBoolean(FUW04901SFConst.USER_DSL_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, Boolean.FALSE);
		}
	}

	/**
	 * 利用停止チェック
	 * <br>
	 * @param bean				サービスフォームBean
	 * @throws Exception		すべての例外
	 */
	private void chkRiyoStop(X31SDataBeanAccess bean) throws Exception
	{
		//----------------------------------------------------------------------------------
		// 利用停止フラグ(riyo_stp_flg)が"1"(利用停止中)のレコードを抽出
		//----------------------------------------------------------------------------------
		Map<String, String> condition = new HashMap<String, String>();
		condition.put(FUW04901SFConst.RIYO_STP_FLG_01, RIYO_STP_FLG_TEISHI);
		X31SDataBeanAccess[] beans = JFUWebCommon.getDataBeanListByPathWithKey(bean, FUW04901SFConst.VOIP_USER_IF, condition);

		// 利用停止フラグ="1"(利用停止中)のユーザーIDが存在した場合
		if ((null != beans) && (0 < beans.length))
		{
			DEBUG_LOG.debug("FUW049_chkRiyoStop【利用停止中エラー】 利用停止フラグ=1(利用停止中)のユーザーIDが存在");
			// 利用停止中エラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0003);
		}
	}

	/**
	 * 外部コマンド実行結果配列Bean設定
	 * <br>
	 * @param execSyncRsltList	外部コマンド実行結果リスト
	 * @param bean				サービスフォームBean
	 * @throws Exception		すべての例外
	 */
	private void setGetDataToBean(List<String> execSyncRsltList, X31SDataBeanAccess bean) throws Exception
	{
		// VoIPユーザーID数 ← 外部コマンド実行結果配列[1]
		JFUWebCommon.setDataBeanItemByPath(bean, FUW04901SFConst.VOIP_USER_ID_SU, execSyncRsltList.get(IDX_VOIP_USER_ID_CNT));

		// VoIPユーザー情報 ← 外部コマンド実行結果配列[2]以降
		X31SDataBeanAccessArray voipUserIfArray = bean.getDataBeanArray(FUW04901SFConst.VOIP_USER_IF);
		X31SDataBeanAccess voipUserIf = null;
		String[] voipUserInfoList = null;

		// 外部コマンド実行結果配列[2]以降
		for (int i = IDX_VOIP_USER_ID_CNT + 1; i < execSyncRsltList.size(); i++)
		{
			// VoIPユーザー情報Beanを追加
			voipUserIf = voipUserIfArray.addDataBean();

			// カンマ区切り文字列からVoIPユーザー情報を取得
			voipUserInfoList = execSyncRsltList.get(i).split(JFUStrConst.COMMA);

			// VoIPユーザーID
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.VOIP_USER_ID_01, JFUWebCommon.nvl(voipUserInfoList[IDX_VOIP_USER_ID]));
			// VoIP電話番号
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.VOIP_TELNO_01, JFUWebCommon.nvl(voipUserInfoList[IDX_VOIP_TELNO]));
			// eoサービス区分
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.EO_SVC_KBN_01, JFUWebCommon.nvl(voipUserInfoList[IDX_EO_SVC_KBN]));
			// 登録完了フラグ
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.ADD_FIN_FLG_01, JFUWebCommon.nvl(voipUserInfoList[IDX_ADD_FIN_FLG]));
			// メールアドレス
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.MLAD_01, JFUWebCommon.nvl(voipUserInfoList[IDX_MLAD]));
			// 利用停止フラグ
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.RIYO_STP_FLG_01, JFUWebCommon.nvl(voipUserInfoList[IDX_RIYO_STP_FLG]));
			// 公衆番号
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.KOSHU_NO_01, JFUWebCommon.nvl(voipUserInfoList[IDX_KOSHU_NO]));
			// ルーター利用
			JFUWebCommon.setDataBeanItemByPath(voipUserIf, FUW04901SFConst.ROUTER_USE_01, JFUWebCommon.nvl(voipUserInfoList[IDX_ROUTER_USE]));
		}
	}

	/**
	 * 外部コマンド実行処理
	 * <br>
	 * @param svcKeiNo		サービス契約番号[eoユーザーID]
	 * @return 外部コマンド実行結果リスト
	 * @throws Exception	すべての例外
	 */
	private List<String> execSyncVoip(String svcKeiNo) throws Exception
	{
		List<String> resultList = null;	// 外部コマンド実行結果リスト

		// 外部コマンド実行標準出力格納
		StringBuffer outPut = new StringBuffer();

		// 外部コマンド情報
		String[] cmd = {JFUWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_NM),
						JFUWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP1),
						JFUWebCommon.getApplicationConst(JFUStrConst.FUIFE015_PARAM1),
						svcKeiNo,
						JFUWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP2),
						JFUWebCommon.getApplicationConst(JFUStrConst.VOIP_ENV)};

		// (デバッグログ)
		DEBUG_LOG.debug("★ コマンドライン引数配列 ★：＝" + Arrays.toString(cmd));

		// 外部コマンド実行処理
		String exitCode = JFUWebCommon.execSync(cmd, outPut, Integer.parseInt(JFUWebCommon.getApplicationConst(JFUStrConst.REMOTE_EXEC_TIME_OUT)));

		// (デバッグログ)
		DEBUG_LOG.debug("★ リターンコード ★：＝" + exitCode);

		// リターンコードチェック
		if (!EXIT_CODE_OK.equals(exitCode))
		{
			DEBUG_LOG.debug("FUW049_execSyncVoip【システムエラー】 リターンコードが0(正常終了)以外");
			// "0"(正常終了)以外の場合、システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		if (outPut.length() > 0)
		{
			// デバッグログ
			DEBUG_LOG.debug("★ 外部コマンド実行結果 ★：＝" + outPut.toString());

			// 出力結果をListに詰め直す
			resultList = Arrays.asList(outPut.toString().split(JFUWebCommon.LINE_SEPARATOR));
		}
		return resultList;
	}

	/**
	 * 照会するボタン押下処理
	 * 
	 * @return boolean true(固定)
	 * @throws Exception	すべての例外
	 */
	public boolean shokai() throws Exception
	{
		//----------------------------------------------
		// Bean取得
		//----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		//----------------------------------------------
		// 共有フォームBean設定
		//----------------------------------------------
		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW04902);
		// 遷移先画面名
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW04902);

		return true;
	}

	/**
	 * 解約するボタン押下処理
	 * 
	 * @return boolean true(固定)
	 * @throws Exception	すべての例外
	 */
	public boolean dsl() throws Exception
	{
		//----------------------------------------------
		// Bean取得
		//----------------------------------------------
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		//----------------------------------------------
		// 引継情報の作成
		//----------------------------------------------
		// ＶｏＩＰユーザー情報
		X31SDataBeanAccessArray voipUserIfArray = bean.getDataBeanArray(FUW04901SFConst.VOIP_USER_IF);
		List<Object> voipUserIfList = new ArrayList<Object>();	// VoIPユーザー情報リスト

		// VoIPユーザー情報リストにBean内容を設定
		for (int i = 0; i < voipUserIfArray.getCount(); i++)
		{
			X31SDataBeanAccess voipUserIf = voipUserIfArray.getDataBean(i);
			voipUserIfList.add(getVoipUserIfMap(voipUserIf));
		}

		//----------------------------------------------
		// 引継情報の設定
		//----------------------------------------------
		// 引き継ぎの情報を格納するMAPを生成する。
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		// 引き継ぎを行う解約画面のサービスフォームBeanの内容を項目名をキーとしてdataMapに転記する。
		dataMap.put(FUW05101SFConst.VOIP_USER_IF, voipUserIfList);

		// 画面情報を設定
		JFUWebCommon.setScreenInfo(this, JFUScreenConst.SCREEN_ID_FUW05101, dataMap);

		//----------------------------------------------
		// 共有フォームBean設定
		//----------------------------------------------
		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW05101);
		// 遷移先画面名
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW05101);

		return true;
	}

	/**
	 * VoIPユーザー情報Map取得
	 * <br>
	 * @param voipUserIf	VoIPユーザー情報Bean
	 * @return VoIPユーザー情報をMap形式に変換したもの
	 * @throws Exception	すべての例外
	 */
	private Map<String, Object>getVoipUserIfMap(X31SDataBeanAccess voipUserIf) throws Exception
	{
		// 引き継ぎの情報を格納するMAPを生成する。
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		String[] itemNmList = voipUserIf.getItemNameList();

		// VoIPユーザー情報の項目名をキーに全項目をMapに詰める
		for (int i = 0; i < itemNmList.length; i++)
		{
			dataMap.put(itemNmList[i], JFUWebCommon.getDataBeanItemByPath(voipUserIf, itemNmList[i]));
		}
		return dataMap;
	}

	/**
	 * データBean初期化<br>
	 * データBeanの全項目を初期化します。
	 * <br>
	 * @param bean			サービスフォームBean
	 * @throws Exception	すべての例外
	 */
	private void initBean(X31SDataBeanAccess bean) throws Exception
	{
		// -------------------------------------------------------
		// INFO:★引継情報がある場合は注意が必要★
		// getScreenInfoで項目を取得している場合、
		// 最初のINIT処理で、1度getScreenInfoを実行すると、
		// セッションから引継情報は削除される。
		// ⇒リロード時には、引継情報を取得できないため、
		//   初期化を行う項目から除外する必要あり
		// -------------------------------------------------------

		// Bean項目一覧を取得
		String[] itemNmList = bean.getItemNameList();
		for (int i = 0; i < itemNmList.length; i++)
		{
			X31SDataBeanAccessArray beanArray = null;

			try
			{
				// データBeanアクセスクラスリストを取得
				// -------------------------------------------------------
				// INFO:javadocに"エラーの場合、nullを返す"とあるが、
				// データタイプBean以外を指定した場合、例外が発生するため
				// try - catchする
				// -------------------------------------------------------
				beanArray = bean.getDataBeanArray(itemNmList[i]);
			}
			catch (X31SRuntimeException x31Re)
			{
				DEBUG_LOG.debug("FUW049_initBean:データBeanの項目がデータタイプBeanではない");
			}
			// -------------------------------------------------------

			if (null == beanArray)
			{
				// データタイプBeanでない場合、項目に初期値設定
				// ----------------------------------------------------------------
				// bean.sendMessage(itemNmList[i], X31CWebConst.DATABEAN_CLEAR);
				// 上記のようにクリア処理を実施すると、属性がBooleanの場合に
				// 初期値を定義していても、false固定で初期化されてしまうため、
				// 明示的に初期値をセットする。
				// ----------------------------------------------------------------
				bean.sendMessageObject(itemNmList[i], X31CWebConst.DATABEAN_SET_VALUE,
						bean.sendMessageObject(itemNmList[i], X31CWebConst.GET_INITIAL_VALUE));
			}
			else
			{
				// データタイプBeanの場合、リスト初期化
				beanArray.clearArray();
			}
		}
	}
}
