package addressbook;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class SearchUserInfoBean {

	ConnectXprioriBean xcon = null; // ConnectXprioriBeanクラス

	/**
	 * コンストラクタ ConnectXprioriBeanクラスを呼び出しXprioriとの接続を確立する
	 */
	public SearchUserInfoBean() {
		// Xprioriとの接続を確立
		xcon = new ConnectXprioriBean();
	}

	/**
	 * ユーザの総数を取得する
	 * 
	 * @return ユーザ総数
	 */
	public int CountAllUser() {
		// ユーザ総数を取得するXPath
		String xpath = "count(/ND/user_info/user)";
		// 検索結果を取得する
		String count_xml = xcon.query(xpath);
		// XMLを解析する
		Document doc = AddressbookUtils.loadXMLFromString(count_xml);

		return AddressbookUtils.getQResultInteger(doc);
	}

	/**
	 * ユーザを指定した位置から、オフセット分取得する
	 * 
	 * @param start
	 *            取得開始番号
	 * @param offset
	 *            オフセット
	 * @return UserBeanの配列
	 */
	public UserBean[] getUsers(int start, int offset) {

		// 引数からXPathの条件をつくる
		String xpathCondition = "position() >= " + start + " and "
				+ "position() < " + (start + offset);

		// 指定した範囲のuserノードを取得するXPathを問い合わせ検索結果を取得する
		String usersXML = xcon.query("/ND/user_info/user[" + xpathCondition
				+ "]");
		
		// 検索結果XMLからDOM Documentを作成する
		Document doc = AddressbookUtils.loadXMLFromString(usersXML);
		NodeList usernodeList = doc.getElementsByTagName("user");
		
		// 取得したユーザ個数分のUserBean配列を定義する
		UserBean[] users = new UserBean[usernodeList.getLength()];

		for (int i = 0; i < usernodeList.getLength(); i++) {
			users[i] = new UserBean(usernodeList.item(i));
		}
		return users;
	}

	/**
	 * 指定したIDを持つユーザを取得する
	 * 
	 * @param id
	 * @return UserBean
	 */
	public UserBean getUserById(String id) {
		// 引数idと同じID属性値を持つuserノードを取得するXPathを問い合わせ、検索結果を取得する
		String userXML = xcon.query("/ND/user_info/user[@id = \"" + id + "\"]");
		// 検索結果XMLからDOM Documentを作成する
		Document doc = AddressbookUtils.loadXMLFromString(userXML);
		// DOM Documentから先頭のuserノードを取り出しUserBeanを作成する
		UserBean user = new UserBean(doc.getElementsByTagName("user").item(0));
		return user;
	}
	
	/**
	 * 登録しているユーザの新規IDを取得する
	 * @return
	 */
	public String getNewId() {
		// IDの最大値を取得するXPath
		String xpath = "max(/ND/user_info/user/@id)";
		// 検索結果を取得する
		String idMax_xml = xcon.query(xpath);
		// XMLを解析する
		Document doc = AddressbookUtils.loadXMLFromString(idMax_xml);
		// 最大値に+1する
		int newIntId = AddressbookUtils.getQResultInteger(doc) + 1;
		// idの形式に整形する
		String newStrId = String.format("%06d", newIntId);
		return newStrId;
	}
	
	/**
	 * パラメータからuserを作成する
	 * 
	 * @param param
	 * @return
	 */
	public UserBean getUserByParam(ParamBean param) {
		UserBean user = new UserBean();
		// パラメータの情報をUserBeanに設定する
		user.setID(param.getId());
		user.setName(param.getName());
		user.setPassword(param.getPassword());
		return user;
	}
	
	/**
	 * ログアウトする
	 * 
	 */
	public void logout() {
		xcon.logout();
	}

}

