import java.util.ArrayList;

/**
  * Spielleiter für das Würfelspiel Spielleitung .
  * Es werden die Mitspieler verwaltet, der aktuelle Spieler gespeichert, die Würfel 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[] wuerfel = new Wuerfel[2];   // Referenz auf die Würfel
  private int  amZug=0;                         // Nummer des Spielers der am Zug ist
  // Ende Attribute
  
  /** Erzeugt den Spielleiter für Spielleitung. Es werden auch die notwendigen zwei Würfel erzeugt.
  */
  public Spielleitung() {
    this.wuerfel[0] = new Wuerfel();             // Würfel erzeugen
    this.wuerfel[1] = new Wuerfel();
    this.spieler  = new ArrayList<Spieler>();
  }
  
  // Anfang Methoden
  /** Meldet einen Spieler beim Spielleiter an. Der Spieler wird darüber informiert, wer der Spielleiter ist.
  * @param s Spieler, der angemeldet werden soll.
  */
  public void addSpieler(Spieler s) {
    spieler.add(s);
  }
  
  /** Testet, ob die aktuelle Würfelkombination ein Gewinnwurf ist.
  * @return true, wenn es sich um einen Gewinnwurf handelt, sonst false.
  */
  public boolean gewinnwurf () {
    if (wuerfel[0].getWurf()==6 && wuerfel[1].getWurf()==6) return true;
    if (wuerfel[0].getWurf()==5 && wuerfel[1].getWurf()==5) return true;
    if (wuerfel[0].getWurf()==3 && wuerfel[1].getWurf()==3) return true;
    if (wuerfel[0].getWurf()==6 && wuerfel[1].getWurf()==5) return true;
    if (wuerfel[0].getWurf()==5 && wuerfel[1].getWurf()==6) return true;
    return false;
  }
  
  /** Testet, ob die aktuelle Würfelkombination ein Verlustwurf ist.
  * @return true, wenn es sich um einen Verlustwurf handelt, sonst false.
  */
  public boolean verlustwurf () {
    if (wuerfel[0].getWurf()==1 && wuerfel[1].getWurf()==1) return true;
    if (wuerfel[0].getWurf()==2 && wuerfel[1].getWurf()==2) return true;
    if (wuerfel[0].getWurf()==4 && wuerfel[1].getWurf()==4) return true;
    if (wuerfel[0].getWurf()==1 && wuerfel[1].getWurf()==2) return true;
    if (wuerfel[0].getWurf()==2 && wuerfel[1].getWurf()==1) return true;
    return false;
  }
  
  /** Wertet den letzten Würfelwurf aus. Falls es ein Gewinn- oder Verlustwurf ist,
  * werden die Spieler über 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) {                    // Würfelnder 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) {                    // Würfelnder Spieler verliert
          s.verloren();
        } else {
          s.gewonnen();
        }// end of if
      } // end of for
    } // end of if
    amZug = (amZug+1)% spieler.size();         // der nächste Spieler wird aktueller Spieler
    
    return false;
  }
  
  /** liefert eine Referenz auf einen Würfel
  * @param nr Nummer des gewünschten Würfels
  * @return Referenz auf den Würfel
  */
  public Wuerfel getWuerfel(int nr) {
    return wuerfel[nr]; 
  }
  
  /** liefert eine Referenz auf einen Spieler
  * @param nr Nummer des gewünschten 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
