package org.springframework.prospring.ticket.service;

import java.util.*;

/**
 * Zawiera szczegółowe informacje związane z kartą kredytową.
 */
public class CreditCardDetails {

    private final static String ENCRYPTED_PREFIX = "XXXX-XXXX-XXXX-";

    // typ karty (visa, master card, itd...)
    private String type;

    // nazwa właściciela zgodna z nadrukiem na karcie.
    private String nameOnCard;

    // numer karty kredytowej.
    private String cardNumber;

    // data ważności karty kredytowej.
    private Date expiryDate;

    /**
     * Pusty konstruktor wymagany przez specyfikację javabeans.
     */
    public CreditCardDetails() {
    }

    /**
     * Konstruktor - tworzy nowy obiekt zawierający szczegółwe informacje o karcie kredytowej
     * @param type Typ karty kredytowej.
     * @param nameOnCard Personalia właściciela karty.
     * @param cardNumber Numer karty.
     * @param expiryDate Data ważności karty.
     */
    public CreditCardDetails(String type, String nameOnCard, String cardNumber, Date expiryDate) {
        this.type = type;
        this.nameOnCard = nameOnCard;
        this.cardNumber = cardNumber;
        this.expiryDate = expiryDate;
    }

    /**
     * Zwraca typ karty kredytowej.
     * @return Typ karty kredytowej.
     */
    public String getType() {
        return type;
    }

    /**
     * Ustawia typ karty kredytowej.
     * @param type Typ karty kredytowej.
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * Zwraca nazwę właściciela umieszczoną na karcie.
     * @return Nazwa właściciela umieszczona na karcie kredytowej.
     */
    public String getNameOnCard() {
        return nameOnCard;
    }

    /**
     * Ustawia nazwę właściciela widoczną na karcie kredytowej.
     * @param nameOnCard Nazwa właściciela widoczna na karcie kredytowej.
     */
    public void setNameOnCard(String nameOnCard) {
        this.nameOnCard = nameOnCard;
    }

    /**
     * Zwraca numer karty kredytowej..
     * @return Numer karty kredytowej.
     */
    public String getCardNumber() {
        return cardNumber;
    }

    /**
     * Zwraca zaszyfrowaną wersję numeru karty kredytowej (którą można na przykład wyświetlić na witrynie).
     * @return Zaszyfrowana wersja numeru karty kredytowej (którą można na przykład wyświetlić na witrynie).
     */
    public String getEncryptedCardNumber() {
        String last4Numbers = cardNumber.substring(cardNumber.length()-4);
        return ENCRYPTED_PREFIX + last4Numbers;
    }

    /**
     * Ustawia numer karty kredytowej.
     * @param cardNumber Numer karty kredytowej.
     */
    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    /**
     * Zwraca datę wygaśnięcia ważności karty kredytowej.
     * @return Data wygaśnięcia ważności karty kredytowej.
     */
    public Date getExpiryDate() {
        return expiryDate;
    }

    /**
     * Ustawia datę wygaśnięcia ważności karty kredytowej.
     * @param expiryDate Data wygaśnięcia ważności karty kredytowej.
     */
    public void setExpiryDate(Date expiryDate) {
        this.expiryDate = expiryDate;
    }

}
