package org.hibernate.auction.model;
import java.io.Serializable;
import java.util.Date;
/**
 * This is the abstract superclass for BillingDetails.
 * 
 * A BillingDetails object is always associated with a single
 * User and depends on the lifecycle of that user. It represents
 * one of the billing strategies the User has choosen, usually
 * on BillingDetails is the default in a collection of many.
 *
 * @author Christian Bauer 
 */
public abstract class BillingDetails implements Serializable, Comparable {
	private Long id = null;
	private int version;
	private String ownerName;
	private User user;
	private Date created = new Date();
	/**
	 * No-arg constructor for JavaBean tools.
	 */
	BillingDetails() {}
	/**
	 * Full constructor;
	 */
	protected BillingDetails(String ownerName, User user) {
		this.ownerName = ownerName;
		this.user = user;
	}
	// ********************** Accessor Methods ********************** //
	public Long getId() { return id; }
	public String getOwnerName() { return ownerName; }
	public void setOwnerName(String ownerName) { this.ownerName = ownerName; }
	public User getUser() { return user; }
	public Date getCreated() { return created; }
	// ********************** Common Methods ********************** //
	public boolean equals(Object o) {
		if (this == o) return true;
		if (!(o instanceof BillingDetails)) return false;
		final BillingDetails billingDetails = (BillingDetails) o;
		if (!getCreated().equals(billingDetails.getCreated())) return false;
		if (!getOwnerName().equals(billingDetails.getOwnerName())) return false;
		return true;
	}
	public int hashCode() {
		int result;
		result = getCreated().hashCode();
		result = 29 * result + getOwnerName().hashCode();
		return result;
	}
	public int compareTo(Object o) {
		// Billing Details are simply sorted by creation date
		if (o instanceof BillingDetails)
			return getCreated().compareTo( ((BillingDetails)o).getCreated() );
		return 0;
	}
	// ********************** Business Methods ********************** //
	/**
	 * Checks if the billing information is correct.
	 * 
	 * Check algorithm is implemented in subclasses.
	 *
	 * @return boolean
	 */
	public abstract boolean isValid();
}