/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW02704SFLogic
 *   ソースファイル名：FUW02704SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年05月31日
 *＜機能概要＞
 *   Web使用容量照会のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/08/16   FJ）谷本    新規作成
 *   v3.00       2012/04/14   FJ）山名    【ST2-2012-0000633】 /~対応
 *   v37.00      2018/02/19   FJ) 美濃原  【ANK-3366-00-00】eo光設備卸対応
 *
 **********************************************************************/
package eo.web.webview.FUW02704SF;

import java.math.BigDecimal;
import java.text.DecimalFormat;
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.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.X31SWebLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCFomatString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0166_FUSV0166OPDBMapper;

/**
 * Web使用容量照会のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW02704SFLogic extends JCCWebBusinessLogic
{

	/** サービスID：Web使用容量照会(新規表示) */
	private static final String USECASE_ID_FUSV0166 = "FUSV0166";

	/** コマンド正常終了 */
	private static final String SUCCESS = "0";

	/** Web使用量照会依頼：正常終了 */
	private static final String INQ_SUCCESS = "120000";
	/** Web使用量照会依頼：Web使用量参照失敗（アカウントがない） */
	private static final String INQ_WITHOUT_ACOUNT = "120406";
	/** Web使用量照会依頼：Web使用量参照失敗（WebIDが10桁以外） */
	private static final String INQ_EXCEPT_PLACE = "121303";
	/** Web使用量照会依頼：Web使用量参照失敗（WebIDが英数字以外） */
	private static final String INQ_EXCEPT_CHAR_KIND = "121304";

	/** 外部API(Web使用量照会依頼処理)用照会コマンド */
	private static final String FU_C_FUIFE009_PARAM1 = "FU_C_FUIFE009_PARAM1";

	/** リモートコマンド実行用環境定義ファイル[WWWサーバ] */
	private static final String FU_C_WWW_ENV = "FU_C_WWW_ENV";

	/** 単位 MB */
	private static final String UNIT_MB = "MB";
	
	/** 単位 MB */
	private static final String UNIT_MB_MIMAN = "0.1MB未満";

	/** 改行コード\n */
	private static final String RETURN_CODE2 = "\n";
	/** 改行コード\r */
	private static final String RETURN_CODE1 = "\r";
	/** 空文字 */
	private static final String BLANK = JFUStrConst.EMPTY;
	
	/** 
	 * 数値の編集書式(カンマ区切り) 
	 */
	private static final String FMT_NUM = ",##0.0";

	/**
	 * 初期処理
	 * 
	 * @return 必ずtrue
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// ---- 共有フォームbean ----
		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// ●共有フォームBeanより現顧客契約情報を取得する。
		Map<String, Object> resultMap = getCommoninfoBeanInfo(commoninfoBean);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = (X31SDataBeanAccess)resultMap.get(CommonInfoCFConst.OP_SVC_KEI_INFO);

		// ---- サービスフォームbean ----
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// ●サービス呼び出し処理
		// ホームページURL名取得申込（初期表示）サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0166);

		FUSV0166_FUSV0166OPDBMapper mapper = new FUSV0166_FUSV0166OPDBMapper();

		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = { bean };

		// 1.業務パラメータ管理一意照会（MYホームページURLのプロトコルを取得）
		dataMap = mapper.setFUSV016601SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
		try
		{
			// サービスの呼び出しを行う。
			X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);
			if (msgResult != null)
			{
				JCCWebCommon.setMessageInfo(this, msgResult);
				return true;
			}

		}
		catch (JCCWebServiceException se)
		{
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●サービス処理結果の取得
		// 1.業務パラメータ管理一意照会（MYホームページURLのプロトコルを取得）
		bean = mapper.getFUSV016601SC(bean, outputMap);

		// 現在のＷｅｂ　ＩＤ
		String nowWebId = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.WEB_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

		// ●外部API呼び出し

		Map<String, String> apiParamMap = new HashMap<String, String>();

		apiParamMap.put(FUW02704SFConst.NOW_WEB_ID, nowWebId);

		String resultCode = JFUStrConst.EMPTY;
		List<String> resultCodeList = new ArrayList<String>();
		List<String> dataList = new ArrayList<String>();

		resultCode = execSync(resultCodeList, apiParamMap, dataList);
		if (INQ_SUCCESS.equals(resultCode))
		{
		}
		else
		{

			// Web使用量参照失敗（アカウントがない）
			if (resultCodeList.contains(INQ_WITHOUT_ACOUNT))
			{
				// "0102"（契約状態エラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
			// Web使用量参照失敗（WebIDが10桁以外）
			// Web使用量産ｓ表失敗（WebIDが英数字以外）
			else if (resultCodeList.contains(INQ_EXCEPT_PLACE) || resultCodeList.contains(INQ_EXCEPT_CHAR_KIND))
			{
				// "0002"（システムエラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);

			}
			// 上記以外
			else
			{
				// "0002"（システムエラー）
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}

		// ●外部API呼出結果処理
		bean.sendMessageString(FUW02704SFConst.NOW_WEB_ID, X31CWebConst.DATABEAN_SET_VALUE, nowWebId);
		// 現在のホームページURL
		bean.sendMessageString(FUW02704SFConst.NOW_HP_URL, X31CWebConst.DATABEAN_SET_VALUE, bean.sendMessageString(
				FUW02704SFConst.URL_PROTOCOL, X31CWebConst.DATABEAN_GET_VALUE)
				+ opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_DOMAIN_28, X31CWebConst.DATABEAN_GET_VALUE)
				+ opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.URL_ACCOUNT_28, X31CWebConst.DATABEAN_GET_VALUE));
		long lngWebCapa = Long.parseLong(dataList.get(1).replace(RETURN_CODE1, BLANK).replace(RETURN_CODE2, BLANK));

		// 小数点以下1桁目を切り上げ
		BigDecimal capa = new BigDecimal(lngWebCapa).divide(new BigDecimal(1024));
		capa = capa.setScale(2, BigDecimal.ROUND_UP);
		
		if(capa.compareTo(new BigDecimal("0.1")) == 0 || capa.compareTo(new BigDecimal("0.1")) == 1)
		{
			bean.sendMessageString(FUW02704SFConst.NOW_WEB_KEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, formatNumber(String
					.valueOf(capa))
					+ UNIT_MB);
		}
		else
		{
			
			BigDecimal capa2 = new BigDecimal(lngWebCapa).divide(new BigDecimal(1024));
			if(capa2.compareTo(new BigDecimal("0.0099999999")) == 1)
			{
				capa2 = capa2.setScale(1, BigDecimal.ROUND_UP);
				bean.sendMessageString(FUW02704SFConst.NOW_WEB_KEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, 
						formatNumber(String.valueOf(capa2)) + UNIT_MB);
			}
			else
			{
				bean.sendMessageString(FUW02704SFConst.NOW_WEB_KEI_CAPA, X31CWebConst.DATABEAN_SET_VALUE, UNIT_MB_MIMAN);
			}
		}


		// -------- 遷移先画面の指定 --------
		// 遷移先画面IDを設定（画面機能の先頭になる場合の固定ロジック）
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JFUScreenConst.SCREEN_NAME_FUW02704);

		return true;
	}
	
	/**
	 * 数値書式(カンマ区切り)の編集を行います。
	 * <br>
	 * @param arg0 カンマ区切りに編集する文字列
	 * @return String 数値書式(カンマ区切り)に編集された文字列
	 */
	public static String formatNumber(String arg0) 
	{
		if(JFUWebCommon.isNull(arg0))
		{
			return arg0;
		}

		try 
		{
			DecimalFormat instance = new DecimalFormat(FMT_NUM);

			return instance.format(new BigDecimal(arg0));
		}
		catch (NumberFormatException nfe) 
		{
			return arg0;
		}
	}

	/**
	 * 外部API呼出処理(Web照会依頼処理)を行います。 <BR>
	 * 
	 * @param resultCodeList 処理結果コード
	 * @param paramMap パラメータマップ
	 * @param dataList データリスト
	 * @return 処理結果コード
	 */
	private String execSync(List<String> resultCodeList, Map<String, String> paramMap, List<String> dataList)
	{

		String[] cmd =
				{ JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_NM),
						JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP1),
						JCCWebCommon.getApplicationConst(FU_C_FUIFE009_PARAM1), paramMap.get(FUW02704SFConst.NOW_WEB_ID),
						JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_CMD_OP2), JCCWebCommon.getApplicationConst(FU_C_WWW_ENV) };

		String resultCode = execSync(cmd, dataList);
		if (!INQ_SUCCESS.equals(resultCode))
		{
			resultCodeList.add(resultCode);
		}

		return resultCode;

	}

	/**
	 * 外部API呼出処理を行います。 <BR>
	 * 
	 * @param cmd 処理結果コード
	 * @param dataList データリスト
	 * @return 処理結果コード
	 */
	private String execSync(String[] cmd, List<String> dataList)
	{

		// 実行結果
		String result = null;

		// 外部コマンド実行標準出力格納
		StringBuffer outPut = new StringBuffer();

		// 外部コマンド実行処理
		String execSyncCode =
				JCCWebCommon.execSync(cmd, outPut, Integer.parseInt(JCCWebCommon.getApplicationConst(JFUStrConst.REMOTE_EXEC_TIME_OUT)));

		// 外部コマンド実行結果
		if (SUCCESS.equals(execSyncCode))
		{

			// List<String> resultList = null;
			if (0 < outPut.length())
			{
				// 出力結果をListに詰め直す。
				dataList.addAll(Arrays.asList(delKaigyo(outPut.toString()).split(JFUStrConst.HALF_SPACE, 0)));
				// dataList = Arrays.asList(outPut.toString().split(" ", 0));
				// 実行結果
				result = dataList.get(0);
			}
		}
		else
		{
			// "0102"（システムエラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		return result;
	}

	/**
	 * 改行コードを除去し返却します。
	 * 
	 * <br>
	 * @param str 文字列
	 * @return 改行コードを除去した文字列

	 */
	public String delKaigyo(String str)
	{
		// 入力パラメータ検査
		if (str == null)
		{
			return JFUStrConst.EMPTY;
		}

		// 出力用領域
		String outPutStr = str;

		// 改行コードを空文字に変換
		outPutStr = outPutStr.replace(JFUStrConst.RETURN_CODE, "");

		// 文字列を返却
		return outPutStr;
	}

	/**
	* データBeanリストから0番目のデータBeanを取得します。
	*
	* <br>
	* @param bean
	* @param componentID
	* @return X31SDataBeanAccess
	*/
	private X31SDataBeanAccess getX31SDataBeanAccess(X31SDataBeanAccess bean, String componentID)
	{
		X31SDataBeanAccessArray subBeanArray = bean.getDataBeanArray(componentID);
		X31SDataBeanAccess subBean = subBeanArray.getDataBean(0);
		if (null == subBean)
		{
			subBeanArray.addDataBean();
			subBean = subBeanArray.getDataBean(0);
		}
		return subBean;
	}

	/**
	 * 共有フォームBeanの情報を取得します。 <BR>
	 * 
	 * @param commoninfoBean
	 * @param fixMlad
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean)
	{

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// WEB変更情報
		X31SDataBeanAccess webChgInfoBean = getX31SDataBeanAccess(commoninfoBean, CommonInfoCFConst.WEB_CHG_INFO);
		// SSO情報
		X31SDataBeanAccess ssoInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO).getDataBean(0);

		// SSO情報取得
		String ssoInfoSysid = ssoInfoBean.sendMessageString(CommonInfoCFConst.SYSID_21, X31CWebConst.DATABEAN_GET_VALUE);
		String ssoInfoWebid = ssoInfoBean.sendMessageString(CommonInfoCFConst.WEB_ID_21, X31CWebConst.DATABEAN_GET_VALUE);
		if (JFUWebCommon.isNull(ssoInfoWebid))
		{
			X31SWebLog.DEBUG_LOG.debug("【SSO情報 WebID未設定エラー】");
			// システムエラーをスロー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
		String ssoInfoPopid = ssoInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_21, X31CWebConst.DATABEAN_GET_VALUE);

		// 現顧客情報
		X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);
		// サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);
		// 請求契約情報
		X31SDataBeanAccess seikyKeiInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO).getDataBean(0);

		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;

		// オプションサービス契約情報（配列）
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);
			// WEBID
			String opSvcKeiInfoWebid = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.WEB_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

			// "B002"Myホームページの場合
			if (ssoInfoWebid.equals(opSvcKeiInfoWebid) && JFUStrConst.CD00136_B002.equals(opSvCd))
			{
				// オプションサービス契約情報（確定）
				opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;

			}
		}

		// ☆☆マップにセット☆
		resultMap.put(CommonInfoCFConst.SYSID_21, ssoInfoSysid);
		resultMap.put(CommonInfoCFConst.WEB_ID_21, ssoInfoWebid);
		resultMap.put(CommonInfoCFConst.POP_ID_21, ssoInfoPopid);
		// Bean情報
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean); // SSO情報
		resultMap.put(CommonInfoCFConst.GEN_CUST_KEI_INFO, genCustKeiInfoBean); // 現顧客情報
		resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean); // サービス契約情報
		resultMap.put(CommonInfoCFConst.SVC_KEI_UCWK_INFO, svcKeiUcwkInfoBean); // サービス契約内訳情報
		resultMap.put(CommonInfoCFConst.SEIKY_KEI_INFO, seikyKeiInfoBean); // 請求契約情報
		resultMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean); // オプションサービス契約情報

		return resultMap;
	}

}
