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

package jp.sourceforge.livez.vodafone;

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 org.apache.commons.lang.math.NumberUtils;

/**
 * SAMF に関するボーダホン仕様の実装クラスです。
 * 
 * @author 杉澤 浩二
 */
final class VodafoneSmafImpl implements VodafoneSmaf {

	private static final long serialVersionUID = 1L;

	/**
	 * コンストラクタです。
	 * 
	 * @throws NullPointerException パラメータに null を指定した場合
	 * @throws IllegalArgumentException パラメータの値が不正な場合
	 */
	protected VodafoneSmafImpl(final String smaf) throws NullPointerException, IllegalArgumentException {
		if (smaf == null)
			throw new NullPointerException();
		if (!smaf.matches("^[0-9]+(/pcm(/grf(/rs){0,1}){0,1}){0,1}$"))
			throw new IllegalArgumentException();

		final String[] s = smaf.split("/");
		this.melody = NumberUtils.toInt(s[0]);

		switch (s.length) {
			default:
			case 4:	// rs
				this.exKaraoke = "rs".equals(s[3]);
			case 3:	// grf
				this.karaoke = "grf".equals(s[2]);
			case 2:
				if ("pcm".equals(s[1])) {
					this.adpcm = true;
					this.pcm = (this.melody >= 40);
				}
			case 1:
			case 0:
		}
	}

	/**
	 * 和音数を保持します。
	 */
	private int melody = 0;

	/*
	 * @see jp.sourceforge.livez.vodafone.VodafoneSmaf#getMelody()
	 */
	public int getMelody() {
		return melody;
	}

	/**
	 * ADPCM 対応状況を保持します。
	 */
	private boolean adpcm = false;

	/*
	 * @see jp.sourceforge.livez.vodafone.VodafoneSmaf#isAdpcm()
	 */
	public boolean isAdpcm() {
		return adpcm;
	}

	/**
	 * PCM 対応状況を保持します。
	 */
	private boolean pcm = false;

	/*
	 * @see jp.sourceforge.livez.vodafone.VodafoneSmaf#isPcm()
	 */
	public boolean isPcm() {
		return pcm;
	}

	/**
	 * 画像/テキスト(カラオケ(シンクロ))対応状況を保持します。
	 */
	private boolean karaoke = false;

	/*
	 * @see jp.sourceforge.livez.vodafone.VodafoneSmaf#isKaraoke()
	 */
	public boolean isKaraoke() {
		return karaoke;
	}

	/**
	 * カラオケ(シンクロ)拡張対応状況を保持します。
	 */
	private boolean exKaraoke = false;

	/*
	 * @see jp.sourceforge.livez.vodafone.VodafoneSmaf#isExKaraoke()
	 */
	public boolean isExKaraoke() {
		return exKaraoke;
	}

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

}
