import javax.swing.*;
import java.awt.*;
import java.util.Arrays;

public class Stundenplan implements SelectionListener {

    /**
     * Main-Methode um das Programm (außerhalb von BlueJ) zu starten.
     *
     * @param args
     */
    public static void main(String[] args) {
        // Setzen des "Look & Feel" des Programms
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        }

        // Programm starten
        new Stundenplan();
    }

    // Instanz des GUI des Programms
    private StundenplanGUI gui;

    // Instanz der Datenbankverbindung
    private DatabaseConnector dbc;

    /**
     * Konstruktor des Hauptprogramms
     */
    public Stundenplan() {
        // Erstellen des GUIs
        gui = new StundenplanGUI();

        // Aufbau der Datenbankverbindung
        dbc = new DatabaseConnector("", 0, "stundenplan.db", "", "");
        QueryResult r;

        // Lehrer abfragen und ein Auswahlfeld erstellen, dass in der
        // GUI angezeigt wird, um den angezeigten Stundenplan anzupassen
        dbc.executeStatement("SELECT kuerzel FROM lehrer");
        r = dbc.getCurrentQueryResult();
        String[] teachers = new String[r.getRowCount()];
        for (int i = 0; i < r.getRowCount(); i++) {
            teachers[i] = r.getData()[i][0];
        }
        dbc.executeStatement("SELECT name FROM klassen");
        r = dbc.getCurrentQueryResult();
        String[] klassen = new String[r.getRowCount()];
        for (int i = 0; i < r.getRowCount(); i++) {
            klassen[i] = r.getData()[i][0];
        }
        gui.addFilter("Lehrer", teachers);
        gui.addFilter("Klasse", klassen);
        // GUI anzeigen und Verhalten bei Interaktion festlegen
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.addSelectionListener(this); // GUI ruft Methode selectionChanged auf, wenn sich eine Auswahlbox ändert.
        gui.setLocationRelativeTo(null);
        gui.setVisible(true);

    }

    /**
     * Methode  um auf Änderungen in der GUi zu reagieren. Sobald der nutzer die
     * Auswahl ändert, wird diese Methode aufgerufen. Der erste Parameter ist der
     * Name der Auswahlliste, die sich geändert hat (erster Parameter von
     * {@link StundenplanGUI#addFilter(String, String[])} oben) und der zweite ist
     * der neue Wert der Auswahl.
     *
     * @param pList     Name der Auswahlliste
     * @param pNewValue Neuer Wert der Auswahl
     */
    @Override
    public void selectionChanged(String pList, String pNewValue) {

        if (pList == "Lehrer") {
            // Zuerst alle bisherigen Stunden aus der GUI entfernen
            gui.removeAllLessons();

            // Neue Daten aus der Datenbank abfragen.
            // Hier gefakte Daten, die Struktur der Datenbank ist nicht vorgegeben.
            //dbc.executeStatement("SELECT 0,'Q2','405',kuerzel,0,0,'Informatik',-16711936 FROM lehrer WHERE kuerzel = '" + pNewValue + "'");
            dbc.executeStatement("SELECT blocknummer, raum, name, wochentag, kuerzel, Fach FROM Stunden JOIN klassen ON Stunden.klassen_id = klassen.id JOIN unterrichtet ON unterrichtet.Stundenid = Stunden.id WHERE kuerzel = \""+pNewValue+"\"");
            QueryResult r = dbc.getCurrentQueryResult();
            // Falls es ein Ergebnis gibt ...
            if (r != null) {
                String[][] data = r.getData();

                // Neue Stunden in die GUI schreiben
                for (int i = 0; i < data.length; i++) {
                    System.out.println("a");
                    int wochentag = getWochentag(r,i);
                    gui.addLesson(

                        wochentag, // Spalte im Plan (0=Montag, ... ,4=Freitag)
                        Integer.parseInt(data[i][0])-1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
                        data[i][5], // Titel
                        "Raum " + data[i][1], // Untertitel
                        data[i][4], // Beschreibungstext
                        data[i][3], // Fußzeile
                            new Color(colors(data,i)) // Farbe (Objekt der Klasse Color)
                    );
                }

                // GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen.
                gui.revalidate();
                gui.repaint();
            }
        }
        if (pList == "Klasse"){
            dbc.executeStatement("SELECT blocknummer, raum, name, wochentag, kuerzel, Fach FROM Stunden JOIN klassen ON Stunden.klassen_id = klassen.id JOIN unterrichtet ON unterrichtet.Stundenid = Stunden.id WHERE name = \""+pNewValue+"\"");
            QueryResult r = dbc.getCurrentQueryResult();
            if (r != null) {
                String[][] data = r.getData();

                // Neue Stunden in die GUI schreiben
                for (int i = 0; i < data.length; i++) {
                    System.out.println(Arrays.toString(r.getData()[i]));
                    int wochentag = getWochentag(r,i);
                    gui.addLesson(

                            wochentag, // Spalte im Plan (0=Montag, ... ,4=Freitag)
                            Integer.parseInt(data[i][0])-1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
                            //Integer.parseInt(t.getData()[i][0])-1,
                            data[i][5], // Titel
                            "Raum " + data[i][1], // Untertitel
                            data[i][4], // Beschreibungstext
                            data[i][2], // Fußzeile
                            new Color(colors(data,i)) // Farbe (Objekt der Klasse Color)
                    );
                }

                // GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen.
                gui.revalidate();
                gui.repaint();
            }
        }
    }

    private int colors(String[][]data,int row){
        switch(data[row][5]){
            case "Deutsch":
                return 0xf24e5e;
            case "Englisch":
                return 0xf5e77d;
            case "Mathe":
                return 0x3257fa;
            case "Informatik":
                return 0x9ee7ff;
            case "Kunst":
                return 0xc39cff;
            case "Physik":
                return 0x80ffa4;
            case "Sport":
                return 0xd6d6d6;
        }
        return 0x000000;
    }

    private int getWochentag(QueryResult r,int row){
        String[][] data = r.getData();

        switch (data[row][3]) {
            case "Mo":
                return 0;
            case "Di":
                return 1;
            case "Mi":
                return 2;
            case "Do":
                return 3;
            case "Fr":
                return 4;
        }
        return 0;


    }
}
