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

package jp.sourceforge.livez.ezweb;

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;

/**
 * EZwebMultiMedia の実装クラスです。
 * 
 * @author 杉澤 浩二
 */
final class EZwebMultiMediaImpl implements EZwebMultiMedia {

	private static final long serialVersionUID = 1L;

	/**
	 * コンストラクタです。
	 * 
	 * @param request HTTP リクエスト情報
	 * @throws IllegalArgumentException パラメータが不正な場合
	 */
	public EZwebMultiMediaImpl(final HttpServletRequest request) throws IllegalArgumentException {
		this(request.getHeader("x-up-devcap-multimedia"));
	}

	/**
	 * コンストラクタです。
	 * 
	 * @param s x-up-devcap-multimedia フィールドを表す文字列
	 * @throws IllegalArgumentException パラメータが不正な場合
	 */
	public EZwebMultiMediaImpl(final String s) throws IllegalArgumentException {
		if (s == null)
			return;
		if (!s.matches("^[0-9]{16}$"))
			throw new IllegalArgumentException(s);

		this.ezmovie		= s.charAt(0) - 0x0030;
		this.gps			= s.charAt(1) - 0x0030;
		this.java			= s.charAt(2) - 0x0030;
		this.midi			= s.charAt(3) - 0x0030;
		this.smaf			= s.charAt(4) - 0x0030;
		this.atmail			= s.charAt(5) - 0x0030;
		this.vCard			= s.charAt(6) - 0x0030;
		this.vCalendar		= s.charAt(7) - 0x0030;
		this.emoji			= s.charAt(8) - 0x0030;
		this.brew			= s.charAt(9) - 0x0030;
		this.smafPhotoMixer	= s.charAt(10) - 0x0030;

		this.vector			= s.charAt(12) - 0x0030;
		this.ezchannel		= s.charAt(13) - 0x0030;
		this.externalMemory	= s.charAt(14) - 0x0030;
	}

	/**
	 * EZムービー対応状況を保持します。
	 */
	private int ezmovie = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getEZmovieFormat()
	 */
	public int getEZmovieFormat() {
		return ezmovie;
	}

	/**
	 * 位置情報対応状況を保持します。
	 */
	private int gps = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getGps()
	 */
	public int getGps() {
		return gps;
	}

	/**
	 * EZアプリ(Java)対応状況を保持します。
	 */
	private int java = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getJava()
	 */
	public int getJava() {
		return java;
	}

	/**
	 * C-MIDI 対応状況を保持します。
	 */
	private int midi = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getMidi()
	 */
	public int getMidi() {
		return midi;
	}

	/**
	 * SMAF 対応状況を保持します。
	 */
	private int smaf = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getSmaf()
	 */
	public int getSmaf() {
		return smaf;
	}

	/**
	 * ＠mail 対応状況を保持します。
	 */
	private int atmail = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getAtMail()
	 */
	public int getAtMail() {
		return atmail;
	}

	/**
	 * vCard 対応状況を保持します。
	 */
	private int vCard = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getVCard()
	 */
	public int getVCard() {
		return vCard;
	}

	/**
	 * vCalendar 対応状況を保持します。
	 */
	private int vCalendar = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getVCalendar()
	 */
	public int getVCalendar() {
		return vCalendar;
	}

	/**
	 * 絵文字対応状況を保持します。
	 */
	private int emoji = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getEmoji()
	 */
	public int getEmoji() {
		return emoji;
	}

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getMaxEmojiNumber()
	 */
	public int getMaxEmojiNumber() {
		switch (emoji) {
			case EMOJI_PHASE_1:
				return 304;
			case EMOJI_PHASE_2:
				return 822;
			case EMOJI_PHASE_3:
			default:
				return 828;
		}
	}

	/**
	 * EZアプリ(BREW) 対応状況を保持します。
	 */
	private int brew = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getBrew()
	 */
	public int getBrew() {
		return brew;
	}

	/**
	 * SMAF フォトミキサー対応状況を保持します。
	 */
	private int smafPhotoMixer = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getSmafPhotoMixer()
	 */
	public int getSmafPhotoMixer() {
		return smafPhotoMixer;
	}

	/**
	 * Vector 対応状況を保持します。
	 */
	private int vector = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getVector()
	 */
	public int getVector() {
		return vector;
	}

	/**
	 * EZチャンネル対応状況を保持します。
	 */
	private int ezchannel = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getEZchannel()
	 */
	public int getEZchannel() {
		return ezchannel;
	}

	/**
	 * 外部メモリ保存制御対応状況を保持します。
	 */
	private int externalMemory = 0;

	/*
	 * @see jp.sourceforge.livez.ezweb.EZwebMultiMedia#getExternalMemory()
	 */
	public int getExternalMemory() {
		return externalMemory;
	}

	@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);
	}

}
