package org.springframework.prospring.ticket.dao;

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

import org.springframework.prospring.ticket.domain.*;
import org.springframework.prospring.ticket.domain.support.*;
import org.springframework.prospring.ticket.service.*;


/**
 * Interfejs definiujący wszystkie metody dostępu do danych w naszej przykładowej aplikacji
 */
public interface BoxOfficeDao {

    /**
     * Oznacza wskazane miejsca jako zarezerwowane na konkretny spektakl i skojarzone z podaną rezerwacją.
     * @param seats Miejsca jakie należy oznaczyć jako zarezerwowane.
     * @param performance Spektal na jaki miejsca zostaną zarezerwowane.
     * @param booking Rezerwacja z jaką miejsca są skojarzone.
     * @throws RequestedSeatNotAvailableException Zgłaszany jeśli którekolwiek z miejsc nie jest już dostępne,
     *         czyli jeśli wcześniej zostało zarezerwowane.
     */
    public void reserveSeats(Seat[] seats, Performance performance, Booking booking) 
			throws RequestedSeatNotAvailableException;

    /**
     * Zapisuje rezerwację w bazie danych.
     * @param booking Rezerwacja jaką należy zapisać w bazie danych.
     */
    public void savePurchaseForBooking(Booking booking);

    /**
     * Zwraca wszystkie rodzaje przedstawień zapisane w bazie.
     * @return Wszystkie rodzaje przedstawień zapisane w bazie.
     */
    public List getAllGenres();

    /**
     * Returns all generes with shows in the database
     * Zwraca wszystkie rodzaje przedstawień dla jakich w bazie są jakieś spektakle.
     * @return Wszystkie rodzaje przedstawień dla jakich w bazie są jakieś spektakle.
     */
    public List getCurrentGenres();

    /**
     * Zwraca przedstawienie skojarzone z podanym identyfikatorem przedstawienia.
     * @param id Identyfikator przedstawienia.
     * @return Przedstawienie skojarzone z podanym identyfikatorem.
     */
    public Show getShow(long id);

    /**
     * Zwraca spektakl skojarzony z podanym identyfikatorem spektaklu.
     * @param id Identyfikator spektaklu.
     * @return Spektakl skojarzony z podanym identyfikatorem.
     */
	public Performance getPerformance(long id);

    /**
     * Zwraca zakres cen skojarzony z podanym identyfiaktorem cen.
     * @param id Identyfikator zakresu cen.
     * @return Zakres cen skojarzony z podanym identyfikatorem.
     */
    public PriceBand getPriceBand(long id);

    /**
     * Zwraca strukturę cen skojarzoną z podanym identyfikatorem struktury cen.
     * @param id Identyfikator struktury cen.
     * @return Struktura cen skojarzona z podanym identyfikatorem.
     */
    public PriceStructure getPriceStructure(long id);

    /**
     * Zwraca listę wszystkie spektakli podanego przedstawienia. Zwracane spektakle zawierają informacje
     * o dostępności miejsc.
     * @param show Przedstawienie.
     * @return Lista wszystkie spektakli (wraz z informacjami o dostępnych miejscach) danego przedstawienia.
     */
    public PerformanceWithAvailability[] getAvailabilityForPerformances(Show show);

    /**
     * Zwraca listę wszystkich dostępnych miejsc podanek kategorii na dany spektakl.
     * @param performance Spektakl.
     * @param seatClass Kategoria miejsc.
     * @return Lista wszystkich dostępnych miejsc podanej kategorii na dany spektakl.
     */
    public Seat[] getAvailableSeats(Performance performance, SeatClass seatClass);

    /**
     * Zwraca ilość dostępnych miejsc podanej kategorii na wskazany spektakl.
     * @param performance Spektakl.
     * @param seatClass Kategoria miejsc.
     * @return Zwraca ilość dostępnych miejsc podanej kategorii na wskazany spektakl.
     */
    public int getAvailableSeatsCount(Performance performance, SeatClass seatClass);

    /**
     * Zwraca koszt podanych miejsc na wskazany spektakl.
     * @param performance Spektakl.
     * @param seats Miejsca.
     * @return Koszt podanych miejsc na wskazany spektakl.
     */
    public BigDecimal getCostOfSeats(Performance performance, Seat[] seats);

    /**
     * Usuwa rezerwację z bazy danych.
     * @param booking Rezerwacja jaką należy usunąć z bazy danych.
     */
    public void removeBooking(Booking booking);

    /**
     * Zwraca rezerwację skojarzoną z podanym identyfikatorem.
     * @param bookingId Identyfikator rezerwacji.
     * @return Rezerwacja skojarzona z podanym identyfiaktorem.
     */
    public Booking getBooking(long bookingId);

    /**
     * Zwraca miejsca skojarzone z daną rezerwacją.
     * @param booking Rezerwacja.
     * @return Miejsca skojarzone z podaną rezerwacją.
     */
    public List getSeatsForBooking(Booking booking);

    /**
     * Zwraca spektakl skojarzony z podaną rezerwacją.
     * @param booking Rezerwacja.
     * @return Spektakl skojarzony z podaną rezerwacją.
     */
    public Performance getPerformanceForBooking(Booking booking);

    /**
     * Sprawdza dostępność miejsc skojarzonych z podaną rezerwacją.
     * @param booking Sprawdzana rezerwacja.
     * @return True jeśli miejsca są dostępne, false w przeciwnym przypadku.
     */
    public boolean checkAvailabilityForBooking(Booking booking);

    /**
     * Aktualizuje kod uwierzytelniający danego zakupu w bazie danych. 
     * @param purchase Aktualizowana rezerwacja.
     */
    public void updatePurchaseAuthorizationCode(Purchase purchase);
}
