#ifndef MainServer_H
#define MainServer_H

#include <Server.h>
#include <Thread.h>
#include <InitDatei.h>
#include "Datenbank.h"

using namespace Framework;
using namespace Network;

class MainServer : public Thread
{
private:
	Server *server;
	Server *aServer;
	InitDatei *dat;
	MSDatenbank *db;
	CRITICAL_SECTION cs;
	int empfangen;
	int gesendet;
	int clients;
	bool end;
	int ref;

public:
	// Konstruktor 
	MainServer( InitDatei *zDat );
	// Destruktor 
	virtual ~MainServer();
	// nicht constant 
	void runn();
	void thread();
	void close();
	bool serverStarten();
	void serverBeenden();
	void addGesendet( int bytes );
	void addEmpfangen( int bytes );
	void clientTrennung();
	// constant 
	Server *zServer() const;
	MSDatenbank *zDB() const;
	bool hatClients() const;
	// Reference Counting
	MainServer *getThis();
	MainServer *release();
};

class MSAKlient : public Thread
{
private:
	SKlient *klient;
	Text *name;
	Text *passwort;
	int adminId;
	MainServer *ms;

public:
	// Konstruktor 
	MSAKlient( SKlient *klient, MainServer *ms );
	// Destruktor 
	virtual ~MSAKlient();
	// nicht constant 
	void thread();
	void errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum AKlient
};

class MSKlient : public Thread
{
private:
	SKlient *klient;
	unsigned int klientNummer;
	MainServer *ms;
	bool encrypted;

public:
	// Konstruktor 
	MSKlient( SKlient *klient, MainServer *ms );
	// Destruktor 
	virtual ~MSKlient();
	// nicht constant 
	void thread();
	void errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum Klient
};

class MSGWeiterleitung
{
private:
	MainServer *ms;
	int ref;

public:
	// Konstruktor
	MSGWeiterleitung( MainServer *ms );
	// Destruktor
	~MSGWeiterleitung();
	// nicht constant
	bool patchServerKlientAbsturz( int klientId );
	bool registerServerKlientAbsturz( int klientId );
	bool loginServerKlientAbsturz( int klientId );
	bool informationServerKlientAbsturz( int klientId );
	bool chatServerKlientAbsturz( int klientId );
	bool anmeldungServerKlientAbsturz( int klientId );
	bool spielServerKlientAbsturz( int klientId );
	bool shopServerKlientAbsturz( int klientId );
	bool newsServerKlientAbsturz( int klientId );
    bool historieServerKlientAbsturz( int klientId );
    bool kartenServerKlientAbsturz( int klientId );
    bool editorServerKlientAbsturz( int klientId );
	bool spielErstelltAbbrechen( int spielErstelltId );
	bool spielerLeavesGruppe( int gruppeId, int accountId );
	bool setGruppeAdmin( int gruppeId, int adminId );
	bool spielerLeavesChatroom( int chatroomId, int accountId );
	bool setChatroomAdmin( int chatroomId, int adminId );
	bool kickSpielerAusGruppe( int gruppeId );
	// constant

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

#endif