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

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 ORDER BY kuerzel");
		r = dbc.getCurrentQueryResult();
		String[] lehrer = new String[r.getRowCount()];
		for (int i = 0; i < r.getRowCount(); i++) {
			lehrer[i] = r.getData()[i][0];
		}
		gui.addFilter("Lehrer", lehrer);
		// Das gleiche für die klassen
		dbc.executeStatement("SELECT bezeichner FROM klassen ORDER BY bezeichner");
		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("Klassen", klassen);
		// Und für die Räume:
		dbc.executeStatement("SELECT DISTINCT Raum FROM Unterrichtsstunden ORDER BY Raum");
		r = dbc.getCurrentQueryResult();
		String[] räume = new String[r.getRowCount()];
		for (int i = 0; i < r.getRowCount(); i++) {
			räume[i] = r.getData()[i][0];
		}
		gui.addFilter("Räume", räume);
		// Und die Fächer:
		dbc.executeStatement("SELECT DISTINCT Fach FROM Unterrichtsstunden ORDER BY Fach");
		r = dbc.getCurrentQueryResult();
		String[] fächer = new String[r.getRowCount()];
		for (int i = 0; i < r.getRowCount(); i++) {
			fächer[i] = r.getData()[i][0];
		}
		gui.addFilter("Fächer", fächer);
		// 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);
		selectionChanged("Lehrer", lehrer[0]);
	}

	/**
	 * 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.
			dbc.executeStatement(
					"SELECT Fach,Raum,Klassen_bezeichner,Tag,Stunde FROM Unterrichtsstunden LEFT OUTER JOIN sind_in_Unterrichtsstunden "
							+ "WHERE sind_in_Unterrichtsstunden.Stunden_ID = Unterrichtsstunden.StundenId AND Unterrichtsstunden.Lehrer_Kürzel LIKE \""
							+ 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++) {
					gui.addLesson(bestimmeSpalte(data[i][3]), // Spalte im Plan (0=Montag, ... ,4=Freitag)
							Integer.parseInt(data[i][4]) - 1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
							data[i][0], // Titel
							"Raum " + data[i][1], // Untertitel
							data[i][2], // Beschreibungstext
							pNewValue, // FuÃŸzeile
							new Color(bestimmeFarbe(data[i][0])) // Farbe (Objekt der Klasse Color)
					);
				}

				// GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen.
				gui.revalidate();
				gui.repaint();
			}
		} else if (pList == "Klassen") {
			// Zuerst alle bisherigen Stunden aus der GUI entfernen
			gui.removeAllLessons();

			// Neue Daten aus der Datenbank abfragen.
			dbc.executeStatement(
					"SELECT Fach,Raum,Lehrer_Kürzel,Tag,Stunde FROM Unterrichtsstunden LEFT OUTER JOIN sind_in_Unterrichtsstunden"
							+ " WHERE sind_in_Unterrichtsstunden.Stunden_ID = Unterrichtsstunden.StundenId AND sind_in_Unterrichtsstunden.Klassen_Bezeichner LIKE \""
							+ 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++) {
					gui.addLesson(bestimmeSpalte(data[i][3]), // Spalte im Plan (0=Montag, ... ,4=Freitag)
							Integer.parseInt(data[i][4]) - 1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
							data[i][0], // Titel
							"Raum " + data[i][1], // Untertitel
							pNewValue, // Beschreibungstext
							data[i][2], // FuÃŸzeile
							new Color(bestimmeFarbe(data[i][0])) // Farbe (Objekt der Klasse Color)
					);
				}

				// GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen.
				gui.revalidate();
				gui.repaint();
			}
		} else if (pList == "Räume") {
			// Zuerst alle bisherigen Stunden aus der GUI entfernen
			gui.removeAllLessons();

			// Neue Daten aus der Datenbank abfragen.
			dbc.executeStatement(
					"SELECT Fach,Klassen_bezeichner,Lehrer_Kürzel,Tag,Stunde FROM Unterrichtsstunden LEFT OUTER JOIN sind_in_Unterrichtsstunden "
							+ "WHERE Unterrichtsstunden.StundenID = sind_in_Unterrichtsstunden.Stunden_ID AND Raum LIKE \""
							+ 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++) {
					gui.addLesson(bestimmeSpalte(data[i][3]), // Spalte im Plan (0=Montag, ... ,4=Freitag)
							Integer.parseInt(data[i][4]) - 1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
							data[i][0], // Titel
							"Raum " + pNewValue, // Untertitel
							data[i][1], // Beschreibungstext
							data[i][2], // FuÃŸzeile
							new Color(bestimmeFarbe(data[i][0])) // Farbe (Objekt der Klasse Color)
					);
				}

				// GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen.
				gui.revalidate();
				gui.repaint();
			}
		} else if (pList == "Fächer") {
			// Zuerst alle bisherigen Stunden aus der GUI entfernen
			gui.removeAllLessons();

			// Neue Daten aus der Datenbank abfragen.
			dbc.executeStatement(
					"SELECT Raum,Klassen_bezeichner,Lehrer_Kürzel,Tag,Stunde FROM Unterrichtsstunden LEFT OUTER JOIN sind_in_Unterrichtsstunden "
							+ "WHERE Unterrichtsstunden.StundenID = sind_in_Unterrichtsstunden.Stunden_ID AND Fach LIKE \""
							+ 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++) {
					gui.addLesson(bestimmeSpalte(data[i][3]), // Spalte im Plan (0=Montag, ... ,4=Freitag)
							Integer.parseInt(data[i][4]) - 1, // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde)
							pNewValue, // Titel
							"Raum " + data[i][0], // Untertitel
							data[i][1], // Beschreibungstext
							data[i][2], // FuÃŸzeile
							new Color(bestimmeFarbe(pNewValue) // Farbe (Objekt der Klasse Color)
							));
				}

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

	public int bestimmeSpalte(String pTag) {
		switch (pTag) {
		case "Montag":
			return 0;
		case "Dienstag":
			return 1;
		case "Mittwoch":
			return 2;
		case "Donnerstag":
			return 3;
		case "Freitag":
			return 4;
		default:
			return 5;
		}
	}

	public int bestimmeFarbe(String pFach) {
		switch (pFach) {
		case "Biologie":
			return 0x00FF77;
		case "Mathematik":
			return 0x5000FF;
		case "Latein":
			return 0xFFBF00;
		case "Französisch":
			return 0xFF00E9;
		case "Informatik":
			return 0x000000;
		case "Englisch":
			return 0xFF0000;
		case "Kunst":
			return 0xFFFFFF;
		case "Deutsch":
			return 0x0055FF;
		case "Musik":
			return 0xFFD000;
		case "Sport":
			return 0x00FFE9;
		case "Philosophie":
			return 0x9800FF;
		case "Religion":
			return 0x632B00;
		case "Chemie":
			return 0xB600FF;
		case "Physik":
			return 0xFFE100;
		case "Erdkunde":
			return 0x00871F;
		case "Geschichte":
			return 0x844000;
		default:
			return 0xFFFFFF;
		}
	}
}
