package org.springframework.prospring.ticket.domain;

import java.math.*;
import java.util.*;

/**
 * Reprezentuje szczegółowe dane rezerwacji.
 */
public class Booking {

    // identyfikator rezerwacji.
    private long id;

    // data utworzenia rezerwacji.
    private Date dateMade;

    // data ważności rezerwacji.
    private Date reservedUntil;

    // cena rezerwowanych biletów.
    private BigDecimal price;

    // dane zakupu dla tej rezerwacji
    private Purchase purchase;

    // ilość zarezerwowanych miejsc.
    // w rzeczywistej aplikacji byłaby zapewne przechowywana lista wszystkich 
    // zarezerwowanych miejsc.
    // ta wartość będzie używana przy sprawdzaniu czy wszystkie zarezerwowane
    // miejsca są wciąż dostępne.
    private int seatCount;

    /**
     * Pusty konstruktor wymagany przez specyfikację javabean.
     */
    public Booking() {
    }

    /**
     * Konstruktor - tworzy nową rezerwację.
     * @param reserveUntil Data ważności rezerwacji.
     * @param price Cena rezerwacji.
     */
    public Booking(int seatCount, Date reserveUntil, BigDecimal price) {
        this(seatCount, new Date(), reserveUntil, price);
    }

    /**
     * Konstruktor - tworzy nową rezerwację.
     * @param dateMade Data utworzenia rezerwacji.
     * @param reserveUntil Data ważności rezerwacji.
     * @param price Cena rezerwacji.
     */
    public Booking(int seatCount, Date dateMade, Date reservedUntil, BigDecimal price) {
        this.seatCount = seatCount;
        this.dateMade = dateMade;
        this.reservedUntil = reservedUntil;
        this.price = price;
    }

    /**
     * Identyfikator tej rezerwacji.
     * @return Identyfikator rezerwacji.
     */
    public long getId() {
		return id;
	}

    /**
     * Ustawia identyfikator rezerwacji
     * @param id Identyfikator rezerwacji.
     */
    public void setId(long id) {
		this.id = id;
	}

    /**
     * Zwraca datę utworzenia rezerwacji.
     * @return Data utworzenia rezerwacji.
     */
    public Date getDateMade() {
		return dateMade;
	}

    /**
     * Ustawia datę utworzenia rezerwacji.
     * @param dateMade Data utworzenia rezerwacji.
     */
    public void setDateMade(Date dateMade) {
		this.dateMade = dateMade;
	}

    /**
     * Zwraca cenę rezerwacji.
     * @return Cena rezerwacji.
     */
    public BigDecimal getPrice() {
		return price;
	}

    /**
     * Ustawia cenę rezerwacji
     * @param price Cena rezerwacji.
     */
    public void setPrice(BigDecimal price) {
		this.price = price;
	}

    /**
     * Zwraca zakup dla tej rezerwacji, jeśli takie istnieje.
     * @return Zakup dla tej rezerwacji, jeśli taki istnieje.
     */
    public Purchase getPurchase() {
		return purchase;
	}

    /**
     * Ustawia zakup dla tej rezerwacji.
     * @param purchase Zakup dla tej rezerwacji.
     */
    public void setPurchase(Purchase purchase) {
		this.purchase = purchase;
	}

    /**
     * Zwraca datę ważności rezerwacji.
     * @return Data ważności rezerwacji.
     */
    public Date getReservedUntil() {
		return reservedUntil;
	}

    /**
     * Ustawia datę ważności rezerwacji
     * @param reservedUntil Data ważności rezerwacji.
     */
    public void setReservedUntil(Date reservedUntil) {
		this.reservedUntil = reservedUntil;
	}

    /**
     * Zwraca ilość zarezerwowanych miejsc.
     * @return Ilość zarezerwowanych miejsc.
     */
    public int getSeatCount() {
        return seatCount;
    }

    /**
     * Ustawia ilość zarezerwowanych miejsc.
     * @param seatCount Ilość zarezerwowanych miejsc.
     */
    public void setSeatCount(int seatCount) {
        this.seatCount = seatCount;
    }

}
