/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JZMEditTln
*   ソースファイル名：JZMEditTln.java
*   作成者          ：富士通
*   日付            ：2011年04月28日
*＜機能概要＞
*   電話番号ハイフン編集部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00       2011/04/28   FJ) 宮前    新規作成
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;

import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;

/**
 * 電話番号ハイフン編集部品です。
 * @author FJ
 */
public class JZMEditTln extends JPCCommonUtil 
{
	
	/** KEY 市外局番 */
	private static final String KEY_AREACD_OUTPUT = "areacd";

	/** KEY 市外局番一意 */
	private static final String KEY_EZM0301A010CBSMSG1LIST = "EZM0301A010CBSMsg1List";

	/** KEY 検索最大件数 */
	private static final String KEY_MAX_SEARCH_NUM = "max_search_num";
	
	/** 値 検索最大件数 */
	private static final String MAX_SERACH_NUM = "1";
	
	/** KEY 検索タイプ */
	private static final String KEY_SEARCH_TYPE = "search_type";
	
	/** 値 検索タイプ */
	private static final String SEARCH_TYPE_1 = "1";
	
	/** KEY 表示件数 */
	private static final String KEY_DISPLAY_NUM = "display_num";
	
	/** KEY 局番 */
	private static final String KEY_KYOKU_NO = "key_kyoku_no";
	
	/** KEY 機能コード */
	private static final String KEY_FUNC_CODE = "func_code";
	
	/** サービスID */
	private static final String USECASE_ID = "ZMSV0007";
	
	/** サービスインターフェイスID */
	private static final String TEMP_ID = "ZMSV000701SC";
	
	/** エラーフラグ */
	private static final String SEARCH_ERR_FLG_NO_RET = SEARCH_TYPE_1;
	
	/** エラーメッセージ 電話番号未設定 */
	private static final String NON_TEL_NO = "電話番号が設定されていません。";
	
	/** エラーメッセージ 電話番号不正 */
	private static final String ILLEGAL_TEL_NO = "正しい電話番号を設定してください。";
	
	/** エラーメッセージ 市外局番が存在しない */
	private static final String ERR_MSG_AREA_CD = "市外局番が存在しません。";

	/**
	 * 電話番号を市外局番、市内局番、加入者番号に分割する。
	 * 
	 * @param bl ビューロジックへの参照
	 * @param tln 電話番号。数字だけで構成された9桁以上の文字列。
	 * @return 分割した番号を格納した配列。
	 * @exception Exception
	 */
	@SuppressWarnings("unchecked")
	public static String[] splitTln(JCCWebBusinessLogic bl, String tln) throws Exception 
	{
		if (!isValidParameter(tln)) 
		{
			throw new Exception(NON_TEL_NO);
		}
		if ((tln.length() < 9) || (!tln.matches("[0-9]+"))) 
		{
			throw new Exception(ILLEGAL_TEL_NO);
		}

		// ユースケースID格納用マップ
		HashMap paramMap = new HashMap();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID);

		// 検索キー格納用HashMap
		HashMap inDataMap = new HashMap();
		HashMap<String, Object> inData = new HashMap<String, Object>();
		inData.put(KEY_FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		inData.put(KEY_SEARCH_TYPE, SEARCH_TYPE_1);
		inData.put(KEY_MAX_SEARCH_NUM, MAX_SERACH_NUM);
		inData.put(KEY_DISPLAY_NUM, SEARCH_TYPE_1);
		inData.put(KEY_KYOKU_NO, tln.substring(0, 6));
		inDataMap.put(TEMP_ID, inData);

		// 検索結果格納用HashMap
		HashMap outputMap = new HashMap();

		// サービス呼び出し
		try 
		{
			X31CMessageResult msgResult = bl.invokeService(paramMap, inDataMap, outputMap);
		}
		catch(JCCWebServiceException jccExp)
		{
			String[] ret = {jccExp.getMessage(), "", ""};
			return ret;
		}

		// 検索エラー処理
		if(SEARCH_ERR_FLG_NO_RET.equals(JCCWebCommon.getSearchErrFlg(TEMP_ID, outputMap)))
		{
			
			// 0件の場合
			throw new Exception(ERR_MSG_AREA_CD);
		}

		HashMap parentMap = (HashMap)outputMap.get(TEMP_ID);
		ArrayList childList = (ArrayList)parentMap.get(KEY_EZM0301A010CBSMSG1LIST);
		HashMap childMap = (HashMap)childList.get(0);
		String areacd = (String)childMap.get(KEY_AREACD_OUTPUT);

		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 分割した番号をハイフン編集した文字列。
	 * @exception Exception
	 */
	public static String editTln(JCCWebBusinessLogic bl, String tln) throws Exception
	{
		String[] splitedTln = splitTln(bl, tln);
		return splitedTln[0] + "-" + ((splitedTln[1].length() > 0) ? splitedTln[1] + "-" : "")  + splitedTln[2];
	}

}
