#ifndef AccountHistorie_H
#define AccountHistorie_H

#include <Zeichnung.h>
#include <Thread.h>
#include <Knopf.h>
#include <Array.h>
#include <AuswahlBox.h>
#include <Fenster.h>
#include <Animation.h>
#include <AccountHistorieStatistikV.h>
#include <AufzeichnungV.h>

using namespace Framework;

class AHSpielStatistik : private Thread
{
private:
	Fenster *statistikF;
	Animation2D *laden;
	Schrift *schrift;
	Text *dllName;
	HINSTANCE dllHandle;
	AccountHistorieStatistikV *statistik;
	double tickVal;
	unsigned char alpha;
	bool sichtbar;
	int spielId;
	int ref;

public:
	// Konstruktor
	AHSpielStatistik( Schrift *schrift );
	// Destruktor
	~AHSpielStatistik();
	// nicht constant
	void reset();
	bool ladeDaten( int spielId, int spielArtId );
	void thread();
	void setPosition( int x, int y );
	void setSichtbar( bool sichtbar );
	void doMausEreignis( MausEreignis &me );
	void doTastaturEreignis( TastaturEreignis &te );
	bool tick( double tickVal );
	void render( Bild &zRObj );
	// constant
	bool istNochSichtbar() const;
	// Refernce Counting
	AHSpielStatistik *getThis();
	AHSpielStatistik *release();
};

class AHSpielVideo : private Thread
{
private:
	Fenster *videoF;
	Animation2D *laden;
	Schrift *schrift;
	Text *dllName;
	HINSTANCE dllHandle;
	AufzeichnungV *video;
	double tickVal;
	unsigned char alpha;
	bool sichtbar;
	int spielId;
	int ref;

public:
	// Konstruktor
	AHSpielVideo( Schrift *schrift );
	// Destruktor
	~AHSpielVideo();
	// nicht constant
	void reset();
	bool ladeDaten( int spielId, int spielArtId );
	void thread();
	void setSichtbar( bool sichtbar );
	bool tick( double tickVal );
	void render( Bild &zRObj );
	// constant
	bool istNochSichtbar() const;
	// Refernce Counting
	AHSpielVideo *getThis();
	AHSpielVideo *release();
};

class AHSLETeamListeSpieler
{
private:
	TextFeld *nameTF;
	TextFeld *punkteTF;
	TextFeld *statusTF;
	LRahmen *ram;
	int ref;

public:
	// Konstruktor
	AHSLETeamListeSpieler( Schrift *zSchrift, char *name, int punkte, char *status, int farbe, int br );
	// Destruktor
	~AHSLETeamListeSpieler();
	// nicht constant
	void render( int yOff, Bild &zRObj );
	// cnstant

	// Reference Counting
	AHSLETeamListeSpieler *getThis();
	AHSLETeamListeSpieler *release();
};

class AHSLETeamListeTeam
{
private:
	TextFeld *nameTF;
	TextFeld *sAnzahlTF;
	TextFeld *statusTF;
	LRahmen *ram;
	RCArray< AHSLETeamListeSpieler > *members;
	int ref;

public:
	// Konstruktor
	AHSLETeamListeTeam( Schrift *zSchrift, char *name, int sAnz, char *status, int farbe, int br );
	// Destruktor
	~AHSLETeamListeTeam();
	// nicht constant
	void addSpieler( AHSLETeamListeSpieler *s );
	void render( int xOff, int yOff, Bild &zRObj );
	// constant
	int getHöhe() const;
	// Reference Counting
	AHSLETeamListeTeam *getThis();
	AHSLETeamListeTeam *release();
};

class AHSLETeamListe
{
private:
	RCArray< AHSLETeamListeTeam > *members;
	int xPos;
	int ref;

public:
	// Konstruktor
	AHSLETeamListe( int xPos );
	// Destruktor
	~AHSLETeamListe();
	// nicht constant
	void addTeam( AHSLETeamListeTeam  *t );
	void render( Bild &zRObj );
	// constant
	int getHöhe() const;
	int getBreite() const;
	// Reference Counting
	AHSLETeamListe *getThis();
	AHSLETeamListe *release();
};

class AHSpielListeEintrag
{
private:
	TextFeld *spielTF;
	TextFeld *karteTF;
	TextFeld *datumTF;
	TextFeld *statusTF;
	Text *spiel;
	Text *karte;
	Text *datum;
	Text *status;
	Knopf *detailsK;
	TextFeld *dauerTF;
	TextFeld *spielStatusTF;
	TextFeld *gewinnerTF;
	TextFeld *sAnzahlTF;
	Knopf *statistikK;
	Knopf *videoK;
	AHSLETeamListe *liste;
	LRahmen *ram;
	Bild *einklappen;
	Bild *ausklappen;
	int karteId;
	int id;
	double tickVal;
	int aktion;
	int maxHö;
	int ref;

public:
	// Konstruktor
	AHSpielListeEintrag( int id, int karteId, Schrift *zSchrift, char *spiel, char *karte, char *datum, char *status, 
						 char *dauer, char *spielStatus, char *gewinner, int sAnzahl );
	// Destruktor
	~AHSpielListeEintrag();
	// nicht constant
	void addTeam( AHSLETeamListeTeam *t );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( int yOff, Bild &zRObj );
	int getAktion();
	// constant
	int getKarteId() const;
	int getHöhe() const;
	int getId() const;
	int getListeBreite() const;
	Text *zSpiel() const;
	Text *zKarte() const;
	Text *zDatum() const;
	Text *zStatus() const;
	// Reference Counting
	AHSpielListeEintrag *getThis();
	AHSpielListeEintrag *release();
};

class AHSpielListe : public Zeichnung
{
private:
	LRahmen *ram;
	VScrollBar *scroll;
	RCArray< AHSpielListeEintrag > *members;
	Text *sortSpalte;
	bool sortAbsteigend;
	int ref;

	// privat
	int getReihenfolge( int *arr );

public:
	// Konstruktor
	AHSpielListe();
	// Destruktor
	~AHSpielListe();
	// nicht constant
	void setSortSpalte( char *sp );
	void setSortRichtung( bool absteigend );
	void reset();
	void addSpiel( AHSpielListeEintrag *s );
	bool tick( double tickVal ) override;
	void doMausEreignis( MausEreignis &me ) override;
	void render( Bild &zRObj ) override;
	// constant
	int getAktion( int *spielId, int *karteId ) const;
	// Reference Counting
	AHSpielListe *getThis();
	AHSpielListe *release();
};

class AccountHistorie : public Thread
{
private:
	Schrift *schrift;
	Fenster *historieF;
	AuswahlBox *sortSpalte;
	AuswahlBox *sortRichtung;
	AHSpielListe *liste;
	AHSpielStatistik *statistik;
	AHSpielVideo *video;
	int status;
	int accId;
	int animation;
	unsigned char alpha;
	unsigned char alpha2;
	unsigned char alpha3;
	double tickVal;
	bool rend;
	int ref;

public:
	// Konstruktor
	AccountHistorie( Schrift *zSchrift );
	// Destruktor
	~AccountHistorie();
	// nicht constant
	void reset();
	void ladeStatistik( int accId );
	virtual void thread();
	void setSichtbar( bool sichtbar, bool nachRechts );
	bool tick( double zeit );
	void doMausEreignis( MausEreignis &me );
	void doTastaturEreignis( TastaturEreignis &te );
	void render( Bild &zRObj );
	// constant
	int getStatus() const;
	// Reference Counting
	AccountHistorie *getThis();
	AccountHistorie *release();
};

#endif