package org.springframework.prospring.ticket.service;

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

/**
 * Reprezentuje żądanie zakupu biletów na spektakl.
 */
public class PurchaseRequest {

    // rezerwacja skojarzona z żądaniem.
    private Reservation reservation;

    // spektakl skojarzony z żądaniem.
    private Performance performance;

    // szczegółowe informacje dotyczące karty kredytowej.
    private CreditCardDetails creditCardDetails;

    // adres do rozliczeń.
    private Address billingAddress;

    // adres wysyłki.
    private Address deliveryAddress;

    // adres poczty elektronicznej użytkownika dokonującego zamówienia.
    private String email;

    // określa czy użytkownik sam odbierze bilety.
    private boolean collect;

    /**
     * Konstruktor.
     */
    public PurchaseRequest() {
    }

    /**
     * Zwraca rezerwację skojarzoną z żądaniem zakupu.
     * @return Rezerwacja skojarzona z żądaniem zakupu.
     */
    public Reservation getReservation() {
        return reservation;
    }

    /**
     * Ustawia rezerwację skojarzoną z żądaniem zakupu.
     * @param reservation Rezerwacja skojarzona z żądaniem zakupu.
     */
    public void setReservation(Reservation reservation) {
        this.reservation = reservation;
    }

    /**
     * Zwraca spektakl skojarzony z tym żądaniem.
     * @return Spektakl skojarzony z tym żądaniem.
     */
    public Performance getPerformance() {
        return performance;
    }

    /**
     * Ustawia spektakl skojarzony z tym żądaniem.
     * @param performance Spektakl skojarzony z tym żądaniem.
     */
    public void setPerformance(Performance performance) {
        this.performance = performance;
    }

    /**
     * Zwraca szczegółwe informacje o kartcie kredytowej.
     * @return Szczegółwe informacje o kartcie kredytowej.
     */
    public CreditCardDetails getCreditCardDetails() {
        return creditCardDetails;
    }

    /**
     * Ustawia szczegółwe informacje o kartcie kredytowej.
     * @param creditCardDetails Szczegółwe informacje o kartcie kredytowej.
     */
    public void setCreditCardDetails(CreditCardDetails creditCardDetails) {
        this.creditCardDetails = creditCardDetails;
    }

    /**
     * Zwraca adres do rozliczeń dla tego żądania zakupu.
     * @return Adres do rozliczeń dla tego żądania zakupu.
     */
    public Address getBillingAddress() {
        return billingAddress;
    }

    /**
     * Ustawia adres do rozliczeń dla tego żądania zakupu.
     * @param billingAddress Adres do rozliczeń dla tego żądania zakupu.
     */
    public void setBillingAddress(Address billingAddress) {
        this.billingAddress = billingAddress;
    }

    /**
     * Zwraca adres wysyłki dla tego żądania zakupu.
     * @return Adres wysyłki dla tego żądania zakupu, null jeśli adres wysyłki jest taki sam
     * jak adres do rozliczeń.
     */
    public Address getDeliveryAddress() {
        return deliveryAddress;
    }

    /**
     * Ustawia adres wysyłki dla tego żądania zakupu.
     * @param deliveryAddress Adres wysyłki dla tego żądania zakupu.
     */
    public void setDeliveryAddress(Address deliveryAddress) {
        this.deliveryAddress = deliveryAddress;
    }

    /**
     * Zwraca adres poczty elektronicznej użytkownika, który dokonał zamówienia.
     * @return Adres poczty elektronicznej użytkownika.
     */
    public String getEmail() {
        return email;
    }

    /**
     * Ustawia adres poczty elektronicznej użytkownika, który dokonał zamówienia.
     * @param email Adres poczty elektronicznej użytkownika.
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Zwraca wartość logiczną określającą czy użytkownik sam odbierze zamówione bilety czy należy je wysłać.
     * @return true jeśli użytkownik sam odbierze bilety, false jeśli należy je wysłać pocztą.
     */
    public boolean isCollect() {
        return collect;
    }

    /**
     * Określa czy użytkownik sam odbierze bilety, czy też należy je do niego wysłać pocztą.
     * @param collect Wartość określająca czy użytkownik sam odbierze bilety czy należy je wysłać.
     */
    public void setCollect(boolean collect) {
        this.collect = collect;
    }

}
