package org.hibernate.auction.model;
/**
 * This billing strategy can handle various credit cards.
 * 
 * The type of credit card is handled with a typesafe
 * enumeration, CreditCardType.
 *
 * @see CreditCardType
 * @author Christian Bauer 
 */
public class CreditCard extends BillingDetails {
	private CreditCardType type;
	private String number;
	private String expMonth;
	private String expYear;
	/**
	 * No-arg constructor for JavaBean tools.
	 */
	CreditCard() { super(); }
	/**
	 * Full constructor.
	 *
	 * @param ownerName
	 * @param user
	 * @param type
	 * @param expMonth
	 * @param expYear
	 */
	public CreditCard(String ownerName, User user, String number, CreditCardType type,
					  String expMonth, String expYear) {
		super(ownerName, user);
		this.type = type;
		this.number = number;
		this.expMonth = expMonth;
		this.expYear = expYear;
	}
	// ********************** Accessor Methods ********************** //
	public CreditCardType getType() { return type; }
	public String getNumber() { return number; }
	public String getExpMonth() { return expMonth; }
	public String getExpYear() { return expYear; }
	// ********************** Common Methods ********************** //
	public String toString() {
		return  "CreditCard ('" + getId() + "'), " +
				"Type: '" + getType() + "'";
	}
	// ********************** Business Methods ********************** //
	public boolean isValid() {
		// Use the type to validate the CreditCard details.
		return getType().isValid(this);
	}
}