package edu.whs.spin2018.baoapp.model.spiel.spieler;

import edu.whs.spin2018.baoapp.model.spiel.BaoSpiel;

/**
 * Oberklasse fuer die Spieler.
 */
public abstract class Spieler {

    private String name;
    private boolean istAmZug;
    private BaoSpiel baoSpiel;
    /**
     * Dient zur Ermittlung ob der Spieler Spieler Eins oder Spieler Zwei ist. {@link ComputerSpieler}
     * sind immer Spieler Zwei.
     */
    private SpielerIndex spielerIndex;

    /**
     * Erzeugt einen Spieler mit einem Namen und dem
     *
     * @param name         - Name des Spielers
     * @param spielerIndex - Index des Spielers
     */
    public Spieler(String name, SpielerIndex spielerIndex) {
        this.name = name;
        this.spielerIndex = spielerIndex;
        istAmZug = false;
        this.baoSpiel = null;
    }

    /**
     * Setzt das BaoSpiel des Spielers.
     *
     * @param baospiel das zu setzende BaoSpiel
     */
    public void setzeBaoSpiel(BaoSpiel baospiel) {
        this.baoSpiel = baospiel;
    }


    /**
     * Gibt an, ob es sich bei dem Spieler um Spieler Eins oder Spieler Zwei handelt
     *
     * @return true genau dann, wenn der Spieler auf dem diese Methode aufgerufen wurde,
     * Spieler Eins ist
     */
    public boolean istSpielerEins() {
        return this.spielerIndex == SpielerIndex.SPIELER_EINS;
    }

    /**
     * Gibt das BaoSpiel des Spielers
     *
     * @return das BaoSpiel des Spielers
     */
    public BaoSpiel gibBaoSpiel() {
        return this.baoSpiel;
    }

    /**
     * Setzt den Zug des Spielers.
     *
     * @param zug ob er am Zug ist oder nicht
     */
    public void setzeZug(boolean zug) {
        istAmZug = zug;
    }

    /**
     * Gibt den SpielerIndex des Spielers.
     *
     * @return SpielerIndex des Spielers
     */
    public SpielerIndex gibSpielerIndex() {
        return spielerIndex;
    }

    /**
     * Gibt den Namen des Spielers.
     *
     * @return Name des Spielers
     */
    public String gibName() {
        return this.name;
    }

    /**
     * Liefert, ob der Spieler am Zug ist oder nicht.
     *
     * @return true, genau dann wenn der Spieler am Zug ist
     */
    public boolean istAmZug() {
        return istAmZug;
    }

    /**
     * Setzt den Zug eines Spielers
     * @param istAmZug ob der Spieler jetzt am Zug ist oder nicht
     */
    public void setzeIstAmZug(boolean istAmZug) {
        this.istAmZug = istAmZug;
    }
}
