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

import java.io.File; 
import java.io.IOException; 
import java.util.List; 
import java.io.*;

import org.jdom.Document; 
import org.jdom.Element; 
import org.jdom.JDOMException; 
import org.jdom.input.SAXBuilder; 
import org.jdom.output.XMLOutputter; 



/**
  *
  * Quizspiel zur Wiederholung von Unterrichtsinhalten
  *
  * @version 1.1 from 23.02.2017
  * @author Thomas Schaller
  */

public class Quizspiel extends JFrame {
  // Anfang Attribute
  private ImageLabel jLabel1;
  
  private ImageIcon jLabel1Icon = new ImageIcon("images/Titelleiste_Netzwerk.png");
 
  private JPanel jPanel1 = new JPanel(null, true);
  private JLabel jLabel2 = new JLabel();
  private JPanel jPanel2 = new JPanel(null, true);
  private JPanel jPanel3 = new JPanel(null, true);
  
  private JLabel jLStatus = new JLabel();
  private JPanel jPanel4 = new JPanel(null, true);
  private JButton jBEnde = new JButton();
  private JPanel jPSpieler1 = new JPanel(null, true);
  private JLabel jLName1 = new JLabel();
  private JLabel jLPunkte1 = new JLabel();
  private JPanel jPSpieler2 = new JPanel(null, true);
  private JLabel jLName2 = new JLabel();
  private JLabel jLPunkte2 = new JLabel();
  private JPanel jPSpieler3 = new JPanel(null, true);
  private JLabel jLName3 = new JLabel();
  private JLabel jLPunkte3 = new JLabel();
  private JPanel jPSpieler4 = new JPanel(null, true);
  private JLabel jLName4 = new JLabel();
  private JLabel jLPunkte4 = new JLabel();
  private JLabel jLabel4 = new JLabel();
  private JButton[][] jBTopics;
  private int akt_sp = 0;
  private int sp_anz = 4;
  private int[] punkte = new int[4];
  private Document doc = null;
  // Ende Attribute
  
  public Quizspiel (String title) {
    super (title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 1026; 
    int frameHeight = 580;
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    jLabel1 = new ImageLabel(jLabel1Icon, "Quiz");
    jLabel1.setBounds(2, 2, 1019, 65);
    jLabel1.setText("Quiz");
    jLabel1.setImageIcon(jLabel1Icon);
    jLabel1.setFont(new Font("Dialog", Font.BOLD, 30));
    jLabel1.setForeground(Color.white);
    cp.add(jLabel1);
    jLabel4.setBounds(310, 553, 400, 20);
    jLabel4.setText("(cc) Schaller (ZPG Informatik) - V1.1 (2017)");
    jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel4.setFont(new Font("Dialog", Font.PLAIN, 12));
    cp.add(jLabel4);
    
    setUndecorated(true);
    
      
    jLStatus.setBounds(8, 488, 1011, 57);
    jLStatus.setText("  Wähle bitte eine Frage...");
    jLStatus.setBackground(Color.GRAY);
    jLStatus.setOpaque(true);
    jLStatus.setFont(new Font("Dialog", Font.BOLD, 24));
    jLStatus.setForeground(Color.WHITE);
    
    cp.add(jLStatus);
    jPanel4.setBounds(0, 0, 1026, 553);
    jPanel4.setOpaque(false);
    jPanel4.setBorder(new javax.swing.border.LineBorder(Color.BLACK, 2));
    cp.add(jPanel4);
    jPSpieler1.setBounds(832, 72, 185, 89);
    jPSpieler1.setOpaque(true);
    jPSpieler1.setBorder(BorderFactory.createBevelBorder(1, Color.WHITE, Color.BLACK));
    jPSpieler1.setBackground(new Color(0xB8CFE5));
    jPanel4.add(jPSpieler1);
    jLName1.setBounds(8, 8, 174, 33);
    jLName1.setText("Spieler 1");
    jLName1.setFont(new Font("Dialog", Font.BOLD, 24));
    jLName1.setForeground(new Color(0x000080));
    jLName1.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler1.add(jLName1);
    jLPunkte1.setBounds(11, 48, 166, 33);
    jLPunkte1.setText("0 Punkte");
    jLPunkte1.setForeground(new Color(0x800000));
    jLPunkte1.setFont(new Font("Dialog", Font.BOLD, 24));
    jLPunkte1.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler1.add(jLPunkte1);
    jPSpieler2.setBounds(832, 160, 185, 89);
    jPSpieler2.setOpaque(true);
    jPSpieler2.setBorder(BorderFactory.createBevelBorder(1, Color.WHITE, Color.BLACK));
    jPanel4.add(jPSpieler2);
    jLName2.setBounds(8, 8, 174, 33);
    jLName2.setText("Spieler 2");
    jLName2.setFont(new Font("Dialog", Font.BOLD, 24));
    jLName2.setForeground(new Color(0x000080));
    jLName2.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler2.add(jLName2);
    jLPunkte2.setBounds(11, 48, 166, 33);
    jLPunkte2.setText("0 Punkte");
    jLPunkte2.setFont(new Font("Dialog", Font.BOLD, 24));
    jLPunkte2.setForeground(new Color(0x800000));
    jLPunkte2.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler2.add(jLPunkte2);
    jPSpieler3.setBounds(832, 248, 185, 89);
    jPSpieler3.setOpaque(true);
    jPSpieler3.setBorder(BorderFactory.createBevelBorder(1, Color.WHITE, Color.BLACK));
    jPSpieler3.setBackground(new Color(0xEEEEEE));
    jPanel4.add(jPSpieler3);
    jLName3.setBounds(8, 8, 174, 33);
    jLName3.setText("Spieler 3");
    jLName3.setFont(new Font("Dialog", Font.BOLD, 24));
    jLName3.setForeground(new Color(0x000080));
    jLName3.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler3.add(jLName3);
    jLPunkte3.setBounds(11, 48, 166, 33);
    jLPunkte3.setText("0 Punkte");
    jLPunkte3.setFont(new Font("Dialog", Font.BOLD, 24));
    jLPunkte3.setForeground(new Color(0x800000));
    jLPunkte3.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler3.add(jLPunkte3);
    jPSpieler4.setBounds(832, 336, 185, 89);
    jPSpieler4.setOpaque(true);
    jPSpieler4.setBorder(BorderFactory.createBevelBorder(1, Color.WHITE, Color.BLACK));
    jPSpieler4.setBackground(new Color(0xEEEEEE));
    jPanel4.add(jPSpieler4);
    jLName4.setBounds(8, 8, 174, 33);
    jLName4.setText("Spieler 4");
    jLName4.setFont(new Font("Dialog", Font.BOLD, 24));
    jLName4.setForeground(new Color(0x000080));
    jLName4.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler4.add(jLName4);
    jLPunkte4.setBounds(11, 48, 166, 33);
    jLPunkte4.setText("0 Punkte");
    jLPunkte4.setFont(new Font("Dialog", Font.BOLD, 24));
    jLPunkte4.setForeground(new Color(0x800000));
    jLPunkte4.setHorizontalTextPosition(SwingConstants.CENTER);
    jPSpieler4.add(jLPunkte4);
    
    jBEnde.setBounds(832, 432, 185, 49);
    jBEnde.setText("Spiel beenden");
    jBEnde.setMargin(new Insets(2, 2, 2, 2));
    jBEnde.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jBEnde_ActionPerformed(evt);
      }
    });
    jBEnde.setFont(new Font("Dialog", Font.BOLD, 24));
    jPanel4.add(jBEnde);
    // Ende Komponenten
    readQuestions();
    jLabel1.setText("Quiz: "+doc.getRootElement().getChild("Titel").getValue());
    jBTopics = new JButton[getAnzKategorien()][getAnzTopics()];
    for (x = 0; x < getAnzKategorien() ; x++) {
      JPanel jPanel = new JPanel();
      jPanel.setBounds(2+193*x, 85, 193, 65);
      jPanel.setOpaque(false);
      jPanel.setBorder(BorderFactory.createBevelBorder(0, Color.WHITE, Color.BLACK));
      jPanel4.add(jPanel);

      JLabel jLabel = new JLabel();
      jLabel.setBounds(80, 60, 193, 64);
      jLabel.setText("<html><p width=190 align=center>"+getKategorie(x)+"</p></html>");
      jLabel.setHorizontalAlignment(SwingConstants.CENTER);
      jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
      jPanel.add(jLabel);
      for (y = 0; y < getAnzTopics() ; y++ ) {
        jBTopics[x][y] = new JButton();
        jBTopics[x][y].setText(getTopic(x,y).getChild("Punkte").getValue());
        jBTopics[x][y].setBounds(2+193*x, 150+y*65, 193, 65);
        jBTopics[x][y].setMargin(new Insets(2,2,2,2));
        jBTopics[x][y].setFont(new Font("Dialog", Font.BOLD, 36));
        jBTopics[x][y].addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        button_ActionPerformed(evt);
      }
    });
        jPanel4.add(jBTopics[x][y]);
      } // end of for
      
    } // end of for

    setResizable(false);
    setVisible(true);
    sp_anz = 0;
    while (sp_anz <2 || sp_anz > 4) { 
      String s = javax.swing.JOptionPane.showInputDialog( "Bitte Anzahl der Spieler eingeben (2-4):" );
      try{
        int i = Integer.parseInt( s );
        sp_anz = i;
        } catch (Exception e) {
          }
      
    } // end of while
    jPSpieler4.setVisible(sp_anz >= 4);
      jPSpieler3.setVisible(sp_anz >= 3);
       // end of if
    
    }
    
    // Anfang Methoden
  public void button_ActionPerformed(ActionEvent evt) {
    int x = 0;
    int y = 0;
    for (int i=0;i<getAnzKategorien() ;i++ ) {
    for (int j=0;j<getAnzTopics();j++) {
    if (evt.getSource()==jBTopics[i][j]) {x = i; y = j; }
      
    } // end of for
      
    } // end of for
    int akt_f_sp = akt_sp;
    
    Element t = getTopic(x,y);
    int richtig = Integer.parseInt(t.getChild("Richtig").getValue());
    FrageGUI frage = new FrageGUI(this, t.getChild("Frage").getValue(), ((Element) t.getChildren("Antwort").get(0)).getValue(),((Element) t.getChildren("Antwort").get(1)).getValue(),((Element) t.getChildren("Antwort").get(2)).getValue(),((Element) t.getChildren("Antwort").get(3)).getValue(), akt_f_sp+1);
    while (frage.getAntwort()!=richtig) {
      frage.setVisible(true);
      if (frage.getAntwort()!=richtig) {
        jLStatus.setText("<html>&nbsp;Die Antwort war leider falsch!</html>");
        akt_f_sp = (akt_f_sp + 1)%sp_anz;
        frage.setSpieler((akt_f_sp+1));
        try{
          Thread.sleep(200); }
        catch(Exception e) {
          }
      } // end of if-else
      
      
    } // end of while
    akt_sp = (akt_sp+1)%sp_anz;
    punkte[akt_f_sp] += Integer.parseInt(t.getChild("Punkte").getValue());
    
    jLStatus.setText("<html>&nbsp;Die Antwort ist richtig. Spieler "+(akt_f_sp+1)+" erhält "+Integer.parseInt(t.getChild("Punkte").getValue())+" Punkte. Spieler "+(akt_sp+1)+" wähle bitte eine Frage...</html>");
    ((JButton) (evt.getSource())).setEnabled(false);
    showPunkte();
  } // end of jButton1_ActionPerformed
    
    
      
  public void jBEnde_ActionPerformed(ActionEvent evt) {
    this.setVisible(false);
    this.dispose();
  } // end of jBEnde_ActionPerformed

        // Ende Methoden
  public void showPunkte() {
    jLPunkte1.setText(""+punkte[0]+" Punkte");
    jLPunkte2.setText(""+punkte[1]+" Punkte");
    jLPunkte3.setText(""+punkte[2]+" Punkte");
    jLPunkte4.setText(""+punkte[3]+" Punkte");
    if (akt_sp==0) {
      jPSpieler1.setBackground(new Color(0xB8CFE5));
    } else {
      jPSpieler1.setBackground(new Color(0xEFEFEF));
    } // end of if-else
    jPSpieler2.setBackground(new Color(0xEEEEEE));
    if (akt_sp==1) {
      jPSpieler2.setBackground(new Color(0xB8CFE5));
    } else {
      jPSpieler2.setBackground(new Color(0xEFEFEF));
    } // end of if-else
    if (akt_sp==2) {
      jPSpieler3.setBackground(new Color(0xB8CFE5));
    } else {
      jPSpieler3.setBackground(new Color(0xEFEFEF));
    } // end of if-else
    if (akt_sp==3) {
      jPSpieler4.setBackground(new Color(0xB8CFE5));
    } else {
      jPSpieler4.setBackground(new Color(0xEFEFEF));
    } // end of if-else
    
  }
  
  public int getAnzKategorien() {
    return doc.getRootElement().getChildren("Kategorie").size(); 
  }
  
  public String getKategorie(int x) {
    Element kat = (Element) doc.getRootElement().getChildren("Kategorie").get(x);
    return kat.getAttributeValue("name");
  }    
  
  public int getAnzTopics() {
    Element kat0 = (Element) doc.getRootElement().getChildren("Kategorie").get(0);
    return kat0.getChildren("Frage").size();
  }
    
  public Element getTopic(int x, int y) {
    Element kategorie = (Element) (doc.getRootElement().getChildren("Kategorie").get(x)); 
    Element topic =     (Element) (kategorie.getChildren("Frage")).get(y);
    return topic;
  }  
      
      
    
    
  public void readQuestions() { 
    
    doc = null; 
    
    InputStream is = Quizspiel.class.getResourceAsStream("questions.xml");
    File f = new File("questions.xml");
    try { 
      // Das Dokument erstellen 
      SAXBuilder builder = new SAXBuilder(); 
      doc = builder.build(f); 
      
    } catch (JDOMException e) { 
      e.printStackTrace(); 
      
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    
  } 
  
      
      
  
  public static void main(String[] args) {
    new Quizspiel("Quizspiel");
  }
}
