/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFURouterMessageUtil
*   ソースファイル名：JFURouterMessageUtil.java
*   作成者          ：富士通
*   日付            ：2013年01月10日
*＜機能概要＞
*   ルーター文言取得部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/01/10   FJ）中谷    新規作成【ANK-1338-00-00】無線ギガルータ枯渇対応
*   v5.00       2013/02/13   FJ）井口    変更【ANK-1399-00-00】フロントＳ文言確認修正対応
*   v8.00       2014/05/03   FJ）中谷    変更【OM-2014-0001761】ルーター文言不具合対応
*
**********************************************************************/
package eo.web.webview.common;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x31.X31SWebLog;

import eo.common.constant.JFUStrConst;

/**
 * ルーター文言取得部品です。
 * <br>
 * @author 富士通
 */
public class JFURouterMessageUtil
{

	/** ルーター文言定義ファイルパス取得キー */
	private static final String KEY_XML_FILE_PATH = "FUROUTER_MESSAGE_SETTING_FILE_PATH";
	/** ルーター文言定義ファイル */
	private static final String XML_FILE_PATH = JCCWebCommon.getApplicationConst(KEY_XML_FILE_PATH);
	/** ルーター文言取得タグ(料金コースコードマッピング) */
	private static final String TAG_PCRS_CD_MAPPING = "PCRS_CD_MAPPING";
	/** ルーター文言取得タグ属性(id) */
	private static final String TAG_ATTR_ID = "id";
	/** ルーター文言取得タグ(所有ルーター区分) */
	private static final String TAG_OWN_ROUTER_KBN = "OWN_ROUTER_KBN";
	/** ルーター文言取得タグ(料金コースコード) */
	private static final String TAG_PCRS_CD = "PCRS_CD";
	/** ルーター文言取得タグ(ルーター文言(初期表示)) */
	private static final String TAG_ROUTER_MESSAGE_INIT = "ROUTER_MESSAGE_INIT";
	/** ルーター文言取得タグ(ルーター文言(確認)) */
	private static final String TAG_ROUTER_MESSAGE_CFM = "ROUTER_MESSAGE_CFM";
	/** ルーター文言取得タグ(ルーター文言(完了)) */
	private static final String TAG_ROUTER_MESSAGE_COMPLETE = "ROUTER_MESSAGE_COMPLETE";
	/** ルーター文言取得タグ(ID) */
	private static final String TAG_ID = "ID";
	/** ルーター文言取得タグ属性(ルーター速度種別) */
	private static final String TAG_ATTR_ROUTER_SPEED_SBT = "router_speed_sbt";
	/** ルーター文言取得タグ属性(ルーター速度種別(プラン変更前)) */
	private static final String TAG_ATTR_ROUTER_SPEED_SBT_BF = "router_speed_sbt_bf";
	/** ルーター文言取得タグ属性(所有ルーター区分) */
	private static final String TAG_ATTR_OWN_ROUTER_KBN = "own_router_kbn";
	/** ルーター文言取得タグ属性(工事有無(PON識別コード)) */
	private static final String TAG_ATTR_KOJI_UM = "koji_um";
	/** ルーター文言取得タグ属性(エラーメッセージID) */
	private static final String TAG_ATTR_ERR_MSG_ID = "err_msg_id";
	/** ルーター文言取得タグ属性(メール明細コード) */
	private static final String TAG_ATTR_MAIL_DTL_CD = "mail_dtl_cd";
	/** ルーター文言取得タグ属性(電話アダプター有無) */
	private static final String TAG_VA_ADAPTER_UMD = "va_adapter_um";

	/**
	 * ルーター文言リストを返却します。
	 * <br>
	 * @param atknSbt 自動交換種別
	 * @param pcrsCd 料金コースコード
	 * @param routerSpeedSbt ルーター速度種別
	 * @param kojiUm 工事有無
	 * @return ルータ文言リスト
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static List<Map<String, String>> getRouterMessage(String atknSbt, String pcrsCd, String routerSpeedSbt,
			String kojiUm, String vaAdapterUm) throws ParserConfigurationException, SAXException, IOException
	{
		return getRouterMessage(atknSbt, pcrsCd, routerSpeedSbt, routerSpeedSbt, kojiUm, vaAdapterUm);
	}
	
	/**
	 * ルーター文言リストを返却します。
	 * <br>
	 * @param atknSbt 自動交換種別
	 * @param pcrsCd 料金コースコード
	 * @param routerSpeedSbt ルーター速度種別
	 * @param routerSpeedSbtBf ルーター速度種別(プラン変更前)
	 * @param kojiUm 工事有無
	 * @param vaAdapterUm 電話アダプター有無
	 * @return ルータ文言リスト
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static List<Map<String, String>> getRouterMessage(String atknSbt, String pcrsCd, String routerSpeedSbt,
			String routerSpeedSbtBf, String kojiUm, String vaAdapterUm) throws ParserConfigurationException, SAXException, IOException
	{
		List<Map<String, String>> rtnRouterMsgList = new ArrayList<Map<String, String>>();
		
		// XMLパース
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(new File(XML_FILE_PATH));
		Element root = doc.getDocumentElement();

		// 料金コースコード・保有ルーター区分相関
		NodeList pcrsCdRootList = root.getElementsByTagName(TAG_PCRS_CD_MAPPING);
		Element pcrsCdRoot = null;
		int rootListSize = pcrsCdRootList.getLength();

		for (int i = 0; i < rootListSize; i++)
		{
			pcrsCdRoot = (Element)pcrsCdRootList.item(i);
			if (atknSbt.equals(pcrsCdRoot.getAttribute(TAG_ATTR_ID)))
			{
				break;
			}
		}

		NodeList list1 = pcrsCdRoot.getElementsByTagName(TAG_OWN_ROUTER_KBN);
		if (list1 == null)
		{
			X31SWebLog.DEBUG_LOG.debug("【ルーター文言取得タグ(所有ルーター区分)情報未取得エラー】");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		Element ownRouterKbnElement = (Element)list1.item(0);
		NodeList ownList = ownRouterKbnElement.getElementsByTagName(TAG_PCRS_CD);
		if (ownList == null)
		{
			X31SWebLog.DEBUG_LOG.debug("【ルーター文言取得タグ(料金コースコード)情報未取得エラー】");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		Element ownRouterKbnElementChild = null;
		int ownListSize = ownList.getLength();
		for (int i = 0; i < ownListSize; i++)
		{
			ownRouterKbnElementChild = (Element)ownList.item(i);
			if (pcrsCd.equals(ownRouterKbnElementChild.getAttribute(TAG_ATTR_ID)))
			{
				break;
			}
		}

		if (ownRouterKbnElementChild == null)
		{
			X31SWebLog.DEBUG_LOG.debug("【ルーター文言取得タグ(保有ルーター区分相関)情報未取得エラー】");
			// システムエラー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// 保有ルーター区分
		String ownRouterKbn = ownRouterKbnElementChild.getTextContent();

		// ルーター文言取得
		String[] tagList = { TAG_ROUTER_MESSAGE_INIT, TAG_ROUTER_MESSAGE_CFM, TAG_ROUTER_MESSAGE_COMPLETE };
		for (String tag : tagList)
		{
			NodeList routerMsgList = pcrsCdRoot.getElementsByTagName(tag);

			Element routerMsgElement = (Element)routerMsgList.item(0);
			NodeList idList = routerMsgElement.getElementsByTagName(TAG_ID);
			Element routerMsgElementChild = null;
			int idListSize = idList.getLength();

			for (int i = 0; i < idListSize; i++)
			{
				routerMsgElementChild = (Element)idList.item(i);

				// 条件が一致する場合のみ格納
				if (routerSpeedSbt.equals(routerMsgElementChild.getAttribute(TAG_ATTR_ROUTER_SPEED_SBT))
						&& routerSpeedSbtBf.equals(routerMsgElementChild.getAttribute(TAG_ATTR_ROUTER_SPEED_SBT_BF))
						&& ownRouterKbn.equals(routerMsgElementChild.getAttribute(TAG_ATTR_OWN_ROUTER_KBN))
						&& kojiUm.equals(routerMsgElementChild.getAttribute(TAG_ATTR_KOJI_UM))
						&& vaAdapterUm.equals(routerMsgElementChild.getAttribute(TAG_VA_ADAPTER_UMD)))
				{
					String errMsgId = routerMsgElementChild.getAttribute(TAG_ATTR_ERR_MSG_ID);

					Map<String, String> childMap = new HashMap<String, String>();

					if (!JFUWebCommon.isNull(errMsgId))
					{
						X31SWebLog.DEBUG_LOG.debug("【契約状態エラー】エラーメッセージID" + errMsgId);
						// 契約状態エラー
						throw new JCCBusinessException(errMsgId);
					}
					else
					{
						// メール明細コード
						childMap.put(JFUStrConst.ROUTER_MSG_MAP_KEY_MAIL_DTL_CD, routerMsgElementChild.getAttribute(TAG_ATTR_MAIL_DTL_CD));
						// ルーター文言
						childMap.put(JFUStrConst.ROUTER_MSG_MAP_KEY_ROUTER_MSG, routerMsgElementChild.getTextContent());

						rtnRouterMsgList.add(childMap);
						break;
					}
				}
			}
		}

		//メモリー開放
		root = null;
		doc = null;
		builder = null;

		return rtnRouterMsgList;
	}
}
