#ifndef Datenbank_H
#define Datenbank_H

#include <sql.h>
#include <Text.h>
#include <Array.h>
#include <InitDatei.h>

using namespace Framework;
using namespace sql;

namespace Admin_Recht
{
	const int ISStarten = 0x00000014;
	const int ISBeenden = 0x00000015;
	const int ISPausieren = 0x00000016;
	const int ISMCÄndern = 0x00000017;
}

struct AHDaten;
class InformationServer;

class ISDatenbank
{
private:
	Datenbank *datenbank;
	CRITICAL_SECTION cs;
	int ref;

public:
	// Konstruktor
	ISDatenbank( InitDatei *zIni );
	// Destruktor
	~ISDatenbank();
	// nicht constant
	void lock();
	void unlock();
	int istAdministrator( const char *name, const char *passwort );
	bool adminHatRecht( int id, int recht );
	bool prüfKlient( int num, int sNum );
	Text *getKlientSchlüssel( int cId );
	void unregisterKlient( int num, int sNum );
	bool serverAnmelden( InitDatei *zIni );
	bool setServerStatus( int id, int status );
	bool setMaxClients( int id, int maxC );
	int getAdminPort( int id );
	bool serverIstNichtPausiert( int id );
	Text *getInformationsText( char *typ );
	bool istSpielErlaubt( int spielId );
	bool istKarteErlaubt( int karteId );
	Text *getAccountRufName( int accountId );
	int getAccountId( char *rufName );
	Array< int > *getAccountSpielStatistik( int accountId, int spielId );
	int getAccountKarteSpiele( int accountId, int karteId );
	int getAccountKarteSpieleGewonnen( int accountId, int karteId );
	Text *getKarteName( int karteId );
	Text *getSpielName( int spielId );
	Text *getChatroomName( int chatroomId );
	int getChatroomId( char *name );
	int getSpielId( int karteId );
	int getSpielId( char *name );
	int getKarteId( char *name );
	int getGruppenKarteId( int gruppeId );
	int getGruppeAdminId( int gruppeId );
	int getSpielerPunkte( int spielId, int accountId );
	Array< int > *getAccountSpielArtListe( int cId );
	int getNeusteSpielVersion( int spielId );
	int getKupfer( int cId );
	int getDateiGruppeVonSpiel( int sId );
	Text *getDateiGruppePfad( int dgId );
	Array< int > *getAccountKarteListe( int cId, int kId );
	bool hatAccountKarte( int account, int karte );
	bool hatAccountSpiel( int account, int spiel );
	int getDateiGruppeVonPfad( char *pfad );
	int getNeusteDateiGruppe( int dg );
	bool getGruppeSpielerHinzufügen( int gruppeId );
	Result getSpielerListe( char *suche, int *seite, int *maxSeite, int sortStalte, bool rückwärts );
	bool getSpielerAktivität( int accountId, RCArray< Text > *datum, Array< double > *stOnline, Array< double > *stGespielt,
							  Array< int > *anzSpiele, Array< int > *anzGewonnen );
	int getOnlineSeconds( int accountId, char *beg, char *end );
	int getGespieltSeconds( int accountId, char *beg, char *end );
	int getGespieltSpiele( int accountId, char *beg, char *end );
	int getGewonnenSpiele( int accountId, char *beg, char *end );
	Array< int > *getAccountKarteGespieltListe( int accountId, int spielArt );
	Array< int > *getAccountSpielGespieltListe( int accountId );
	Result getSpielPartnerListe( int accountId );
	Result getSpielStatistikListe( int accountId, int *seite, int *maxSeite, int sortStalte, bool rückwärts );
    AHDaten *getSpielHistorie( int accountId, InformationServer *is );
	bool getHistorieServerPortIp( int clientId, int spielId, int *port, Text *ip );
	bool hatKlientRecht( int kId, int recht );
	Result getKartenListe( int kId, char *suchFilter, char sortSpalte, char sortRichtung );
    bool getEditorServerPortIp( int clientId, int karteId, int *port, Text *ip );
    bool getKartenServerPortIp( int clientId, int karteId, int *port, Text *ip );
	// constant
	Text *getLetzterFehler() const;
	// Reference Counting
	ISDatenbank *getThis();
	ISDatenbank *release();
};

#endif