/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.vodafone;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import jp.sourceforge.livez.IllegalUserIdException;

/**
 * UID を実装したクラスです。
 * 
 * @author 杉澤 浩二
 */
final class UIDImpl implements UID {

	private static final long serialVersionUID = 1L;

	/**
	 * 指定された文字列からクラスを構築します。
	 * 
	 * @param uid UID を表す文字列
	 * @throws IllegalUserIdException UID が不正な場合
	 */
	public UIDImpl(final String uid) throws IllegalUserIdException {
		parse(uid);
	}

	/**
	 * 指定されたHTTPリクエスト情報からクラスを構築します。
	 * 
	 * @param request HTTPリクエスト情報
	 * @throws IllegalUserIdException UID が不正な場合
	 */
	public UIDImpl(final HttpServletRequest request) throws IllegalUserIdException {
		parse(request.getHeader("x-jphone-uid"));
	}

	private void parse(final String uid) throws IllegalUserIdException {
		this.value = uid;

		if (uid == null || uid.equals("NULL")) {
			this.disabled = true;
			this.cType = false;
			this.region = 0;
			this.userId = null;
		} else if(uid.matches("^[123456789][0-9a-zA-Z]{15}$")) {
			this.disabled = false;
			this.cType = true;
			this.region = uid.charAt(0);
			this.userId = uid.substring(1);
		} else if(uid.matches("^[abcdefghi][0-9a-zA-Z]{15}$")) {
			this.disabled = false;
			this.cType = false;
			this.region = uid.charAt(0);
			this.userId = uid.substring(1);
		} else
			throw new IllegalUserIdException();
	}

	/**
	 * UID の生値を保持します。
	 */
	private String value;

	/*
	 * @see jp.sourceforge.livez.vodafone.UID#getValue()
	 */
	public String getValue() {
		return value;
	}

	/**
	 * UID 通知状況を保持します。
	 */
	private boolean disabled;

	/*
	 * @see jp.sourceforge.livez.vodafone.UID#isDisabled()
	 */
	public boolean isDisabled() {
		return disabled;
	}

	/**
	 * UID が C型 かどうかを保持します。
	 */
	private boolean cType;

	/*
	 * @see jp.sourceforge.livez.vodafone.UID#isCtype()
	 */
	public boolean isCtype() {
		return cType;
	}

	/**
	 * UIDの先頭1バイトのエリアコードを保持します。
	 */
	private char region;

	/*
	 * @see jp.sourceforge.livez.vodafone.UID#getRegion()
	 */
	public char getRegion() {
		return region;
	}

	/**
	 * ユーザIDを保持します。
	 */
	private String userId;

	/*
	 * @see jp.sourceforge.livez.vodafone.UID#getUserId()
	 */
	public String getUserId() {
		return userId;
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public boolean equals(final Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
	}

}
