/**
 * Filename: StundenplanArray.java<br>
 *
 * @author Isabell Clemens, Benjamin Balluff, Christian Kohler, Oliver Klais, Jannis Utz<br>
 */

import java.io.*;

/**
 * Description: Diese Klasse wird dazu verwendet Objekte des Typs Lehrveranstaltungen in einem Array zu verwalten<br>
 *
 */
public class StundenplanArray
{
	/**
	 * Dieses zweidimensionale Array wird Objekte des Types Lehrveranstaltungen aufnehmen<br>
	 */
	Lehrveranstaltung _woche[][];
	/**
	 * Dieses Feld dient als Zeiger auf das Objekt GUI<br>
	 */
	GUI gui;

	/**
	 * Description: Konstruktor des StundenplanArrays<br>
	 *
	 * @param tage Anzahl der Tage, die der StundenplanArray in der x-Dimension aufweisen soll<br>
	 * @param stunden Anzahl der Stunden die der StundenplanArray in der y-Dimension aufweisen soll<br>
	 * @param aGui Die Referenz auf das Objekt GUI<br>
	 */
	public StundenplanArray(int tage, int stunden, GUI aGui)
	{
		_woche = new Lehrveranstaltung[tage][stunden];
		gui = aGui;
	}
	/**
	 * Description: Eine Vorlesung wird zum StundenplanArray hinzugefügt<br>
	 *
	 * @param tag Der Tag, an dem die Vorlesung eingefügt werden soll<br>
	 * @param neu Das Objekt Vorlesung, welches eingefügt werden soll<br>
	 * @param beginn Stelle von der an die Vorlesung im Array eingefügt wird<br>
	 * @param ende Stelle bis zu der die Vorlesung eingefügt wird<br>
	 */
	public void hinzufuegenV(int tag, Vorlesung neu, int beginn, int ende)
	{
		for (int i = beginn; i <= ende; i++)
		{
			_woche[tag][i] = neu;
		}
	}
	/**
	 * Description: Eine Praktikum wird zum StundenplanArray hinzugefügt<br>
	 *
	 * @param tag Der Tag, an dem das Praktikum eingefügt werden soll<br>
	 * @param neu Das Objekt Praktikum, welches eingefügt werden soll<br>
	 * @param beginn Stelle von der an das Praktikum im Array eingefügt wird<br>
	 * @param ende Stelle bis zu der das Praktikum eingefügt wird<br>
	 */
	public void hinzufuegenP(int tag, Praktikum neu, int beginn, int ende)
	{
		for (int i = beginn; i <= ende; i++)
		{
			_woche[tag][i] = neu;
		}
	}
	/**
	 * Descrpition:  Methode, um eine Lehrveranstaltung an angegebener Stelle im Array zu erfragen<br>
	 *
	 * @param tag Gibt die Tag-Koordinate im Array an, an welcher die zu erfragende Lehrveranstaltung steht<br>
	 * @param beginn Die Stelle an der die abgefragte Lehrveranstaltung steht<br>
	 * @return Lehrveranstaltung, an angegebener Stelle im StundenplanArray<br>
	 */
	public Lehrveranstaltung ausgabe(int tag, int beginn)
	{
		return _woche[tag][beginn];
	}
	/**
	 * Description: Methode, um eine Lehrveranstaltung an angegebener Stelle im Array zu löschen<br>
	 *
	 * @param tag Gibt die Tag-Koordinate im Array an, an welcher die Lehrveranstaltung gelöscht werden soll<br>
	 * @param beginn Die Stelle in der Stunden-Dimension,an der die Löschung begonnen werden soll<br>
	 * @param ende Die Stelle in der Stunden-Dimension,an der die Löschung beendet werden soll<br>
	 */
	public void stdLoeschen(int tag, int beginn, int ende)
	{
		for (int i = beginn; i <= ende; i++){
		_woche[tag][i] = null;}
	}
	/**
	 * Description: Methode, die das gesamte StundenplanArray löscht<br>
	 *
	 * @param tag Größe des Arrays in der x-Dimension<br>
	 * @param stunde Größe des Arrays in der y-Dimension<br>
	 */
	public void planLoeschen(int tag, int stunde)
	{
		for (int i = 0; i < tag; i++)
		{
			for (int j = 0; j < stunde; j++)
			{
				_woche[i][j] = null;
			}
		}
	}
	/**
	 * Description: Diese Methode wird von der GUI benutzt um zu überprüfen,
	 * ob an dieser Stelle im StundenplanArray schon eine Lehrveranstaltung
	 * vorhanden ist<br>
	 *
	 * @param tag Gibt den zu testenden Tag an<br>
	 * @param beginn Gibt die zu testende Uhrzeit an<br>
	 * @return Inhalt des Array an angegebener Stelle<br>
	 */
	public Lehrveranstaltung testBeginn(int tag, int beginn)
	{
			return _woche[tag][beginn];
	}
	/**
	 * Description:
	 *
	 * @param tag Gibt den zu testenden Tag an<br>
	 * @param beginn Gibt die zu testende Uhrzeit an<br>
	 * @return Inhalt des Array an angegebener Stelle<br>
	 */
	public Lehrveranstaltung testEnde(int tag, int ende)
	{
			return _woche[tag][ende];
	}
	/**
	 * Description: Diese Methode speichert den Inhalt des arrays _woche in die Datei 'filename'<br>
	 *
	 * @param testfile Die vom Benutzer eingegebene zu speichernde Datei<br>
	 */
	public void stdplanSpeichern(File testfile) {
		String suffix = ".stpl";
		try
			{
			// Testet ob die Datei bereits die Endung ".stpl" hat
			if ((testfile.getName()).endsWith(suffix)) {
				File filename = testfile;
				// Speichern der Objekte
				FileOutputStream fs = new FileOutputStream(filename);
				ObjectOutputStream os = new ObjectOutputStream(fs);
				os.writeObject(_woche);
				os.flush();
				os.close();}
			// Wenn nicht, wird der Datei diese Endung hinzugefügt
			else {
				String filename = testfile.getPath() + ".stpl";
				// Speichern der Objekte
				FileOutputStream fs = new FileOutputStream(filename);
				ObjectOutputStream os = new ObjectOutputStream(fs);
				os.writeObject(_woche);
				os.flush();
				os.close();}
			}
			catch (IOException exc)
			{
				 System.err.println(exc.toString());
			}
	}

	/**
	 * Description: Diese Methode lädt den Inhalt der Datei 'filename' in das array _woche<br>
	 *
	 * @param filename Die vom Benutzer zum Laden ausgewählte Datei<br>
	 */

	public void stdplanLaden(File filename)
	{
		try
			{
				// Auslesen der Objekte aus der Datei in das Array _woche
				FileInputStream fs = new FileInputStream(filename);
				ObjectInputStream is = new ObjectInputStream(fs);
				_woche = (Lehrveranstaltung[][])is.readObject();
				is.close();
			}
			catch (ClassNotFoundException e)
			{
				System.err.println(e.toString());
			}
			catch (IOException exc)
			{
				System.err.println(exc.toString());
			}
	}

	/**
	 * Description: Diese Methode gibt das ganze StundenplanArray auf der Standardausgabe aus.
	 * Zum testen muß der Aufruf in der GUI wieder aktiviert werden<br>
	 *
	 * @param tag Größe des Arrays in der x-Dimension<br>
	 * @param stunde Größe des Arrays in der y-Dimension<br>
	 */
	/*
	public void anzeigen(int tag, int stunde)
	{
		for (int i = 0; i < tag; i++)
		{
			for (int j = 0; j < stunde; j++)
			{
				System.out.println(_woche[i][j]);
			}
		}
	}
	*/
}
