#ifndef DreieckListe_H
#define DreieckListe_H

#include "Array.h"
#include "Punkt.h"

namespace Framework
{
    template<typename T>
    //! Eine Ecke eines Dreiecks
    struct DreieckPunkt
    {
        T* punkt;
        Vec2<float>* textur;

        //! Konstruktor
        //! \param punkt Die Koordinate der Ecke
        //! \param textur Die Koordinate in der Textur
        DreieckPunkt(T* punkt, Vec2<float>* textur)
        {
            this->punkt = punkt;
            this->textur = textur;
        }

        //! Destruktor
        ~DreieckPunkt()
        {
            delete punkt;
            delete textur;
        }
    };

    template<typename T>
    //! Eine Liste von Dreiecken, wobei immer die Beiden letzten Punkte des
    //! vorheriegen Dreiecks mit dem nächsten Punkt ein neues Dreieck bilden
    class DreieckListe : public virtual ReferenceCounter
    {
    private:
        Array<DreieckPunkt<T>*>* punkte;

    public:
        //! Konstruktor
        DreieckListe()
            : ReferenceCounter()
        {
            punkte = new Array<DreieckPunkt<T>*>();
        }

        //! Destruktor
        ~DreieckListe()
        {
            int anz = punkte->getEintragAnzahl();
            for (int i = 0; i < anz; i++)
                delete punkte->get(i);
            punkte->release();
        }

        //! Fügt der Liste einen Punkt hinzu
        //! \param p Die Koordinaten des Punktes
        //! \param textur Die Koordinaten in der Textur
        void addPunkt(T* p, Vec2<float>* textur)
        {
            punkte->add(new DreieckPunkt<T>(p, textur));
        }

        //! Löscht den letzten Punkt
        void removeLetztenPunkt()
        {
            int i = punkte->getEintragAnzahl() - 1;
            if (!punkte->hat(i)) return;
            delete punkte->get(i);
            punkte->remove(i);
        }

        //! Löscht alle Ecken
        void lehren()
        {
            int anz = punkte->getEintragAnzahl();
            for (int i = 0; i < anz; i++)
                delete punkte->get(i);
            punkte->leeren();
        }

        //! gibt die Anzahl der Dreiecke zurück
        int getDreieckAnzahl() const
        {
            return punkte->getEintragAnzahl() - 2;
        }

        //! Gibt zurück, ob eine Textur verwendet wird
        bool hatTextur() const
        {
            int anz = punkte->getEintragAnzahl();
            bool ret = 1;
            for (int i = 0; i < anz; i++)
            {
                if (punkte->hat(i)) ret &= punkte->get(i)->textur;
            }
            return ret;
        }

        //! Gibt die Liste mit Punkten zurück
        Array<DreieckPunkt<T>*>* zListe() const
        {
            return punkte;
        }
    };
} // namespace Framework

#endif