/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：eoモバイル通信状況照会ビューロジック
*	ソースファイル名：FUW08101SFLogic.java
*	作成者			：富士通
*	日付			：2011年08月22日
*＜機能概要＞
*	eoモバイル通信状況照会ビューロジッククラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/22	FJ）北島	新規作成
*
**********************************************************************/
package eo.web.webview.FUW08101SF;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
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.JFUStrConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0072_FUSV0072OPDBMapper;

/**
 * eoモバイル通信状況照会ビューロジッククラスです。<p>
 * <br/>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW08101SFLogic extends JCCWebBusinessLogic
{

	/** サービスユースケースID：eoモバイル通信状況照会 */
	private static final String SVC_USECASE_ID_FUSV0072 = "FUSV0072";

	/** byte値；0 */
	private static final BigDecimal BYTE_0 = new BigDecimal("0");

	/** byte値；1024 */
	private static final BigDecimal BYTE_1024 = new BigDecimal("1024");

	/** CCタイトル：eoモバイル通信状況照会 */
	private static final String CC_TITLE_FUSV007201CC = "FUSV007201CC";

	/** Mapキー：請求年月 */
	private static final String MAP_KEY_SEIKY_YM = "use_ym";

	/** Mapキー：eoモバイル合計明細 */
	private static final String MAP_KEY_CBSMSGLIST = "EAC0371A010CBSMsg1List";

	/** Mapキー：利用パケット数合計 */
	private static final String MAP_KEY_USE_PCT_CNT_GOKEI = "use_pct_cnt_gokei";

	/** Mapキー：利用バイト数合計 */
	private static final String MAP_KEY_USE_BYTE_CNT_GOKEI = "use_byte_cnt_gokei";

	/** Mapキー：パケット料金 */
	private static final String MAP_KEY_PCT = "pct";

	/** 機能コード：検索 */
	private static final String FUNC_CODE_1 = "1";

	/** パケット文字列：パケット( */
	private static final String PCT_STRING_1 = "パケット(";

	/** パケット文字列：) */
	private static final String PCT_STRING_2 = ")";

	/** byte単位：GB */
	private static final String FMT_BYTE_GB = "GB";

	/** byte単位：MB */
	private static final String FMT_BYTE_MB = "MB";

	/** byte単位：KB */
	private static final String FMT_BYTE_KB = "KB";

	/** byte単位：B */
	private static final String FMT_BYTE_B = "B";

	/** byte単位：- */
	private static final String FMT_BYTE_ZERO = "-";

	/** 年月日書式：yyyyMMdd */
	private static final String FMT_YMD = "yyyyMMdd";

	/** 年月日編集書式：yyyyMM */
	private static final String EDIT_YM = "yyyyMM";

	/** BigDecimalスケール：0 */
	private static final int BIG_DEC_SCALE_0 = 0;

	/** BigDecimalスケール：1 */
	private static final int BIG_DEC_SCALE_1 = 1;

	/** 空白 */
	private static final String SPACE_6 = "      ";

	/** フロント用画面表示定義ファイル：対象年月の期間 */
	private static final String TRGT_YM_KIKAN = "trgt_ym_kikan";

	/**
	 * 初期表示処理
	 * <br/>
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{

		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- init_FUW08101SFLogic Start -----");
		// 画面情報を取得し、サービスフォームBeanに設定
		JFUWebCommon.getScreenInfo(this);

		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// サービスフォームBean取得
		X31SDataBeanAccess serviceFormBean = getServiceFormBean();

		// -------------------------------------------------
		// 共有フォームBean情報の取得
		// -------------------------------------------------
		// サービス契約情報取得
		X31SDataBeanAccess svcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// サービス契約内訳情報取得
		X31SDataBeanAccess svcKeiUcwkInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO);

		// サービス契約番号取得
		String svcKeiNo = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_23, X31CWebConst.DATABEAN_GET_VALUE);
		// サービス契約内訳番号取得
		String svcKeiUcwkNo = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, X31CWebConst.DATABEAN_GET_VALUE);
		// 料金コースコード
		String pcrsCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
		// 料金プランコード
		String pplanCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_23, X31CWebConst.DATABEAN_GET_VALUE);
		// -------------------------------------------------
		// 対象年月の設定
		// -------------------------------------------------
		// フロント用画面表示定義ファイルから対象年月の期間を取得
		int kikan = Integer.parseInt(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW08101, TRGT_YM_KIKAN));

		// 運用日付を取得
		String tougetu = JFUWebCommon.getOpeDate(this, null);

		// 請求年月リスト
		ArrayList<String> seikyYmList = new ArrayList<String>();
		// 運用日付から対象期間を設定する
		for (int i = 0; i < kikan; i++)
		{
			if (i == 0)
			{
				// 初回は、マイナスしないで運用日付を請求年月リストに追加
				seikyYmList.add(toFormatDate(tougetu, FMT_YMD, EDIT_YM));
			}
			else
			{
				// 運用日付の月からカウンタ分をマイナス
				String seikyYm = JFUWebCommon.addMonth(tougetu, -i);
				seikyYmList.add(toFormatDate(seikyYm, FMT_YMD, EDIT_YM));
			}
		}

		// -------------------------------------------------
		// サービス呼出処理
		// -------------------------------------------------
		// サービス検索条件格納用マップ
		HashMap<String, HashMap<String, String>> inputMap = new HashMap<String, HashMap<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>> outputMap =
				new HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SVC_USECASE_ID_FUSV0072);

		// 上りマッピング用にサービスフォームBeanにセット
		// サービスフォームBean.サービス契約番号
		serviceFormBean.sendMessageString(FUW08101SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, svcKeiNo);
		// サービスフォームBean.サービス契約内訳番号
		serviceFormBean.sendMessageString(FUW08101SFConst.SVC_KEI_UCWK_NO, X31CWebConst.DATABEAN_SET_VALUE, svcKeiUcwkNo);
		// サービスフォームBean.料金コースコード
		serviceFormBean.sendMessageString(FUW08101SFConst.PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, pcrsCd);
		// サービスフォームBean.料金サービスコード
		serviceFormBean.sendMessageString(FUW08101SFConst.PRC_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, pplanCd + SPACE_6);
		// サービスフォームBean.請求年月リスト
		X31SDataBeanAccessArray keySeikyYmList = serviceFormBean.getDataBeanArray(FUW08101SFConst.SEIKY_YM_LIST);
		for (int i = 0; i < seikyYmList.size(); i++)
		{
			X31SDataBeanAccess subbean = keySeikyYmList.addDataBean();
			String seikyYm = seikyYmList.get(i);
			// サービスフォームBean.請求年月リスト.請求年月
			subbean.sendMessageString(FUW08101SFConst.SEIKY_YM_02, X31CWebConst.DATABEAN_SET_VALUE, seikyYm);
		}

		// DataBean-BPマッピングクラス生成
		FUSV0072_FUSV0072OPDBMapper mapper = new FUSV0072_FUSV0072OPDBMapper();
		// 上り/下りマッピング用パラメータ生成
		X31SDataBeanAccess[] serviceFormBeanArray = new X31SDataBeanAccess[] { serviceFormBean };

		// eoモバイル合計一意照会CC上りマッピング
		mapper.setFUSV007201CC(serviceFormBeanArray, inputMap, FUNC_CODE_1);

		try
		{
			// eoモバイル通信状況照会サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 業務用例外クラスをthrowする。
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// サービスからの情報を画面表示用に編集する
		setDispValue(serviceFormBean, outputMap.get(CC_TITLE_FUSV007201CC), seikyYmList);

		// 外部ファイルからパケット料金を取得しサービスフォームBeanにセット
		serviceFormBean.sendMessageString(FUW08101SFConst.PCT, X31CWebConst.DATABEAN_SET_VALUE,
				JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW08101, MAP_KEY_PCT));

		// -------------------------------------------------
		// 遷移先画面ID、画面名の設定
		// -------------------------------------------------
		// eoモバイル通信状況照会画面に遷移
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW08101);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW08101);

		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- init_FUW08101SFLogic End -----");
		return true;
	}

	/**
	 * 画面表示用データの加工編集処理
	 * <br/>
	 * サービスIFの検索結果リストを画面表示用のご利用パケットに編集します。
	 *
	 * @param serviceFormBean eoモバイル通信状況照会サービスフォームBean
	 * @param fusv0072CCMap サービス検索結果マップ
	 * @param seikyYmList 請求年月リスト
	 */
	private void setDispValue(X31SDataBeanAccess serviceFormBean, HashMap<String, ArrayList<HashMap<String, String>>> fusv0072CCMap,
			ArrayList<String> seikyYmList)
	{
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- setDispValue_FUW08101SFLogic Start -----");
		// サービスフォームBean.明細リスト
		X31SDataBeanAccessArray meisaiList = serviceFormBean.getDataBeanArray(FUW08101SFConst.MEISAI_LIST);

		// サービスフォームBean.eoモバイル合計リスト
		ArrayList<HashMap<String, String>> cbsMsgList = fusv0072CCMap.get(MAP_KEY_CBSMSGLIST);

		for (int i = 0; i < seikyYmList.size(); i++)
		{
			String seikyYm = seikyYmList.get(i);
			// eoモバイル合計一意照会情報
			HashMap<String, String> cbsMsg = new HashMap<String, String>();
			// 存在フラグ
			boolean umFlg = false;
			// 対象年月の明細データが存在したかチェック
			for (int j = 0; j < cbsMsgList.size(); j++)
			{
				cbsMsg = cbsMsgList.get(j);
				if (seikyYm.equals(cbsMsg.get(MAP_KEY_SEIKY_YM)))
				{
					umFlg = true;
					break;
				}
			}
			X31SDataBeanAccess subbean = meisaiList.addDataBean();
			// サービスフォームBean.明細リスト.請求年月
			subbean.sendMessageString(FUW08101SFConst.SEIKY_YM_03, X31CWebConst.DATABEAN_SET_VALUE, seikyYm);
			// サービスフォームBean.明細リスト.ご利用パケットの設定
			if (umFlg)
			{
				// eoモバイル合計情報からご利用パケット数合計とご利用バイト数合計を取得する
				String usePctCntGokei = cbsMsg.get(MAP_KEY_USE_PCT_CNT_GOKEI);
				String useByteCntGokei = cbsMsg.get(MAP_KEY_USE_BYTE_CNT_GOKEI);

				// ご利用パケット数合計にカンマ処理を行う
				usePctCntGokei = JFUWebCommon.formatNumber(usePctCntGokei);

				// ご利用バイト数合計にGB、MB、KB、Bの単位毎に編集処理を行う
				BigDecimal bdByte = new BigDecimal(useByteCntGokei);
				BigDecimal bdKByte = bdByte.divide(BYTE_1024, BIG_DEC_SCALE_1, BigDecimal.ROUND_DOWN);
				BigDecimal bdMByte = bdKByte.divide(BYTE_1024, BIG_DEC_SCALE_1, BigDecimal.ROUND_DOWN);
				BigDecimal bdGByte = bdMByte.divide(BYTE_1024, BIG_DEC_SCALE_1, BigDecimal.ROUND_DOWN);

				// ご利用バイト数合計の単位毎に表示単位を変更する
				if (!BYTE_0.equals(bdGByte.setScale(BIG_DEC_SCALE_0, BigDecimal.ROUND_DOWN)))
				{
					// ご利用バイト数合計がGB単位の場合
					subbean.sendMessageString(FUW08101SFConst.USE_PCT_03, X31CWebConst.DATABEAN_SET_VALUE, formatUsePct(usePctCntGokei, bdGByte,
							FMT_BYTE_GB));
				}
				else if (!BYTE_0.equals(bdMByte.setScale(BIG_DEC_SCALE_0, BigDecimal.ROUND_DOWN)))
				{
					// ご利用バイト数合計がMB単位の場合
					subbean.sendMessageString(FUW08101SFConst.USE_PCT_03, X31CWebConst.DATABEAN_SET_VALUE, formatUsePct(usePctCntGokei, bdMByte,
							FMT_BYTE_MB));
				}
				else if (!BYTE_0.equals(bdKByte.setScale(BIG_DEC_SCALE_0, BigDecimal.ROUND_DOWN)))
				{
					// ご利用バイト数合計がKB単位の場合
					subbean.sendMessageString(FUW08101SFConst.USE_PCT_03, X31CWebConst.DATABEAN_SET_VALUE, formatUsePct(usePctCntGokei, bdKByte,
							FMT_BYTE_KB));
				}
				else
				{
					// ご利用バイト数合計がB単位の場合
					subbean.sendMessageString(FUW08101SFConst.USE_PCT_03, X31CWebConst.DATABEAN_SET_VALUE, formatUsePct(usePctCntGokei, bdByte,
							FMT_BYTE_B));
				}
			}
			else
			{
				// eoモバイル合計情報が取得できない場合、ご利用パケットに"-"を設定する
				subbean.sendMessageString(FUW08101SFConst.USE_PCT_03, X31CWebConst.DATABEAN_SET_VALUE, FMT_BYTE_ZERO);
			}
		}
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- setDispValue_FUW08101SFLogic End -----");
	}

	/**
	 * ご利用パケット編集処理
	 * <br/>
	 * 引数値を「ご利用パケット数合計 ＋ "パケット(" ＋ ご利用バイト数合計 ＋ バイト単位 ＋ ")"」のフォーマットに編集します。
	 *
	 * @param usePctCntGokei  ご利用パケット数合計
	 * @param useByteCntGokei ご利用バイト数合計
	 * @param formatByte      バイト単位（GB、MB、KB、B）
	 * @return String 編集されたご利用パケット
	 */
	private String formatUsePct(String usePctCntGokei, BigDecimal useByteCntGokei, String formatByte)
	{
		return usePctCntGokei + PCT_STRING_1 + useByteCntGokei + formatByte + PCT_STRING_2;
	}

	/**
	 * 日付オブジェクトを指定された形式の文字列に編集します。
	 * <br>
	 * @param arg0 編集する日付オブジェクト
	 * @param arg1 java.util.Date型の日付書式
	 * @param arg2 編集する文字列の日付書式
	 * @return String 指定された形式に編集された文字列
	 */
	private String toFormatDate(String arg0, String arg1, String arg2)
	{
		try
		{
			SimpleDateFormat instance = new SimpleDateFormat(arg1);

			return new SimpleDateFormat(arg2).format(instance.parse(arg0));

		}
		catch (ParseException pe)
		{
			return arg0;
		}
	}

}
