import java.util.ArrayList;

/**
 * Spielleiter fuer das Wuerfelspiel Spielleitung .
 * Es werden die Mitspieler verwaltet, der aktuelle Spieler gespeichert, die Wuerfel erzeugt.
 *
 * @version 1.0 vom 20.06.2012
 * @author Thomas Schaller
 */

public class Spielleitung {

    // Anfang Attribute
    private ArrayList<Spieler> spieler;           // Referenz auf die Spieler
    private Wuerfel wuerfel0;                     // Referenz auf die Wuerfel
    private Wuerfel wuerfel1;
    private int     amZug=0;                      // Welcher Spieler hat die Wuerfel?
    // Ende Attribute

    /** Erzeugt den Spielleiter fuer Spielleitung. Es werden auch die notwendigen zwei Wuerfel erzeugt.
     */
    public Spielleitung() {
        this.wuerfel0 = new Wuerfel();             // Wuerfel erzeugen
        this.wuerfel1 = new Wuerfel();
        this.spieler  = new ArrayList<Spieler>();
    }

    // Anfang Methoden
    /** Meldet einen Spieler beim Spielleiter an. Der Spieler wird darueber informiert, wer der Spielleiter ist.
     * @param s Spieler, der angemeldet werden soll.
     */
    public void addSpieler(Spieler s) {
        spieler.add(s);
    }

    /** Testet, ob die aktuelle Wuerfelkombination ein Gewinnwurf ist.
     * @return true, wenn es sich um einen Gewinnwurf handelt, sonst false.
     */
    public boolean gewinnwurf () {
        if (wuerfel0.getWurf()==6 && wuerfel1.getWurf()==6) return true;
        if (wuerfel0.getWurf()==5 && wuerfel1.getWurf()==5) return true;
        if (wuerfel0.getWurf()==3 && wuerfel1.getWurf()==3) return true;
        if (wuerfel0.getWurf()==6 && wuerfel1.getWurf()==5) return true;
        if (wuerfel0.getWurf()==5 && wuerfel1.getWurf()==6) return true;
        return false;
    }

    /** Testet, ob die aktuelle Wuerfelkombination ein Verlustwurf ist.
     * @return true, wenn es sich um einen Verlustwurf handelt, sonst false.
     */
    public boolean verlustwurf () {
        if (wuerfel0.getWurf()==1 && wuerfel1.getWurf()==1) return true;
        if (wuerfel0.getWurf()==2 && wuerfel1.getWurf()==2) return true;
        if (wuerfel0.getWurf()==4 && wuerfel1.getWurf()==4) return true;
        if (wuerfel0.getWurf()==1 && wuerfel1.getWurf()==2) return true;
        if (wuerfel0.getWurf()==2 && wuerfel1.getWurf()==1) return true;
        return false;
    }

    /** Wertet den letzten Wuerfelwurf aus. Falls es ein Gewinn- oder Verlustwurf ist,
     * werden die Spieler ueber ihren Sieg / Verlust informiert.
     * @return true, wenn es sich um einen Gewinn- oder Verlustwurf handelt und ein neuer Durchgang beginnen muss, sonst false.
     */
    public boolean auswerten() {
        if (gewinnwurf()) {
            for (int i = 0; i< spieler.size(); i++) {
                Spieler s = spieler.get(i);
                if (i == amZug) {                    // Wuerfelnder Spieler gewinnt
                    s.gewonnen();
                } else {
                    s.verloren();
                }// end of if
            } // end of for
            return true;
        } // end of if
        if (verlustwurf()) {
            for (int i = 0; i< spieler.size(); i++) {
                Spieler s = spieler.get(i);
                if (i == amZug) {                    // Wuerfelnder Spieler verliert
                    s.verloren();
                } else {
                    s.gewonnen();
                }// end of if
            } // end of for
        } // end of if
        amZug = (amZug+1)% spieler.size();         // der nuechste Spieler wird aktueller Spieler

        return false;
    }

    /** liefert eine Referenz auf einen Wuerfel
     * @param nr Nummer des gewuenschten Wuerfels
     * @return Referenz auf den Wuerfel
     */
    public Wuerfel getWuerfel(int nr) {
        if (nr == 0) {
            return wuerfel0;
        } else {
            return wuerfel1;
        } // end of if
    }

    /** liefert eine Referenz auf einen Spieler
     * @param nr Nummer des gewuenschten Spielers
     * @return Referenz auf den Spieler
     */
    public Spieler getSpieler(int nr) {
        return spieler.get(nr);
    }

    /** liefert eine Referenz auf den Spieler der am Zug ist
     * @return Referenz auf den Spieler
     */
    public Spieler getSpielerAmZug() {
        return spieler.get(amZug);
    }
    // Ende Methoden
} // end of Spielleitung
