package jp.co.ntt.lms.imode.extension;
import java.util.Hashtable;

import jp.co.ntt.lms.imode.common.StringSeparator;

/**
 * HACP通信で使用するパラメータを取得します。
 *
 */
public class HacpDataParameters {
	/** HACP通信のパラメータ */
	Hashtable hacpDataTable = null;
	
	/**
	 * HACP通信のパラメータを取得するための領域を確保します。
	 *
	 */
	public HacpDataParameters(){
		hacpDataTable = new Hashtable();
	}

	/**
	 * HACP通信のパラメータをHACP通信で使用するテキスト表現に変換します。
	 * <pre>
	 *   error=0
	 *   error_text=
	 *   detail_error=null
	 *   version=1.3
	 *   aicc_data=...
	 * </pre>
	 * @return HACP通信応答データ
	 */
	public String getHacpDataText(){
		StringBuffer sbOutput = new StringBuffer();
		sbOutput.append("error=" + getStringValue("error") + "\n");
		sbOutput.append("error_text=" + getStringValue("error_text") + "\n");
		sbOutput.append("detail_error=" + getStringValue("detail_error") + "\n");
		sbOutput.append("version=" + getStringValue("version") + "\n");
		sbOutput.append("aicc_data=" + getStringValue("aicc_data"));
		return sbOutput.toString();
	}
	
	/**
	 * HACP通信のパラメータの値を取得します。
	 * @param key パラメータのキー名
	 * @return パラメータの値
	 */
	public String get(String key){
		return (String)hacpDataTable.get(key);
	}
	
	/**
	 * HACP通信で使用するテキスト表現からパラメータを取り出します。
	 * @param hacpText HACP通信のテキスト表現
	 */
	public void setHacpDataText(String hacpText){
		String hacpTextWithoutAiccData = "";
		//aicc_dataの項目を先に取得
		int aicc_data_start = hacpText.indexOf("aicc_data=");
		try{
			String aiccData = hacpText.substring(aicc_data_start + "aicc_data=".length());
			hacpDataTable.put("aicc_data", aiccData);
			hacpTextWithoutAiccData = hacpText.substring(0, aicc_data_start);
		}catch(Exception e){
		}
		//その他の項目を取得
		StringSeparator st = new StringSeparator(hacpTextWithoutAiccData, "\r\n");
		while(st.hasNext()){
			String line = st.next();
			String[] paramValue = getParamAndValue(line, "=");
			if(paramValue != null){
				hacpDataTable.put(paramValue[0], paramValue[1]);
			}
		}
	}

	/**
	 * 1行の文字列をキーと値に分離します。
	 * @param line 1行の文字列
	 * @param separator 区切り文字
	 * @return 文字列配列[0] = キー、[1]=値
	 */
	private String[] getParamAndValue(String line, String separator){
		String[] paramAndValue = new String[2];
		int equalPos = line.indexOf(separator);
		try{
			paramAndValue[0] = line.substring(0, equalPos);
			paramAndValue[1] = line.substring(equalPos + separator.length());
			return paramAndValue;
		}catch(Exception e){
			return null;
		}
	}

	/**
	 * HACP通信のパラメータの値を取得します。
	 * ただし、nullの場合は""を返します。
	 * @param key キー名
	 * @return パラメータの値。nullの場合は""
	 */
	private String getStringValue(String key){
		String value = this.get(key);
		return (value==null) ? "" : value;
	}
}
