#pragma once

#include "../Netzwerk/EditorKlient.h"
#include "../Abstract/Model.h"
#include <Punkt.h>
#include <Critical.h>
#include <functional>

namespace Editor
{
    struct SpielerDaten : public Model
    {
        int id;
        Punkt pos;
        double rot;
        double beschleunigung;
        int maxStabilit�t;
        int maxEnergie;
        double reparatur;
        double akkuLeistung;
        int laserIntensit�t;
        int laserEffizienz;
        int laserTempo;
        double wendigkeit;
        double antriebEffizienz;
        double energieSchild;
        double energieSchildEffizienz;
        int netzwerk;
        int skillPunkte;
        int m2d;
        int bild;
    };

    struct TeamDaten : public Model
    {
        int id;
        int maxPunkte;
        double beschleunigung;
        int maxStabilit�t;
        int maxEnergie;
        double reparatur;
        double akkuLeistung;
        int laserIntensit�t;
        int laserEffizienz;
        int laserTempo;
        double wendigkeit;
        double antriebEffizienz;
        double energieSchild;
        double energieSchildEffizienz;
        int punkte;
    };

    struct ObjektDaten : public Model
    {
        Punkt pos;
        int id;
        int m2d;
        int bild;
        int style;
        int maxStabilit�t;
        int maxEnergie;
        int energieRadius;
        double reparatur;
        double akkuLeistung;
        char team;
    };

    class KarteDaten : public Thread
    {
    private:
        EditorKlient * client;
        SpielerTeamStruktur *sts;
        Array< SpielerDaten* > spieler;
        Array< TeamDaten* > teams;
        Array< ObjektDaten* > objekte;
        Text error;
        Array< std::function< void() > > aktionen;
        Critical cs;
        bool exit;

    public:
        KarteDaten( EditorKlient *client );
        ~KarteDaten();
        void addObjekt( ObjektDaten &daten );
        void removeObjekt( int index );
        void getObjekt( int index, std::function< bool( ObjektDaten* ) > callBack );
        void getSpieler( int index, std::function< bool( SpielerDaten* ) > callBack );
        void getTeam( int index, std::function< bool( TeamDaten* ) > callBack );
        void thread() override;
        const ObjektDaten *getObjekt( int index );
        const SpielerDaten *getSpieler( int index );
        const TeamDaten *getTeam( int index );
        int getSpielerIndexById( int id );
        int getSpielerAnzahl() const;
        int getTeamIndexById( int id );
        int getTeamAnzahl() const;
        int getObjektAnzahl() const;
        bool hasError() const;
        char *getError() const;
        bool hasAktions() const;
        // l�scht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
        Thread *release() override;
    };
}