import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  * GUI für das Würfelspiel Barbudi
  * Zwei Spieler können einen Betrag setzen und dann abwechselnd würfeln.
  * Würfelt einer der Spieler einen Gewinnwurf gewinnt er, der andere verliert.
  * Bei einem Verlustwurf ist es umgekehrt.
  *
  * @version 1.0 vom 20.06.2012
  * @author Thomas Schaller
  */

public class BarbudiGUI extends JFrame {
  // Anfang Attribute
  private Spielleitung spielleitung;   // Verwaltung des Spiels
  
  
  private JPanel jPSpieler1 = new JPanel(null, true);
  private JLabel jLabel1 = new JLabel();
  private JLabel jLabel2 = new JLabel();
  private JNumberField jNFSpieler1Guthaben = new JNumberField();
  private JLabel jLabel3 = new JLabel();
  private JNumberField jNFSpieler1Einsatz = new JNumberField();
  private JButton jBSpieler1Setzen = new JButton();
  private JPanel jPSpieler2 = new JPanel(null, true);
  private JLabel jLabel21 = new JLabel();
  private JNumberField jNFSpieler2Guthaben = new JNumberField();
  private JLabel jLabel31 = new JLabel();
  private JNumberField jNFSpieler2Einsatz = new JNumberField();
  private JButton jBSpieler2Setzen = new JButton();
  private JLabel jLabel11 = new JLabel();
  private JLabel jLMeldung = new JLabel();
  private WuerfelPanel wuerfelPanel1;
  // Ende Attribute
  
  public BarbudiGUI(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 653; 
    int frameHeight = 205;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    
    jPSpieler1.setBounds(8, 8, 169, 161);
    jPSpieler1.setOpaque(true);
    
    
    cp.add(jPSpieler1);
    jLabel1.setBounds(8, 8, 110, 20);
    jLabel1.setText("Spieler 1");
    jPSpieler1.add(jLabel1);
    jLabel2.setBounds(8, 40, 70, 20);
    jNFSpieler1Guthaben.setBounds(86, 40, 75, 20);
    jLabel3.setBounds(8, 72, 70, 20);
    jNFSpieler1Einsatz.setBounds(86, 72, 75, 20);
    jBSpieler1Setzen.setBounds(48, 120, 75, 25);
    jLabel2.setText("Guthaben");
    jPSpieler1.add(jLabel2);
    jNFSpieler1Guthaben.setText("");
    jNFSpieler1Guthaben.setEditable(false);
    jPSpieler1.add(jNFSpieler1Guthaben);
    jLabel3.setText("Einsatz");
    jPSpieler1.add(jLabel3);
    jNFSpieler1Einsatz.setText("");
    jPSpieler1.add(jNFSpieler1Einsatz);
    jBSpieler1Setzen.setText("setzen");
    jBSpieler1Setzen.setMargin(new Insets(2, 2, 2, 2));
    jBSpieler1Setzen.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jBSpieler1Setzen_ActionPerformed(evt);
      }
    });
    jPSpieler1.add(jBSpieler1Setzen);
    jPSpieler2.setBounds(456, 8, 185, 161);
    jPSpieler2.setOpaque(true);
    cp.add(jPSpieler2);
    jLabel21.setBounds(16, 40, 70, 20);
    jNFSpieler2Guthaben.setBounds(96, 40, 75, 20);
    jLabel31.setBounds(16, 72, 70, 20);
    jNFSpieler2Einsatz.setBounds(96, 72, 75, 20);
    jBSpieler2Setzen.setBounds(64, 120, 75, 25);
    jLabel21.setText("Guthaben");
    jPSpieler2.add(jLabel21);
    jNFSpieler2Guthaben.setText("");
    jNFSpieler2Guthaben.setEditable(false);
    jPSpieler2.add(jNFSpieler2Guthaben);
    jLabel31.setText("Einsatz");
    jPSpieler2.add(jLabel31);
    jNFSpieler2Einsatz.setText("");
    jPSpieler2.add(jNFSpieler2Einsatz);
    jBSpieler2Setzen.setText("setzen");
    jBSpieler2Setzen.setMargin(new Insets(2, 2, 2, 2));
    jBSpieler2Setzen.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jBSpieler2Setzen_ActionPerformed(evt);
      }
    });
    jPSpieler2.add(jBSpieler2Setzen);
    jLabel11.setBounds(16, 8, 110, 20);
    jLabel11.setText("Spieler 2");
    jPSpieler2.add(jLabel11);
    jLMeldung.setBounds(184, 144, 262, 28);
    jLMeldung.setText("Bitte machen Sie Ihre Einsätze");
    jLMeldung.setHorizontalTextPosition(SwingConstants.CENTER);
    jLMeldung.setHorizontalAlignment(SwingConstants.CENTER);
    cp.add(jLMeldung);
    
    // Ende Komponenten
    
    // Spielleitung Grundaufbau erzeugen (z.B. auch Würfel)
    spielleitung = new Spielleitung();
    wuerfelPanel1= new WuerfelPanel(spielleitung.getWuerfel(0),spielleitung.getWuerfel(1));
    wuerfelPanel1.setBounds(216, 8, 204, 124);
    wuerfelPanel1.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent evt) { 
        wuerfelPanel1_MouseClicked(evt);
      }
    });
    cp.add(wuerfelPanel1);
    
    // Zwei Spieler mit Startguthaben von 100 erzeugen
    Spieler sp1 = new Spieler(100);
    Spieler sp2 = new Spieler(100);
    
    // Spieler bei der Spielleitung anmelden
    spielleitung.addSpieler(sp1);
    spielleitung.addSpieler(sp2);
    
    // Informationen über Spieler anzeigen
    showSpieler();
    setVisible(true);
  } // end of public BarbudiGUI
  
  // Anfang Methoden
  /** Informationen über die Spieler werden angezeigt. Es werden das Guthaben angezeigt
  * und je nach dem, welche Spieler an der Reihe ist, der Hintergrund dunkler eingefärbt.
  * Außerdem wird angezeigt, welcher Spieler dran ist.
  */
  
  public void showSpieler() {
    Spieler sp1 = spielleitung.getSpieler(0);
    Spieler sp2 = spielleitung.getSpieler(1);
    // Guthaben anzeigen
    jNFSpieler1Guthaben.setInt(sp1.getGuthaben());
    jNFSpieler2Guthaben.setInt(sp2.getGuthaben());
    // Spieler, der dran ist, dunkler einfärben
    if (spielleitung.getSpielerAmZug()==sp1) {
      jPSpieler1.setBackground(Color.LIGHT_GRAY);
      jPSpieler2.setBackground(new Color(230,230,230));
      
    } else {
      jPSpieler1.setBackground(new Color(230,230,230));
      jPSpieler2.setBackground(Color.LIGHT_GRAY);
      
    }// end of if
    
    // Wenn das Spieler läuft (beide Spieler haben gesetzt), anzeigen welcher Spieler dran ist
    if (!jNFSpieler1Einsatz.isEditable() && !jNFSpieler2Einsatz.isEditable()) {
      if (spielleitung.getSpielerAmZug()==sp1) {
        jLMeldung.setText("Spieler 1 muss würfeln.");
      } else {
        jLMeldung.setText("Spieler 2 muss würfeln.");
      }// end of if
    }
  }
  
  public void jBSpieler1Setzen_ActionPerformed(ActionEvent evt) {
    spielleitung.getSpieler(0).setze(jNFSpieler1Einsatz.getInt());
    jNFSpieler1Einsatz.setEditable(false);
    jBSpieler1Setzen.setEnabled(false);
    showSpieler();
  } // end of jBSpieler1Setzen_ActionPerformed
  
  public void jBSpieler2Setzen_ActionPerformed(ActionEvent evt) {
    spielleitung.getSpieler(1).setze(jNFSpieler2Einsatz.getInt());
    jNFSpieler2Einsatz.setEditable(false);
    jBSpieler2Setzen.setEnabled(false);
    showSpieler();
  } // end of jBSpieler2Setzen_ActionPerformed
  
  public void wuerfelPanel1_MouseClicked(MouseEvent evt) {
    
  } // end of wuerfelPanel1_MouseClicked
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new BarbudiGUI("BarbudiGUI");
  } // end of main
  
} // end of class BarbudiGUI
