package org.hibernate.auction.model;

import java.io.Serializable;
import java.util.Date;

/**
 * Abstrakcyjna klasa bazowa szczegółów płatności.
 * <p>
 * Obiekt jest zawsze powiązany z konkretnym użytkownikiem i w pełni
 * zależy od jego cyklu życia. Reprezentuje jedną ze strategii płatności
 * wybraną przez użytkownika. Najczęściej klasę tę odwzorowuje się jako kolekcję.
 *
 * @author Christian Bauer <christian@hibernate.org>
 */
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();

	/**
	 * Konstruktor bezparametrowy dla narzędzi JavaBean.
	 */
	BillingDetails() {}

	/**
	 * Pełny konstruktor.
	 */
	protected BillingDetails(String ownerName, User user) {
		this.ownerName = ownerName;
		this.user = user;
	}

	// ********************** Metody dostępowe ********************** //

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

	// ********************** Inne typowe metody ********************** //

	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) {
		// Szczegóły płatności sortuje się na podstawie daty utworzenia.
		if (o instanceof BillingDetails)
			return getCreated().compareTo( ((BillingDetails)o).getCreated() );
		return 0;
	}

	// ********************** Metody biznesowe ********************** //

	/**
	 * Sprawdza, czy dane płatności są poprawne.
	 * <p>
	 * Konkretny algorytm implementują podklasy.
	 *
	 * @return boolean
	 */
	public abstract boolean isValid();

}
