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");
		r = dbc.getCurrentQueryResult();
		String[] teachers = new String[r.getRowCount()];
		for (int i = 0; i < r.getRowCount(); i++) {
			teachers[i] = r.getData()[i][0];
		}
		gui.addFilter("Lehrer", teachers);
		// Das gleiche für die klassen
		dbc.executeStatement("SELECT bezeichner 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("Klassen", 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.
			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(-16711936) // 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("");
			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(-16711936) // 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;
		}
	}
}
