#ifndef RegisterServer_H
#define RegisterServer_H

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

using namespace Framework;
using namespace Network;

class RSKlient;

class RegisterServer : public Thread
{
private:
	Server* server;
	SSLServer* aServer;
	InitDatei* ini;
	RSDatenbank* db;
	CRITICAL_SECTION cs;
	RCArray< RSKlient >* klients;
	Text* fehler;
	int id;
	bool nichtPausiert;
	int empfangen;
	int gesendet;
	bool update;
	bool end;

public:
	// Konstruktor 
	RegisterServer(InitDatei* zIni);
	// Destruktor 
	virtual ~RegisterServer();
	// nicht constant 
	void runn();
	void thread();
	void close();
	bool serverStarten();
	bool serverPause();
	bool serverFortsetzen();
	bool serverBeenden();
	bool setMaxKlients(int mc);
	bool absturzKlient(int klientId);
	bool removeKlient(RSKlient* zKlient);
	void addGesendet(int bytes);
	void addEmpfangen(int bytes);
	// conatant 
	bool istAn() const;
	Server* zServer() const;
	RSDatenbank* zDB() const;
	bool hatClients() const;
	int getId() const;
	const char* getLetzterFehler() const;
	InitDatei* zIni() const;
};

class RSAKlient : public Thread
{
private:
	SSLSKlient* klient;
	Text* name;
	Text* passwort;
	int adminId;
	RegisterServer* rs;
	int version;

public:
	// Konstruktor 
	RSAKlient(SSLSKlient* klient, RegisterServer* rs);
	// Destruktor 
	virtual ~RSAKlient();
	// nicht constant
	void thread();
	void errorZuKlient(const char* nachricht) const; // sendet eine Fehlernachricht zum AKlient
};

class RSKlient : public Thread
{
private:
	SKlient* klient;
	unsigned int klientNummer;
	RegisterServer* rs;

public:
	// Konstruktor 
	RSKlient(SKlient* klient, RegisterServer* rs);
	// Destruktor 
	virtual ~RSKlient();
	// nicht constant
	void absturz();
	void thread();
	// constant
	void errorZuKlient(const char* nachricht) const; // sendet eine Fehlernachricht zum Klient
	int getKlientNummer() const;
};

#endif