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

/**
 * GUI fuer das Wuerfelspiel Craps
 * Die GUI ist nur fuer zwei Spieler realisiert, kuennte aber fuer bis zu 6 Spieler
 * ausgebaut werden. Jeder Spieler kann einen Betrag setzen. Der Shooter wuerfelt.
 * Wuerfelt der Shooter einen Gewinnwurf gewinnt er, alle anderen verlieren.
 * Bei einem Verlustwurf ist es umgekehrt und der nuechste Spieler wird Shooter.
 *
 * @version 1.0 vom 20.06.2012
 * @author Thomas Schaller
 */

public class CrapsGUI extends JFrame {
    // Anfang Attribute

    private Spielleitung spielleitung;    // Verwaltung des Spiels

    private WuerfelPanel wuerfelPanel1;
    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();
    // Ende Attribute

    public CrapsGUI(String title) {
        // Frame-Initialisierung
        super(title);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        int frameWidth = 653; 
        int frameHeight = 206;
        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 Einsuetze");
        jLMeldung.setHorizontalTextPosition(SwingConstants.CENTER);
        jLMeldung.setHorizontalAlignment(SwingConstants.CENTER);
        cp.add(jLMeldung);
        // Ende Komponenten
        spielleitung = new Spielleitung();

        wuerfelPanel1= new WuerfelPanel(spielleitung.getWuerfel(0), spielleitung.getWuerfel(1));
        wuerfelPanel1.setBounds(216, 8, 201, 129);
        wuerfelPanel1.addMouseListener(new MouseAdapter() { 
                public void mouseClicked(MouseEvent evt) { 
                    wuerfelPanel1_MouseClicked(evt);
                }
            });
        cp.add(wuerfelPanel1);

        // Zwei Spieler mit Startguthaben von 100 erzeugens
        Spieler sp1 = new Spieler(100);
        Spieler sp2 = new Spieler(100);

        // Spieler bei der Spielleitung anmelden
        spielleitung.addSpieler(sp1);
        spielleitung.addSpieler(sp2);

        // Informationen ueber Spieler anzeigen
        showSpieler();
        setVisible(true);
    } // end of public CrapsGUI

    // Anfang Methoden
    /** Informationen ueber die Spieler werden angezeigt. Es werden das Guthaben angezeigt
     * und je nach dem, welche Spieler an der Reihe ist, der Hintergrund dunkler eingefuerbt.
     * Auueerdem 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 einfuerben
        if (sp1.getShooter()) {
            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 lueuft (beide Spieler haben gesetzt), anzeigen welcher Spieler dran ist
        if (!jNFSpieler1Einsatz.isEditable() && !jNFSpieler2Einsatz.isEditable()) {
            if (sp1.getShooter()) {
                jLMeldung.setText("Spieler 1 muss wuerfeln.");
            } else {
                jLMeldung.setText("Spieler 2 muss wuerfeln.");
            }// end of if
        }
    }

    /** Aktion: Wuerfelbilder angeklickt.
     * Wenn das Spiel lueuft, wuerfelt der Spieler, der am Zug ist. Danach wird ausgewertet, ob es
     * sich um einen Gewinn- oder Verlustwurf handelt.
     */
    public void wuerfelPanel1_MouseClicked(MouseEvent evt) {
        if (!jNFSpieler1Einsatz.isEditable() && !jNFSpieler2Einsatz.isEditable()) {
            spielleitung.getWuerfel(0).wuerfeln();
            spielleitung.getWuerfel(1).wuerfeln();
            wuerfelPanel1.repaint();
            if (spielleitung.auswerten()) {  // Hat einer gewonnen?
                // Einsatz wieder auf 0 setzen und Buttons zum Setzen aktivieren
                jNFSpieler1Einsatz.setInt(0);
                jNFSpieler1Einsatz.setEditable(true);
                jNFSpieler2Einsatz.setInt(0);
                jNFSpieler2Einsatz.setEditable(true);
                jBSpieler1Setzen.setEnabled(true);
                jBSpieler2Setzen.setEnabled(true);
                if (spielleitung.gewinnwurf()) {
                    jLMeldung.setText("Gewonnen! Bitte setzen Sie erneut!");
                } else {
                    jLMeldung.setText("Verloren! Bitte setzen Sie erneut!");
                }// end of if
                spielleitung.neuesSpiel();
            } // end of if-else
            showSpieler();

        } // end of if
    } // end of wuerfelPanel1_MouseClicked

    /** Aktion: Geld setzen von Spieler 1.
     * Betrag wird gesetzt und der Button zum Setzen deaktiviert.
     */
    public void jBSpieler1Setzen_ActionPerformed(ActionEvent evt) {
        spielleitung.getSpieler(0).setze(jNFSpieler1Einsatz.getInt());
        jNFSpieler1Einsatz.setEditable(false);
        jBSpieler1Setzen.setEnabled(false);
        showSpieler();
    } // end of jBSpieler1Setzen_ActionPerformed

    /** Aktion: Geld setzen von Spieler 2.
     * Betrag wird gesetzt und der Button zum Setzen deaktiviert.
     */
    public void jBSpieler2Setzen_ActionPerformed(ActionEvent evt) {
        spielleitung.getSpieler(1).setze(jNFSpieler2Einsatz.getInt());
        jNFSpieler2Einsatz.setEditable(false);
        jBSpieler2Setzen.setEnabled(false);
        showSpieler();
    } // end of jBSpieler2Setzen_ActionPerformed

    // Ende Methoden

    public static void main(String[] args) {
        new CrapsGUI("Craps");
    } // end of main

} // end of class crapsGUI
