package org.hibernate.auction.model;

/**
 * Ta strategia płatności obsługuje kilka różnych kart kredytowych.
 * <p>
 * Typ karty kredytowej zawiera bezpieczne pod kątem typów wyliczenie
 * <tt>CreditCardType</tt>.
 *
 * @see CreditCardType
 * @author Christian Bauer <christian@hibernate.org>
 */
public class CreditCard extends BillingDetails {

	private CreditCardType type;
	private String number;
	private String expMonth;
	private String expYear;

	/**
	 * Konstruktor bezparametrowy dla narzędzi JavaBean.
	 */
	CreditCard() { super(); }

	/**
	 * Pełny konstruktor.
	 *
	 * @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;
	}

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

	public CreditCardType getType() { return type; }

	public String getNumber() { return number; }

	public String getExpMonth() { return expMonth; }

	public String getExpYear() { return expYear; }

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

	public String toString() {
		return  "CreditCard ('" + getId() + "'), " +
				"Typ: '" + getType() + "'";
	}

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

	public boolean isValid() {
		// Użyj typu do walidacji numeru karty kredytowej.
		return getType().isValid(this);
	}

}
