#include "..\..\Global\Variablen.h"
#include "Login.h"
#include "..\..\Global\Initialisierung.h"
#include <Punkt.h>
#include <Text.h>

// Inhalt der Login Klasse aus Login.h
// Konstruktor 
Login::Login( Schrift *zSchrift, Fenster *vorLoginFenster )
{
	Punkt bildschirmGröße = BildschirmGröße();
	login = initKnopf( 10, 50, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Login" );
	login->setMausEreignisParameter( this );
	login->setMausEreignis( loginLoginME );
	initToolTip( login, "Einloggen.", zSchrift->getThis(), hauptScreen );
	vorLoginFenster->addMember( login );
	fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 75, 250, 150, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Login" );
	name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
	name->setTastaturEreignisParameter( this );
	name->setTastaturEreignis( loginNameTE );
	initToolTip( name, "Account Name.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( name );
	passwort = initTextFeld( 20, 55, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
	passwort->setTastaturEreignisParameter( this );
	passwort->setTastaturEreignis( loginPasswortTE );
	initToolTip( passwort, "Account Passwort.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( passwort );
	weiter = initKnopf( 75, 90, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Login" );
	weiter->setMausEreignisParameter( this );
	weiter->setMausEreignis( loginWeiterME );
	fenster->addMember( weiter );
	nachricht = initTextFeld( 5, 5, 238, 50, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
	fenster->addMember( nachricht );
	geheimnis = initTextFeld( 20, 55, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimnis" );
	geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
	geheimnis->setTastaturEreignisParameter( this );
	geheimnis->setTastaturEreignis( loginGeheimnisTE );
	initToolTip( geheimnis, "Account Geheimnis.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( geheimnis );
	abbrechen = initKnopf( 10, 98, 100, 20, zSchrift, 0, "Abbrechen" );
	abbrechen->setMausEreignisParameter( this );
	abbrechen->setMausEreignis( loginAbbrechenME );
	fenster->addMember( abbrechen );
	ok = initKnopf( 138, 98, 100, 20, zSchrift, 0, "Ok" );
	ok->setMausEreignisParameter( this );
	ok->setMausEreignis( loginOkME );
	fenster->addMember( ok );
	vorLoginFenster->addMember( fenster );
	MausEreignis me;
	me.id = ME_RLinks;
	loginME( 0, me );
	ref = 1;
}

// Destruktor 
Login::~Login()
{
	if( fenster )
		fenster = fenster->release();
	if( name )
		name = name->release();
	if( passwort )
		passwort = passwort->release();
	if( nachricht )
		nachricht = nachricht->release();
	if( geheimnis )
		geheimnis = geheimnis->release();
	if( weiter )
		weiter = weiter->release();
	if( abbrechen )
		abbrechen = abbrechen->release();
	if( ok )
		ok = ok->release();
	if( login )
		login = login->release();
}

// Knopfdruck
void Login::druckFremdKnopf() // Ein anderer Bereich des Programms wurde ausgewählt
{
	fenster->löscheStyle( Fenster::Style::Sichtbar );
	loginKlient->trenne();
	login->setLinienRahmenBreite( 2 );
	login->setAlphaFeldFarbe( 0x5500FF00 );
	login->setAlphaFeldStärke( -5 );
}

bool Login::nameTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld name
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		name->löscheStyle( TextFeld::Style::Fokus );
		passwort->addStyle( TextFeld::Style::Fokus );
		passwort->setAuswahl( passwort->zText()->getLänge(), 0 );
	}
	if( name->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Login::passwortTE( void *obj, TastaturEreignis te ) // TastaturEreignis im Textfeld passwort
{
	if( te.id == TE_Press )
		passwort->setSchowChar( '*' );
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && te.taste == T_Enter )
	{
		passwort->löscheStyle( TextFeld::Style::Fokus );
		MausEreignis me;
		me.id = ME_RLinks;
		weiterME( 0, me );
	}
	if( passwort->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Login::geheimnisTE( void *obj, TastaturEreignis te ) // TastaturEreignis im Textfeld geheimnis
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Press )
		geheimnis->setSchowChar( '*' );
	if( te.id == TE_Release && te.taste == T_Enter )
	{
		geheimnis->löscheStyle( TextFeld::Style::Fokus );
		MausEreignis me;
		me.id = ME_RLinks;
		okME( 0, me );
	}
	if( geheimnis->zText()->getLänge() >= 50 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Login::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
{
	if( me.id == ME_RLinks )
	{
		if( name->zText()->getLänge() == 0 )
		{
			name->löscheStyle( TextFeld::Style::Sichtbar );
			passwort->löscheStyle( TextFeld::Style::Sichtbar );
			weiter->löscheStyle( Knopf::Style::Sichtbar );
			nachricht->setText( "Bitte trage deinen Accountnamen\nein." );
			nachricht->addStyle( TextFeld::Style::Sichtbar );
			ok->addStyle( Knopf::Style::Sichtbar );
			return 1;
		}
		if( passwort->zText()->getLänge() == 0 )
		{
			name->löscheStyle( TextFeld::Style::Sichtbar );
			passwort->löscheStyle( TextFeld::Style::Sichtbar );
			weiter->löscheStyle( Knopf::Style::Sichtbar );
			nachricht->setText( "Bitte trage dein Passwort ein." );
			nachricht->addStyle( TextFeld::Style::Sichtbar );
			ok->addStyle( Knopf::Style::Sichtbar );
			return 1;
		}
		new AktionsThread( 1, name->zText()->getText(), passwort->zText()->getText(), 0, 0, 0 );
	}
	return 1;
}

bool Login::okME( void *obj, MausEreignis me ) // MausEreignis im Knopf ok
{
	if( me.id == ME_RLinks )
	{
		if( geheimnis->hatStyle( TextFeld::Style::Sichtbar ) )
			new AktionsThread( 3, geheimnis->zText()->getText(), 0, 0, 0, 0 );
		else
		{
			nachricht->löscheStyle( TextFeld::Style::Sichtbar );
			geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
			ok->löscheStyle( Knopf::Style::Sichtbar );
			abbrechen->löscheStyle( Knopf::Style::Sichtbar );
			name->addStyle( TextFeld::Style::Sichtbar );
			passwort->addStyle( TextFeld::Style::Sichtbar );
			weiter->addStyle( TextFeld::Style::Sichtbar );
			name->addStyle( TextFeld::Style::Fokus );
			name->setAuswahl( name->zText()->getLänge(), 0 );
		}
	}
	return 1;
}

bool Login::abbrechenME( void *obj, MausEreignis me ) // MausEreignis im Knopf abbrechen
{
	if( me.id == ME_RLinks )
	{
		nachricht->löscheStyle( TextFeld::Style::Sichtbar );
		geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
		ok->löscheStyle( Knopf::Style::Sichtbar );
		abbrechen->löscheStyle( Knopf::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		weiter->addStyle( TextFeld::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

bool Login::loginME( void *obj, MausEreignis me ) // MausEreignis im Knopf login
{
	if( me.id == ME_RLinks )
	{
		vorLogin->setLogin( 1 );

		nachricht->löscheStyle( TextFeld::Style::Sichtbar );
		geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
		ok->löscheStyle( Knopf::Style::Sichtbar );
		abbrechen->löscheStyle( Knopf::Style::Sichtbar );
		fenster->addStyle( Fenster::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		weiter->addStyle( TextFeld::Style::Sichtbar );

		login->setLinienRahmenBreite( 3 );
		login->setAlphaFeldFarbe( 0xFF000000 );
		login->setAlphaFeldStärke( 20 );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

void Login::setLoginReturn( int ret ) // setzt den Returnwert vom login
{
	if( ret == 1 )
		new AktionsThread( 2, 0, 0, 0, 0, 0 );
	else if( ret == 2 )
	{
		name->löscheStyle( TextFeld::Style::Sichtbar );
		passwort->löscheStyle( TextFeld::Style::Sichtbar );
		weiter->löscheStyle( Knopf::Style::Sichtbar );
		nachricht->setText( "Der Account ist bereits online.\nGebe dein Account Geheimnis ein,\num den anderen Benutzer zu kicken." );
		nachricht->addStyle( TextFeld::Style::Sichtbar );
		geheimnis->addStyle( TextFeld::Style::Sichtbar );
		ok->addStyle( Knopf::Style::Sichtbar );
		abbrechen->addStyle( Knopf::Style::Sichtbar );
		geheimnis->addStyle( TextFeld::Style::Fokus );
		geheimnis->setAuswahl( geheimnis->zText()->getLänge(), 0 );
	}
	else if( !ret && loginKlient->getLetzterFehler() )
	{
		name->löscheStyle( TextFeld::Style::Sichtbar );
		passwort->löscheStyle( TextFeld::Style::Sichtbar );
		weiter->löscheStyle( Knopf::Style::Sichtbar );
		nachricht->setText( loginKlient->getLetzterFehler() );
		if( nachricht->zText()->getLänge() > 30 )
		{
			int pos = -1;
			bool set = 0;
			int lastp = 0;
			for( int i = 20; i < nachricht->zText()->getLänge(); )
			{
				char *tmp = &nachricht->zText()->getText()[ i ];
				while( *tmp != ' ' && i < nachricht->zText()->getLänge() )
				{
					tmp++;
					i++;
					if( i - 30 >= lastp )
					{
						if( set )
						{
							lastp = pos;
							set = 0;
							nachricht->zText()->getText()[ pos ] = '\n';
						}
						else
							lastp += 5;
					}
				}
				if( i < nachricht->zText()->getLänge() )
				{
					pos = i;
					set = 1;
					tmp++;
					i++;
				}
			}
		}
		nachricht->addStyle( TextFeld::Style::Sichtbar );
		ok->addStyle( Knopf::Style::Sichtbar );
	}
}

void Login::setKickReturn( int ret ) // setzt den returnwert vom kick
{
	if( ret == 1 )
		new AktionsThread( 2, 0, 0, 0, 0, 0 );
	else if( ret == 2 )
	{
		nachricht->setText( loginKlient->getLetzterFehler() );
		if( nachricht->zText()->getLänge() > 30 )
		{
			int pos = -1;
			bool set = 0;
			int lastp = 0;
			for( int i = 20; i < nachricht->zText()->getLänge(); )
			{
				char *tmp = &nachricht->zText()->getText()[ i ];
				while( *tmp != ' ' && i < nachricht->zText()->getLänge() )
				{
					tmp++;
					i++;
					if( i - 30 >= lastp )
					{
						if( set )
						{
							lastp = pos;
							set = 0;
							nachricht->zText()->getText()[ pos ] = '\n';
						}
						else
							lastp += 5;
					}
				}
				if( i < nachricht->zText()->getLänge() )
				{
					pos = i;
					set = 1;
					tmp++;
					i++;
				}
			}
		}
		geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
		abbrechen->löscheStyle( Knopf::Style::Sichtbar );
	}
	else if( !ret )
	{
		nachricht->setText( "Das Geheimnis stimmt nicht mit dem des Accounts\nüberein. Achte auf Groß - und Kleinschreibung." );
		geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
		abbrechen->löscheStyle( Knopf::Style::Sichtbar );
	}
}

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

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

// Ereignisse
bool loginNameTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Login*)p )->nameTE( obj, te );
}

bool loginPasswortTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Login*)p )->passwortTE( obj, te );
}

bool loginGeheimnisTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Login*)p )->geheimnisTE( obj, te );
}

bool loginWeiterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Login*)p )->weiterME( obj, me );
}

bool loginAbbrechenME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Login*)p )->abbrechenME( obj, me );
}

bool loginOkME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Login*)p )->okME( obj, me );
}

bool loginLoginME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Login*)p )->loginME( obj, me );
}