#pragma once

#include "Array.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class Text;
    class Model3DData;
    class Knochen;
    class Datei;
    class GraphicsApi;

    //! Verwaltet eine Datei, in der 3d Modelle abgespeichert wurden
    class M3Datei : public virtual ReferenceCounter
    {
    private:
        Text pfad;
        RCArray< Text >* modelName;
        Array< __int64 >* modelPos;

        void saveKnochen( Knochen* k, Datei* zDat );
        Knochen* readKnochen( Datei* zDat ) const;

    public:
        //! Konstruktor
        DLLEXPORT M3Datei();
        //! Konstruktor
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT M3Datei( const char* pfad );
        //! Konstruktor
        //! \param pfad Der Pfad zur Datei
        DLLEXPORT M3Datei( Text* pfad );
        //! Destruktor
        DLLEXPORT ~M3Datei();
        //! Setzt den Pfad zur Datei
        //! \param pfad Pfad zur Datei
        DLLEXPORT void setPfad( const char* pfad );
        //! Ließt grundlegende Informationen aus der Datei, die für ihre Verwendung benötigt werden
        DLLEXPORT void leseDaten();
        //! Speichert 3D Modell Daten in der Datei
        //! \param zMdr Ein Zeiger auf die zu speichernden Daten ohne erhöhtem Reference Counter
        //! \param name Der Name, unter dem die Daten in der Datei gespeichert werden sollen
        //! \return 1, falls das Modell gespeichert wurde. 0, falls ein fehler beim speichern auftrat
        DLLEXPORT bool saveModel( Model3DData* zMdr, Text* name );
        //! Speichert 3D Modell Daten in der Datei
        //! \param zMdr Ein Zeiger auf die zu speichernden Daten ohne erhöhtem Reference Counter
        //! \param name Der Name, unter dem die Daten in der Datei gespeichert werden sollen
        //! \return 1, falls das Modell gespeichert wurde. 0, falls ein fehler beim speichern auftrat
        DLLEXPORT bool saveModel( Model3DData* zMdr, const char* name );
        //! Löscht ein 3D Modell aus der Datei
        //! \param name Der Name des Modells
        //! \return 1, wenn das Modell gelöscht wurde. 0, wenn das Modell nicht gefunden wurde, oder ein fehler beim speichern auftrat
        DLLEXPORT bool removeModel( Text* name );
        //! Löscht ein 3D Modell aus der Datei
        //! \param name Der Name des Modells
        //! \return 1, wenn das Modell gelöscht wurde. 0, wenn das Modell nicht gefunden wurde, oder ein fehler beim speichern auftrat
        DLLEXPORT bool removeModel( const char* name );
        //! Lähd ein 3D Modell aus der Datei
        //! \param name Der name des zu ladenden Modells
        //! \return Die geladenen Daten
        DLLEXPORT Model3DData* ladeModel( Text* name, GraphicsApi* zApi, Text* uniqueName ) const;
        //! Lähd ein 3D Modell aus der Datei
        //! \param name Der name des zu ladenden Modells
        //! \return Die geladenen Daten
        DLLEXPORT Model3DData* ladeModel( const char* name, GraphicsApi* zApi, const char* uniqueName ) const;
        //! überprft, ob ein bestimmtes 3D Modell in der Datei existiert
        //! \param name Der Name des zu suchenden 3D Modells
        //! \return 1, wenn das Modell gefunden wurde. 0 sonst
        DLLEXPORT bool hatModel( const char* name ) const;
        //! ügibt die Anzahl der gespeicherten Modelle zurück
        DLLEXPORT int getModelAnzahl() const;
        //! Gibt den Namen eines Bestimmten Modells zurück
        //! \param i Der Index des Modells
        //! \return Ein Zeiger aud den Namen des Modells ohne erhöhten Reference Counter
        DLLEXPORT Text* zModelName( int i ) const;
    };
}