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

import java.util.ArrayList;

import edu.whs.spin2018.baoapp.model.spiel.spieler.Spieler;
import edu.whs.spin2018.baoapp.model.spiel.spieler.SpielerIndex;

/**
 * Repraesentiert einen Spielzug. Speichert die Veraenderungen an den einzelnen Mulden.
 */
public class Spielzug {

    /**
     * Der Spieler, der den Spielzug gestartet hat
     */
    private final Spieler ausfuehrenderSpieler;

    /**
     * Veraenderungen, die im Laufe des Spielzuges ausgefuehrt wurden.
     */
    private ArrayList<MuldenVeraenderung> veraenderungen;

    /**
     * Name des Spielers, der das Spiel gewonnen hat
     */
    private String gewinnerName;

    /**
     * Repräsentiert einen Spielzug mit seinen Veränderungen an den Mulden.
     * @param ausfuehrenderSpieler
     */
    public Spielzug(Spieler ausfuehrenderSpieler) {
        veraenderungen = new ArrayList<>();
        this.ausfuehrenderSpieler = ausfuehrenderSpieler;
        this.gewinnerName = null;
    }

    /**
     * Fügt dem Spielzug eine Muldenveraenderung hinzu.
     * @param veraenderung
     */
    public void fuegeVeraenderungHinzu(MuldenVeraenderung veraenderung) {
        veraenderungen.add(veraenderung);
    }

    /**
     * Gibt alle Muldenveraenderungen des Spielzugs wieder.
     * @return eine Liste von Muldenveraenderungen.
     */
    public ArrayList<MuldenVeraenderung> gibVeraenderungen() {
        return veraenderungen;
    }

    @Override
    public String toString() {
        StringBuilder ausgabe = new StringBuilder();
        for (int i = 0; i < veraenderungen.size(); i++) {
            ausgabe.append(veraenderungen.get(i).toString()).append('\n');
        }
        return ausgabe.toString();
    }


    /**
     * Prüft ob das Spiel nach der Ausführung dieses Spielzugs beendet ist.
     * @return ob Spiel beendet ist
     */
    public boolean istSpielBeendet() {
        return (gewinnerName != null);
    }

    /**
     * Gibt den Spieler, der den Spielzug ausgeführt hat.
     * @return den Spieler der den Spielzug ausgeführt hat.
     */
    public Spieler gibAusfuehrendenSpieler() {
        return ausfuehrenderSpieler;
    }

    /**
     * Setzt den Namen des Gewinners in den Spielzug.
     * @param name Name des Gewinners
     */
    public void setzeGewinnerNamen(String name) {
        this.gewinnerName = name;
    }

    /**
     * Gibt den Namen des Gewinners aus dem Spielzug.
     * @return den Namen des Gewinners.
     */
    public String gibGewinnerName() {
        return gewinnerName;
    }
}
