package org.springframework.prospring.ticket.web;

import java.beans.*;

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

/**
 * Obiekt PropertyEditor (edytor właściwości) dla klasy Reservation.
 *
 * Zazwyczaj definiowałbyś edytory właściwości dla trwałych obiektów, które 
 * wczytywałyby je na podstawie ich identyfikatorów. W tym przypadku, Reservation
 * nie jest trwałym obiektem, nie posiada identyfikatora i nie możne być wczytany 
 * z bazy danych. Zamiast tego edytor tworzy obiekt rezerwaqcji na podstawie 
 * informacji szczegółowych, które są trwałe.
 * Edytor operuje na identyfikatorze szczegółowych informacji o rezerwacji.
 */
public class ReservationEditor extends PropertyEditorSupport {

    private BoxOffice boxOffice;

    public ReservationEditor(BoxOffice boxOffice) {
        this.boxOffice = boxOffice;
    }

    /**
     * Ustawia wartość tego edytora.
     * @param bookingIdAsText Łańcuch znaków reprezentujący identyfikator informacji szczegółowych 
     *        na podstawie których zostanie utworzona rezerwacja.
     */
    public void setAsText(String bookingIdAsText) throws IllegalArgumentException {
        long bookingId = Long.valueOf(bookingIdAsText).longValue();

        // dwie poniższe instrukcje można by zoptymalizować do postaci tylko jednego wywołania
        // metody usługi BoxOffice, lecz zostawiliśmy je w takiej postaci, gdyż dobrze
        // spełniają swoje zadanie.
        Booking booking = boxOffice.getBooking(bookingId);
        Seat[] seats = boxOffice.getBookedSeats(booking);

        // utworzenie rezerwacji i ustawienie jej jako wartości edytora.
        setValue(new Reservation(seats, booking));
    }

    /**
     * Zwraca łańcuch znaków reprezentujący obiekt Reservation stanowiący wartość tego edytora.
     * Zwrócona wartość jest w rzeczywistości łańcuchową reprezentacją identyfikatora 
     * informacji szczegółowych (wartości tego edytora) na jakich bazuje rezerwacja.
     *
     * @see #setAsText(String)
     * @return Zwraca łańcuch znaków reprezentujący obiekt Reservation stanowiący wartość tego edytora.
     */
    public String getAsText() {
        Reservation reservation = (Reservation)getValue();
        return String.valueOf(reservation.getBooking().getId());
    }

}
