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

package jp.sourceforge.livez.vodafone;

import java.util.ArrayList;
import java.util.List;

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.CarrierType;
import jp.sourceforge.livez.Screen;
import jp.sourceforge.livez.ServiceType;
import jp.sourceforge.livez.images.ImageType;

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

	private static final long serialVersionUID = 1L;

	/**
	 * デフォルトコンストラクタです。
	 */
	public VodafoneImpl() {
		this.imageTypes.add(ImageType.PNG);
	}

	void setup(final jp.sourceforge.livez.dao.Vodafone v) {
		// 名称群を設定します
		this.name			= v.getName();
		this.productName	= v.getProductName();
	}

	void setup(final VodafoneRequest r) {
		final VodafoneUserAgent ua = r.getUserAgent();

		// 名称群を設定します
		this.id = r.getId();
		this.name = r.getName();

		if (this.productName == null)
			this.productName = r.getName();

		this.seriesName = r.getSeriesName();
		this.vendorId = r.getVendorId();

		if (r.getType() != VodafoneType.UNKNOWN) {
			// 画面情報を構築します
			this.screen = new ScreenImpl(r);

			// ブラウザ情報を構築します
			this.browser = new VodafoneBrowserImpl(r);
		}
	
		// Vアプリ情報を設定します
		this.appli = ua.getVappli();

		// サウンド情報が存在する場合は構築します
		if (r.getSmd() > 0 || r.getSmaf() != null)
			this.sound = new VodafoneSoundImpl(r);

		// リクエスト情報を設定します
		this.type			= r.getType();
		this.application	= ua.getApplication();
		this.serialNumber	= ua.getSerialNumber();
		this.uid			= r.getUID();

		if (r.getType() != VodafoneType.C2)
			this.imageTypes.add(ImageType.JPEG);
		if (r.getType() != VodafoneType.UNKNOWN
			|| r.getType().getCategoryType() != VodafoneCategoryType.THREE_GC)
			this.imageTypes.add(ImageType.GIF_8BIT);
	}

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getServiceType()
	 */
	public ServiceType getServiceType() {
		return ServiceType.VODAFONE_LIVE;
	}

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getCarrierType()
	 */
	public CarrierType getCarrierType() {
		return CarrierType.VODAFONE;
	}

	/**
	 * 端末ID を保持します。
	 */
	private String id = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getId()
	 */
	public String getId() {
		return id;
	}

	/**
	 * 機種名を保持します。
	 */
	private String name = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getName()
	 */
	public String getName() {
		return name;
	}

	/**
	 * 製品名を保持します。
	 */
	private String productName = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getProductName()
	 */
	public String getProductName() {
		return productName;
	}

	/**
	 * シリーズ名を保持します。
	 */
	private String seriesName = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getSeriesName()
	 */
	public String getSeriesName() {
		return seriesName;
	}

	/**
	 * ベンダーIDを保持します。
	 */
	private String vendorId = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getVendorId()
	 */
	public String getVendorId() {
		return vendorId;
	}

	private ScreenImpl screen = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getScreen()
	 */
	public Screen getScreen() {
		return screen;
	}

	private VodafoneBrowserImpl browser = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getBrowser()
	 */
	public VodafoneBrowser getBrowser() {
		return browser;
	}

	/**
	 * Vアプリ実行環境情報を保持します。
	 */
	private Vappli appli = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getAppli()
	 */
	public Vappli getAppli() {
		return appli;
	}

	private VodafoneSoundImpl sound = null;

	/*
	 * @see jp.sourceforge.livez.vodafone.Vodafone#getSound()
	 */
	public VodafoneSound getSound() {
		return sound;
	}

	/**
	 * 端末の型を保持します。
	 */
	private VodafoneType type = null;

	/*
	 * @see jp.sourceforge.livez.vodafone.Vodafone#getType()
	 */
	public VodafoneType getType() {
		return type;
	}

	/**
	 * アクセスアプリケーション情報を保持します。
	 */
	private Application application = null;

	/*
	 * @see jp.sourceforge.livez.vodafone.Vodafone#getApplication()
	 */
	public Application getApplication() {
		return application;
	}

	/**
	 * 端末の製造番号を保持します。
	 */
	private String serialNumber = null;

	/*
	 * @see jp.sourceforge.livez.vodafone.Vodafone#getSerialNumber()
	 */
	public String getSerialNumber() {
		return serialNumber;
	}

	/**
	 * UID 情報を保持します。
	 */
	private UID uid = null;

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getUserId()
	 */
	public UID getUserId() {
		return uid;
	}

	private List<ImageType> imageTypes = new ArrayList<ImageType>(4);

	/*
	 * @see jp.sourceforge.livez.MobilePhone#getEnableImageTypes()
	 */
	public List<ImageType> getEnableImageTypes() {
		return imageTypes;
	}

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

}
