/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JFUEditTln
*	ソースファイル名：JFUEditTln.java
*	作成者			：富士通
*	日付			：2012年05月10日
*＜機能概要＞
*	BP（市外局番一覧取得）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00		2012/05/10	FJ)文元 	【案件番号：ANK-0024-01-00】新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCCommonUtil;
import eo.web.webview.mapping.FUSV0232_FUSV0232OPDBMapper;

public class JFUEditTln extends JPCCommonUtil
{

	/** サービスID */
	private static final String USECASE_ID_FUSV0232 = "FUSV0232";
	/** SC/CC名：FUSV023201SC */
	private static final String FUSV023201SC = "FUSV023201SC";
	/** 市外局番 */
	private static final String AREACD = "areacd";
	/** 住所対象番号区画市外局番一覧照会明細 */
	private static final String EZM0091B012CBSMSG1LIST = "EZM0091B012CBSMsg1List";

	/**
	 * 電話番号を市外局番、市内局番、加入者番号に分割する。
	 *
	 * @param bl ビューロジックへの参照
	 * @param tln 電話番号。数字だけで構成された9桁以上の文字列。
	 * @return 分割した番号を格納した配列。
	 */
	public static String[] splitTln(X31BWebBusinessLogic bl, String tln) throws Exception
	{

		// ●引数チェック
		if (!isValidParameter(tln))
		{
			return null;
		}
		if ((tln.length() < 9) || (!tln.matches("[0-9]+")))
		{
			return null;
		}

		// ●データBean取得
		X31SDataBeanAccess[] bean = { bl.getServiceFormBean() };

		// ●ユースケースID格納用マップを生成
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0232);

		FUSV0232_FUSV0232OPDBMapper mapper = new FUSV0232_FUSV0232OPDBMapper();
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// ●運用日付を取得
		String opeDate = JFUWebCommon.getOpeDate(bl, null);

		// ●BPへの上りマッピング
		mapper.setFUSV023201SC(bean, dataMap, JPCModelConstant.FUNC_CD_1, tln.substring(0, 6), opeDate);

		// ●検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		try
		{
			// サービス呼び出し
			bl.invokeService(paramMap, dataMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// システムエラーの場合、共通エラー画面に遷移します。
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●エラー処理（エラーフラグに値がセットされている場合のみ）
		if (chkErr(outputMap))
		{
			return null;
		}

		// ●市外局番取得
		String areacd = GetEditTln(outputMap);

		// ●電話番号を分割して返却
		int len = tln.length();
		String[] ret = { areacd, tln.substring(areacd.length(), len - 4), tln.substring(len - 4, len) };

		return ret;
	}

	/**
	 * 電話番号を市外局番、市内局番、加入者番号に分割し、ハイフン編集を行う。
	 *
	 * @param bl ビューロジックへの参照
	 * @param tln 電話番号。数字だけで構成された9桁以上の文字列。
	 * @return 分割した番号をハイフン編集した文字列。エラー発生時は、引数のtlnをそのまま返却。
	 */
	public static String editTln(X31BWebBusinessLogic bl, String tln) throws Exception
	{
		String[] splitedTln = splitTln(bl, tln);

		// エラーありの場合
		if (JFUWebCommon.isNull(splitedTln))
		{
			return tln;
		}

		// ハイフン編集後に返却
		return splitedTln[0] + "-" + ((splitedTln[1].length() > 0) ? splitedTln[1] + "-" : "") + splitedTln[2];
	}

	/**
	 * 検索結果格納用マップから市外局番を取得する
	 *
	 * @param outputMap ビューロジックへの参照
	 * @return 市外局番
	 */
	@SuppressWarnings("unchecked")
	private static String GetEditTln(HashMap<String, Object> outputMap)
	{
		HashMap parentMap = (HashMap)outputMap.get(FUSV023201SC);
		ArrayList childList = (ArrayList)parentMap.get(EZM0091B012CBSMSG1LIST);
		HashMap childMap = (HashMap)childList.get(0);
		return (String)childMap.get(AREACD);
	}

	/**
	 * エラー処理
	 * <br/>
	 * サービスIFの検索結果のエラー処理を行います。
	 *
	 * @param outputMap 検索結果格納用マップ
	 * @return true：エラーあり false：正常
	 */
	private static boolean chkErr(HashMap<String, Object> outputMap)
	{
		// 検索エラーフラグの取得
		String searchErrFlg = JFUWebCommon.getSearchErrFlg(FUSV023201SC, outputMap);

		// 検索結果が0件または検索結果が最大検索件数超えの場合
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg) || JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			return true;
		}

		return false;
	}

}
