package org.springframework.prospring.ticket.domain;

import java.util.*;

/**
 * Reprezentuje zakup.
 */
public class Purchase {

    // identyfikator zakupu.
    private long id;

    // kod uwierzytelniający płatności dla tego zakupu.
    private String paymentAuthorizationCode;

    // data zakupu.
    private Date purchaseDate;

    // nazwa klienta.
    private String customerName;

    // zaszyfrowany numer karty kredytowej.
    private String encryptedCardNumber;

    // adres poczty elektronicznej klienta.
    private String email;

    // adres do rozliczeń dla tego zakupu.
    private Address billingAddress;

    // adres wysyłki dla tego zakupu.
    private Address deliveryAddress;

    // zarejestrowany użytkownik który dokonał zakupu.
    private RegisteredUser registeredUser;

    // określa czy zamówione bilety zostały/zostaną pobrane przez użytkownika
    private boolean userCollected;

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

    /**
     * Konstruktor - tworzy nowy zakup.
     * @param paymentAuthorizationCode Kod uwierzytelniający.
     * @param purchaseDate Data zakupu.
     * @param customerName Nazwa klienta.
     * @param encryptedCardNumber Zaszyfrowany numer karty kredytowej.
     * @param email Adres poczty elektronicznej klienta.
     * @param billingAddress Adres do rozliczeń dla tego zakupu.
     * @param deliveryAddress Adres wysyłki dla tego zakupu.
     */
    public Purchase(
        String paymentAuthorizationCode,
        Date purchaseDate,
        String customerName,
        String encryptedCardNumber,
        String email,
        Address billingAddress,
        Address deliveryAddress) {

        this.paymentAuthorizationCode = paymentAuthorizationCode;
        this.purchaseDate = purchaseDate;
        this.customerName = customerName;
        this.encryptedCardNumber = encryptedCardNumber;
        this.email = email;
        this.billingAddress = billingAddress;
        this.deliveryAddress = deliveryAddress;
    }

    /**
     * Zwraca identyfikator zakupu.
     * @return Identyfikator zakupu.
     */
    public long getId() {
        return id;
    }

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

    /**
     * Zwraca kod uwierzytelniający dla tego zakupu.
     * @return Kod uwierzytelniający dla tego zakupu.
     */
    public String getPaymentAuthorizationCode() {
        return paymentAuthorizationCode;
    }

    /**
     * Ustawia kod uwierzytelniający dla tego zakupu.
     * @param paymentAuthorizationCode Kod uwierzytelniający dla tego zakupu.
     */
    public void setPaymentAuthorizationCode(String paymentAuthorizationCode) {
        this.paymentAuthorizationCode = paymentAuthorizationCode;
    }

    /**
     * Zwraca datę złożenia zakupu.
     * @return Data złożenia zakupu.
     */
    public Date getPurchaseDate() {
        return purchaseDate;
    }

    /**
     * Ustawia datę złożenia zakupu.
     * @param purchaseDate Data złożenia zakupu.
     */
    public void setPurchaseDate(Date purchaseDate) {
        this.purchaseDate = purchaseDate;
    }

    /**
     * Zwraca adres poczty elektronicznej klienta który złożył zamówienie.
     * @return Adres poczty elektronicznej klienta.
     */
    public String getEmail() {
        return email;
    }

    /**
     * Ustawia adres poczty elektronicznej klienta który złożył zamówienie.
     * @param email Adres poczty elektronicznej klienta.
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Zwraca adres do rozliczeń dla tego zamówienia.
     * @return Adres do rozliczeń dla tego zamówienia.
     */
    public Address getBillingAddress() {
        return billingAddress;
    }

    /**
     * Ustawia adres do rozliczeń dla tego zamówienia.
     * @param billingAddress Adres do rozliczeń dla tego zamówienia.
     */
    public void setBillingAddress(Address billingAddress) {
        this.billingAddress = billingAddress;
    }

    /**
     * Zwraca adres wysyłki dla tego zamówienia.
     * @return Adres wysyłki dla tego zamówienia.
     */
    public Address getDeliveryAddress() {
        return deliveryAddress;
    }

    /**
     * Ustawia adres wysyłki dla tego zamówienia.
     * @param deliveryAddress Adres wysyłki dla tego zamówienia.
     */
    public void setDeliveryAddress(Address deliveryAddress) {
        this.deliveryAddress = deliveryAddress;
    }

    /**
     * Zwraca nazwę klienta który złożył zamówienie.
     * @return Nazwa klienta który złożył zamówienie.
     */
    public String getCustomerName() {
        return customerName;
    }

    /**
     * Ustawia nazwę klienta który złożył zamówienie.
     * @param customerName Nazwa klienta który złożył zamówienie.
     */
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    /**
     * Zwraca zaszyfrowany numer karty kredytowej użytej do rozliczenia zamówienia.
     * @return Zaszyfrowany numer karty kredytowej użytej do rozliczenia zamówienia.
     */
    public String getEncryptedCardNumber() {
        return encryptedCardNumber;
    }

    /**
     * Ustawia zaszyfrowany numer karty kredytowej użytej do rozliczenia zamówienia.
     * @param encryptedCardNumber Zaszyfrowany numer karty kredytowej użytej do rozliczenia zamówienia.
     */
    public void setEncryptedCardNumber(String encryptedCardNumber) {
        this.encryptedCardNumber = encryptedCardNumber;
    }

    /**
     * Zwraca zarejestrowanego użytkownika, który złożył zamówienie.
     * @return Zarejestrowany użytkownik, który złożył zamówienie lub null jeśli użytkownik nie jest zarejestrowany.
     */
    public RegisteredUser getRegisteredUser() {
        return registeredUser;
    }

    /**
     * Ustawia zarejestrowanego użytkownika, który złożył zamówienie.
     * @param registeredUser Zarejestrowany użytkownik, który złożył zamówienie.
     */
    public void setRegisteredUser(RegisteredUser registeredUser) {
        this.registeredUser = registeredUser;
    }

    /**
     * Zwraca wartość logiczną określającą czy bilety będą/zostały pobrane przez użytkownika.
     * @return True jeśli bilety będą/zostały pobrane przez użytkownika.
     */
    public boolean isUserCollected() {
        return userCollected;
    }

    /**
     * Ustawia wartość logiczną określającą czy bilety będą/zostały pobrane przez użytkownika.
     * @param userCollected Określa czy bilety będą/zostały pobrane przez użytkownika.
     */
    public void setUserCollected(boolean userCollected) {
        this.userCollected = userCollected;
    }
}
