#include "AktionsThread.h"
#include "..\Global\Variablen.h"

// Inhalt der AktionsThread Klasse aus AktionsThread.h
// Konstruktor
AktionsThread::AktionsThread( int aktion, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5 )
	: Thread()
{
	this->aktion = aktion;
	this->arg1 = arg1;
	this->arg2 = arg2;
	this->arg3 = arg3;
	this->arg4 = arg4;
	this->arg5 = arg5;
	ref = 1;
	start();
}

// nicht constant
void AktionsThread::thread()
{
	switch( aktion )
	{
	case 1: // Login
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			int ret = loginKlient->login( (const char*)arg1, (const char*)arg2 );
			do
			{
				if( ret != 1 )
					continue;
				if( !infoKlient->verbinde() )
				{
					ret = 0;
					loginKlient->setLetzterFehler( infoKlient->getLetzterFehler() );
					loginKlient->logout();
					continue;
				}
				if( !chatKlient->verbinde() )
				{
					ret = 0;
					loginKlient->setLetzterFehler( chatKlient->getLetzterFehler() );
					loginKlient->logout();
					infoKlient->trenne();
					continue;
				}
				loginKlient->trenne();
			}
			while( 0 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zLogin()->setLoginReturn( ret );
		}
		break;
	case 2: // Login Erfolgreich
		hauptScreen->setdeckFarbe( 0x00000000 );
		hauptScreen->setOnTop( 1 );
		ladeAnimation->setSichtbar( 1 );
		for( unsigned char deckAlpha = 0; deckAlpha < 255; )
		{
			hauptScreen->setdeckFarbe( deckAlpha << 24 );
			Sleep( 40 );
			deckAlpha += 15;
		}
		hauptScreen->setdeckFarbe( 255 << 24 );
		hauptScreen->setRenderZeichnungen( 0 );
		vorLogin->setSichtbar( 0 );
		nachLogin->setAnzeige( NLANormal );
		hauptScreen->setRenderZeichnungen( 1 );
		ladeAnimation->setSichtbar( 0 );
		for( unsigned char deckAlpha = 255; deckAlpha > 0; )
		{
			hauptScreen->setdeckFarbe( deckAlpha << 24 );
			Sleep( 40 );
			deckAlpha -= 15;
		}
		hauptScreen->setdeckFarbe( 0 << 24 );
		hauptScreen->setOnTop( 0 );
		break;
	case 3: // Kick
		// arg1 = char* -- Account Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			int ret = (int)loginKlient->kick( (const char*)arg1 );
			do
			{
				if( !ret )
					continue;
				if( !infoKlient->verbinde() )
				{
					ret = 2;
					loginKlient->setLetzterFehler( infoKlient->getLetzterFehler() );
					loginKlient->logout();
					continue;
				}
				if( !chatKlient->verbinde() )
				{
					ret = 2;
					loginKlient->setLetzterFehler( chatKlient->getLetzterFehler() );
					loginKlient->logout();
					infoKlient->trenne();
					continue;
				}
				loginKlient->trenne();
			}
			while( 0 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zLogin()->setKickReturn( ret );
		}
		break;
	case 4: // Logout
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = loginKlient->logout();
			if( ret )
			{
				hauptScreen->lock();
				nachLogin->zChatLeiste()->removeAll();
				nachLogin->zFreundesListe()->removeAll();
				nachLogin->zNachrichtenListe()->removeAll();
				hauptScreen->unlock();
				infoKlient->trenne();
				spielKlient->trenne();
				chatKlient->trenne();
				loginKlient->trenne();
			}
			else
			{
				nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Das Ausloggen konnte nicht erfolgreich abgeschlossen werden." ),
																  new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
				ladeAnimation->setSichtbar( 0 );
				hauptScreen->setOnTop( 0 );
				break;
			}
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
		}
	case 5: // Logout Erfolgreich
		hauptScreen->setdeckFarbe( 0x00000000 );
		hauptScreen->setOnTop( 1 );
		ladeAnimation->setSichtbar( 1 );
		for( unsigned char deckAlpha = 0; deckAlpha < 255; )
		{
			hauptScreen->setdeckFarbe( deckAlpha << 24 );
			Sleep( 40 );
			deckAlpha += 15;
		}
		hauptScreen->setdeckFarbe( 255 << 24 );
		_render = 0;
		hauptScreen->lock();
		nachLogin->setAnzeige( NLALogin );
		vorLogin->setSichtbar( 1 );
		hauptScreen->unlock();
		_render = 1;
		ladeAnimation->setSichtbar( 0 );
		for( unsigned char deckAlpha = 255; deckAlpha > 0; )
		{
			hauptScreen->setdeckFarbe( deckAlpha << 24 );
			Sleep( 40 );
			deckAlpha -= 15;
		}
		hauptScreen->setdeckFarbe( 0 << 24 );
		hauptScreen->setOnTop( 0 );
		break;
	case 6: // Account Bestätigung
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			int ret = registerKlient->accountBestätigen( (const char*)arg1, (const char*)arg2 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zBestätigung()->setWeiterResult( ret );
		}
		break;
	case 7: // Account Bestätigung Fertig
		// arg1 = char* -- Schlüssel
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->bestätigen( (const char*)arg1 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zBestätigung()->setFertigResult( ret );
		}
		break;
	case 8: // Account E-Mail ändern
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		// arg4 = char* -- Neue E-Mail
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->eMailÄndern( (const char*)arg1, (const char*)arg2, (const char*)arg3, (const char*)arg4 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zEMailÄndern()->setReturn( ret );
		}
		break;
	case 9: // Account E-Mail Vergessen
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			char *eMail = 0;
			char **pEMail = &eMail;
			bool ret = registerKlient->eMailVergessen( (const char*)arg1, (const char*)arg2, (const char*)arg3, pEMail );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zEMailVergessen()->setReturn( ret, *pEMail );
		}
		break;
	case 10: // Account Geheimnis Ändern
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		// arg4 = char* -- Neues Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->geheimnisÄndern( (const char*)arg1, (const char*)arg2, (const char*)arg3, (const char*)arg4 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zGeheimnisÄndern()->setResult( ret );
		}
		break;
	case 11: // Account Geheimnis Vergessen
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->geheimnisVergessen( (const char*)arg1, (const char*)arg2 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zGeheimnisVergessen()->setResult( ret );
		}
		break;
	case 12: // Account Name Vergessen
		// arg1 = char* -- Account Passwort
		// arg2 = char* -- Account Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->nameVergessen( (const char*)arg1, (const char*)arg2 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zNameVergessen()->setResult( ret );
		}
		break;
	case 13: // Account Passwort Ändern
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		// arg4 = char* -- Neues Passwort
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->passwortÄndern( (const char*)arg1, (const char*)arg2, (const char*)arg3, (const char*)arg4 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zPasswortÄndern()->setResult( ret );
		}
		break;
	case 14: // Account Passwort Vergessen
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->passwortVergessen( (const char*)arg1, (const char*)arg2 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zPasswortVergessen()->setResult( ret );
		}
		break;
	case 15: // Account Erstellen
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		// arg4 = char* -- Account E-Mail
		// arg5 = Datum* -- Geburtsdatum
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->accountErstellen( (const char*)arg1,
														 (const char*)arg2,
														 (const char*)arg3,
														 (const char*)arg4,
														 (unsigned short)( (Datum*)arg5 )->getJahr(),
														 (char)( (Datum*)arg5 )->getMonat(),
														 (char)( (Datum*)arg5 )->getTag() );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zRegistrierung()->setWeiterReturn( ret );
			( (Datum*)arg5 )->release();
		}
		break;
	case 16: // account Erstellen Fertig
		// arg1 = char* -- Schlüssel
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->bestätigen( (const char*)arg1 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zRegistrierung()->setFertigReturn( ret );
		}
		break;
	case 17: // account Löschen Fertig
		// arg1 = char* -- Account Name
		// arg2 = char* -- Account Passwort
		// arg3 = char* -- Account Geheimnis
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->accountLöschen( (const char*)arg1, (const char*)arg2, (const char*)arg3 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zUnregistrierung()->setWeiterReturn( ret );
		}
		break;
	case 18: // account Löschen Fertig
		// arg1 = char* -- Schlüssel
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			bool ret = registerKlient->bestätigen( (const char*)arg1 );
			ladeAnimation->setSichtbar( 0 );
			hauptScreen->setOnTop( 0 );
			vorLogin->zUnregistrierung()->setFertigReturn( ret );
		}
		break;
	case 19: // Spiel Laden
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			for( unsigned char deckAlpha = 0; deckAlpha < 255; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha += 15;
			}
			hauptScreen->setdeckFarbe( 255 << 24 );
			_render = 0;
			hauptScreen->lock();
			int karteId = nachLogin->zSpielenFenster()->getKarteId();
			SpielerTeamStruktur *sts = nachLogin->zSpielenFenster()->getSTS();
			nachLogin->setAnzeige( NLAImSpiel );
			hauptScreen->unlock();
			_render = 1;
			nachLogin->zImSpiel()->beginnLaden( karteId, sts );
			ladeAnimation->setSichtbar( 0 );
			for( unsigned char deckAlpha = 255; deckAlpha > 0; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha -= 15;
			}
			hauptScreen->setdeckFarbe( 0 << 24 );
			hauptScreen->setOnTop( 0 );
		}
		break;
	case 20: // Spiel Statistik laden
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			for( unsigned char deckAlpha = 0; deckAlpha < 255; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha += 15;
			}
			hauptScreen->setdeckFarbe( 255 << 24 );
			_render = 0;
			hauptScreen->lock();
			int karteId = nachLogin->zImSpiel()->getKarteId();
			nachLogin->setAnzeige( NLANormal );
			hauptScreen->unlock();
			_render = 1;
			if( spielKlient->istVerbunden() )
				nachLogin->zSpielenFenster()->ladeSpielStatistik( karteId );
			ladeAnimation->setSichtbar( 0 );
			for( unsigned char deckAlpha = 255; deckAlpha > 0; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha -= 15;
			}
			hauptScreen->setdeckFarbe( 0 << 24 );
			hauptScreen->setOnTop( 0 );
		}
		break;
	case 21: // Spiel Aufzeichnung betreten
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			for( unsigned char deckAlpha = 0; deckAlpha < 255; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha += 15;
			}
			hauptScreen->setdeckFarbe( 255 << 24 );
			_render = 0;
			hauptScreen->lock();
			nachLogin->setAnzeige( NLASpielVideo );
			hauptScreen->unlock();
			_render = 1;
			ladeAnimation->setSichtbar( 0 );
			for( unsigned char deckAlpha = 255; deckAlpha > 0; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha -= 15;
			}
			hauptScreen->setdeckFarbe( 0 << 24 );
			hauptScreen->setOnTop( 0 );
		}
		break;
	case 22: // Spiel Aufzeichnung / Editor verlassen
		if( 1 )
		{
			hauptScreen->setdeckFarbe( 0x00000000 );
			hauptScreen->setOnTop( 1 );
			ladeAnimation->setSichtbar( 1 );
			for( unsigned char deckAlpha = 0; deckAlpha < 255; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha += 15;
			}
			hauptScreen->setdeckFarbe( 255 << 24 );
			_render = 0;
			hauptScreen->lock();
			nachLogin->setAnzeige( NLANormal );
			hauptScreen->unlock();
			_render = 1;
			ladeAnimation->setSichtbar( 0 );
			for( unsigned char deckAlpha = 255; deckAlpha > 0; )
			{
				hauptScreen->setdeckFarbe( deckAlpha << 24 );
				Sleep( 40 );
				deckAlpha -= 15;
			}
			hauptScreen->setdeckFarbe( 0 << 24 );
			hauptScreen->setOnTop( 0 );
		}
		break;
    case 23: // Editor betreten
        if( 1 )
        {
            hauptScreen->setdeckFarbe( 0x00000000 );
            hauptScreen->setOnTop( 1 );
            ladeAnimation->setSichtbar( 1 );
            for( unsigned char deckAlpha = 0; deckAlpha < 255; )
            {
                hauptScreen->setdeckFarbe( deckAlpha << 24 );
                Sleep( 40 );
                deckAlpha += 15;
            }
            hauptScreen->setdeckFarbe( 255 << 24 );
            _render = 0;
            hauptScreen->lock();
            nachLogin->setAnzeige( NLAEditor );
            hauptScreen->unlock();
            _render = 1;
            ladeAnimation->setSichtbar( 0 );
            for( unsigned char deckAlpha = 255; deckAlpha > 0; )
            {
                hauptScreen->setdeckFarbe( deckAlpha << 24 );
                Sleep( 40 );
                deckAlpha -= 15;
            }
            hauptScreen->setdeckFarbe( 0 << 24 );
            hauptScreen->setOnTop( 0 );
        }
        break;
	}
	release();
}

// constant

// Reference Counting
AktionsThread *AktionsThread::getThis()
{
	ref++;
	return this;
}

AktionsThread *AktionsThread::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}