#ifndef ChatLeiste_H
#define ChatLeiste_H

#include <Klient.h>
#include <Zeichnung.h>
#include <TextFeld.h>
#include <Fenster.h>
#include <Knopf.h>
#include <Scroll.h>
#include <Tabelle.h>
#include <GSLSoundV.h>

using namespace Framework;
using namespace Network;

class Chat
{
protected:
	LRahmen *rahmen;
	TextFeld *verlauf;
	TextFeld *nachricht;
	TextFeld *name;
	Knopf *minimieren;
	Knopf *schließen;
	Punkt bildschirmGröße;
	GSL::GSLSoundV *msgSound;
	bool admin;
	double tickVal;
	bool sichtbar;
	int animation;
	int breite;
	int höhe;
	bool rend;
	int ref;

public:
	// Konstruktor
	Chat( Schrift *zSchrift );
	// Destruktor
	~Chat();
	// nicht constant
	void setSichtbar( bool sichtbar );
	void entfernen();
	void addNachricht( char *txt );
	void setAdmin();
	virtual void addSpieler( int accountId );
	virtual void removeSpieler( int accountId );
	virtual bool tick( double tickVal );
	virtual void doMausEreignis( MausEreignis &me );
	virtual void doTastaturEreignis( TastaturEreignis &te );
	virtual void render( int x, Bild &zRObj );
	// constant
	TextFeld *getName() const;
	TextFeld *zName() const;
	virtual int getAccountId() const;
	virtual int getChatroomId() const;
	int getBreite() const;
	bool istSichtbar() const;
	// Reference Counting
	virtual void *getThis();
	virtual void *release();
};

class ChatFenster : public Chat
{
private:
	int accountId;

public:
	// Konstruktor
	ChatFenster( Schrift *zSchrift, int accountId );
	// Destruktor
	~ChatFenster();
	// nicht constant
	bool tick( double tickVal ) override;
	void doMausEreignis( MausEreignis &me ) override;
	void doTastaturEreignis( TastaturEreignis &te ) override;
	void render( int x, Bild &zRObj ) override;
	// constant
	int getAccountId() const override;
	// Reference Counting
	void *getThis() override;
	void *release() override;
};

class ChatroomFenster : public Chat
{
private:
	int chatroomId;
	ObjTabelle *spieler;
	Schrift *schrift;
	Array< int > *neueSpieler;
	int neueSpielerAnzahl;
	Array< int > *alteSpieler;
	int alteSpielerAnzahl;
	TextFeld *spielerName;
	Knopf *einladen;

public:
	// Konstruktor
	ChatroomFenster( Schrift *zSchrift, int chatroomId );
	// Destruktor
	~ChatroomFenster();
	// nicht constant
	void addSpieler( int accountId ) override;
	void removeSpieler( int accountId ) override;
	bool tick( double tickVal ) override;
	void doMausEreignis( MausEreignis &me ) override;
	void doTastaturEreignis( TastaturEreignis &te ) override;
	void render( int x, Bild &zRObj ) override;
	bool druckFreund( void *obj, MausEreignis &me );
	bool druckEntfernen( void *obj, MausEreignis &me );
	// constant
	virtual int getChatroomId() const;
	// Reference Counting
	virtual void *getThis();
	virtual void *release();
};

class ChatLeisteObj : public Zeichnung
{
private:
	RCArray< Chat > *chats;
	HScrollBar *hsb;
	Schrift *schrift;
	Punkt bildschirmGröße;
	int anzahl;
	int ref;
	int nowME;

public:
	// Konstruktor
	ChatLeisteObj( Schrift *zSchrift );
	// Destruktor
	~ChatLeisteObj();
	// nicht constant
	void chatNachricht( int vonAccount, char *txt );
	void chatroomNachricht( int chatroomId, char *txt );
	void addChat( int accountId, int chatroomId );
	void removeChat( int accountId, int chatroomId );
	void removeChat( Chat *zChat );
	void removeAll();
	void addSpieler( int chatroomId, int accountId );
	void removeSpieler( int chatroomId, int accountId );
	void setChatroomAdmin( int chatroomId );
	bool tick( double tickVal ) override;
	void doTastaturEreignis( TastaturEreignis &te ) override;
	void doMausEreignis( MausEreignis &me ) override;
	void render( Bild &zRObj ) override;
	// constant

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

class ChatLeiste
{
private:
	Fenster *fenster;
	Knopf *minMax;
	ChatLeisteObj *chatLeiste;
	Punkt bildschirmGröße;
	Bild *minimierenBild;
	Bild *maximierenBild;
	double tickVal;
	int animation;
	bool rend;
	int ref;

public:
	// Konstruktor
	ChatLeiste( Schrift *zSchrift, Fenster *zNachLoginFenster );
	// Destruktor
	~ChatLeiste();
	// nicht constant
	void chatNachricht( int vonAccount, char *txt );
	void chatroomNachricht( int chatroomId, int vonAccount, char *txt );
	void addChat( int accountId, int chatroomId );
	void removeChat( int accountId, int chatroomId );
	void removeChat( Chat *zChat );
	void removeAll();
	void addSpieler( int chatroomId, int accountId );
	void removeSpieler( int chatroomId, int accountId );
	void setChatroomAdmin( int chatroomId );
	bool tick( double tickVal );
	bool druckMinMax( MausEreignis &me );
	// constant

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

// Nachrichten
bool chatLeisteMinMaxME( void *p, void *obj, MausEreignis me );
bool chatroomFensterFreundME( void *p, void *obj, MausEreignis me );
bool chatroomFensterEntfernenME( void *p, void *obj, MausEreignis me );

#endif