#ifndef KSGTDatei_H
#define KSGTDatei_H

#include "Array.h"

namespace Framework
{
    class Text;

    //! Verwaltet eine Datei in der Daten tabellarisch abgespeichert werden
    class KSGTDatei : public virtual ReferenceCounter
    {
    private:
        Text *pfad;
        RCArray< RCArray< Text > > *data;

    public:
        //! Konstruktor
        DLLEXPORT KSGTDatei();
        //! Konstruktor
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT KSGTDatei( const char *pfad );
        //! Konstruktor
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT KSGTDatei( Text *pfad );
        //! Destruktor
        DLLEXPORT ~KSGTDatei();
        //! Setzt den Pfad zur Datei
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT void setPfad( const char *pfad );
        //! Setzt den Pfad zur Datei
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT void setPfad( Text *pfad );
        //! lähdt alle Daten aus der angegebenen Datei
        //! \return 1, falls das laden erfolgreich war. 0, wenn ein Fehler beim laden aufgetreten ist
        DLLEXPORT bool laden();
        //! Fügt eine Zeile zur Tabelle hinzu
        //! \param feldAnzahl Die Anzahl der Felder in der Zeile
        //! \param zWert Einen Zeiger auf die Werte in der Zeile ohne erhöhten Reference Counter
        //! \return 1, wenn kein Fehler aufgetreten ist
        DLLEXPORT bool addZeile( int feldAnzahl, RCArray< Text > *zWert );
        //! Ersetzt eine existierende Zeile
        //! \param zeile Der Index der Zeile, die ersetzt werden soll
        //! \param feldAnzahl Die Anzahl der Felder in der Zeile
        //! \param zWert Einen Zeiger auf die Werte in der Zeile ohne erhöhten Reference Counter
        //! \return 1, wenn die Zeile existierte und ersetzt wurde. 0, wenn die angegebene Zeile nicht existierte
        DLLEXPORT bool setZeile( int zeile, int feldAnzahl, RCArray< Text > *zWert );
        //! Löscht eine Zeile
        //! \param zeile Der Index der Zeile, die gelöscht werden soll
        //! \return 1, wenn die Zeile gelöscht wurde. 0, wenn die Zeile nicht gefunden wurde
        DLLEXPORT bool removeZeile( int zeile );
        //! Fügt einer Bestimmten Zeile einen Wert hinzu
        //! \param zeile Der Index der Zeile, der ein Wert hinzugefügt werden soll
        //! \param pos Die Position in der Zeile, an der der Wert hinzugefügt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich hinzugefügt wurde. 0, falls die Zeile nicht existiert, oder pos zu groß ist
        DLLEXPORT bool addFeld( int zeile, int pos, Text *wert );
        //! Fügt einer Bestimmten Zeile einen Wert hinzu
        //! \param zeile Der Index der Zeile, der ein Wert hinzugefügt werden soll
        //! \param pos Die Position in der Zeile, an der der Wert hinzugefügt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich hinzugefügt wurde. 0, falls die Zeile nicht existiert, oder pos zu groß ist
        DLLEXPORT bool addFeld( int zeile, int pos, const char *wert );
        //! Fügt einer Bestimmten Zeile am Ende einen Wert hinzu
        //! \param zeile Der Index der Zeile, der ein Wert hinzugefügt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich hinzugefügt wurde. 0, falls die Zeile nicht existiert
        DLLEXPORT bool addFeld( int zeile, Text *wert );
        //! Fügt einer Bestimmten Zeile am Ende einen Wert hinzu
        //! \param zeile Der Index der Zeile, der ein Wert hinzugefügt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich hinzugefügt wurde. 0, falls die Zeile nicht existiert
        DLLEXPORT bool addFeld( int zeile, const char *wert );
        //! Setzt einen Bestimmten Wert in einer Zeile
        //! \param zeile Der Index der Zeile, in der ein Wert verändert werden soll
        //! \param feld Die Position in der Zeile, an der der Wert gesetzt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich ersetzt wurde. 0, falls die Zeile oder der Wert nicht existiert
        DLLEXPORT bool setFeld( int zeile, int feld, Text *wert );
        //! Setzt einen Bestimmten Wert in einer Zeile
        //! \param zeile Der Index der Zeile, in der ein Wert verändert werden soll
        //! \param feld Die Position in der Zeile, an der der Wert gesetzt werden soll
        //! \param wert Der Wert, der gespeichert werden soll
        //! \return 1, falls Der Wert erfolgreich ersetzt wurde. 0, falls die Zeile oder der Wert nicht existiert
        DLLEXPORT bool setFeld( int zeile, int feld, const char *wert );
        //! Entfernt einen bestimmten Wert
        //! \param zeile Der Index der Zeile, aus der ein Wert gelöscht werden soll
        //! \param feld Die Position in der Zeile, an der der Wert gelöscht werden soll
        //! \return 1, falls Der Wert erfolgreich gelöscht wurde. 0, falls die Zeile oder der Wert nicht existiert
        DLLEXPORT bool removeFeld( int zeile, int feld );
        //! Speichert die Tabelle in der Datei
        //! \return 1, falls die Tabbelle erfolgreich gespeichert wurde
        DLLEXPORT bool speichern();
        //! Gibt die Anzahl der Zeilen zurück
        DLLEXPORT int getZeilenAnzahl() const;
        //! Gibt die Anzahl der Werte (Spalten) in einer Zeile zurück
        //! \param zeile Der Index der Zeile, von der die Anzahl Werte ermittelt werden soll
        DLLEXPORT int getFeldAnzahl( int zeile ) const;
        //! Gibt einen bestimmten gespeicherten Wert zurück
        //! \param zeile Der Index der Zeile, in der der Wert gespeichert wird
        //! \param feld Der Index des Wertes in der Zeile
        //! \return Den gespeicherten Wert mit erhöhtem Reference Counter
        DLLEXPORT Text *getFeld( int zeile, int feld ) const;
        //! Gibt einen bestimmten gespeicherten Wert zurück
        //! \param zeile Der Index der Zeile, in der der Wert gespeichert wird
        //! \param feld Der Index des Wertes in der Zeile
        //! \return Den gespeicherten Wert ohne erhöhten Reference Counter
        DLLEXPORT Text *zFeld( int zeile, int feld ) const;
    };
}

#endif