package at.reisinger.obj;

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Verwaltet eine Liste vo at.reisinger.obj.Cards
 */
@JsonAutoDetect
public class Cards {
    @JsonDeserialize(as = ArrayList.class, contentAs = Card.class)
    private ArrayList<Card> cards;

    /**
     * Erstellt ein nues obj mit gegebenen Karten
     * @param cardsArrayList Die at.reisinger.obj.Cards zum erstellen des Obj
     */
    @JsonCreator
    public Cards(@JsonProperty("cards") ArrayList<Card> cardsArrayList) {
        this.cards = cardsArrayList;
    }

    /**
     * Setzt die Carten
     * @param cards Cards in einer ArrayList die gesetzt werden sollen
     */
    public void setCards(ArrayList<Card> cards) {
        this.cards = cards;
    }

    /**
     * Fügt eine neue at.reisinger.obj.Card hinzu
     * @param newCard neue at.reisinger.obj.Card
     */
    @JsonSetter
    public void addCard(Card newCard) {
        this.cards.add(newCard);
    }

    /**
     * Holt alle at.reisinger.obj.Cards
     * @return Alle at.reisinger.obj.Cards
     */
    @JsonGetter
    public ArrayList<Card> getCards() {
        return this.cards;
    }

    /**
     * Löscht die gegebene at.reisinger.obj.Card
     * @param delCard at.reisinger.obj.Card zum löschen
     */
    public void delCard(Card delCard) {
        this.cards.removeIf(obj -> obj.equals(delCard));
    }

    /**
     * Prüft ob eine at.reisinger.obj.Card in den at.reisinger.obj.Cards vorhanden ist
     * @param toCeck at.reisinger.obj.Card nach der in den at.reisinger.obj.Cards gesucht werden soll
     * @return True wenn die at.reisinger.obj.Card in den at.reisinger.obj.Cards ist
     */
    public boolean containsCard(String toCeck){
        AtomicBoolean returnval = new AtomicBoolean(false);
        this.cards.forEach(item -> returnval.set(item.getName().equals(toCeck)));
        return returnval.get();
    }

    /**
     * Vergleicht 2 at.reisinger.obj.Cards Obj miteinander
     * @param toCompare at.reisinger.obj.Cards zum vergleichen
     * @return True wenn es aus den selben at.reisinger.obj.Cards besteht
     */
    public boolean equals(Cards toCompare){
        if (this.cards == null && toCompare.getCards() == null){
            return true;
        }else if ((this.cards == null && toCompare.getCards() != null) || (this.cards != null && toCompare.getCards() == null)){
            return false;
        }else return Objects.requireNonNull(this.cards).containsAll(toCompare.getCards()) && toCompare.getCards().containsAll(this.cards);
    }
}
