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

// Inhalt der Unregistrierung Klasse aus Unregistrierung.h
// Konstruktor 
Unregistrierung::Unregistrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
{
	Punkt bildschirmGröße = BildschirmGröße();
	unregistrierung = initKnopf( 10, 130, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Account löschen" );
	unregistrierung->setMausEreignisParameter( this );
	unregistrierung->setMausEreignis( unregistrierungUnregistrierungME );
	initToolTip( unregistrierung, "Account für alle Zeiten entfernen.", zSchrift->getThis(), hauptScreen );
	zVorLoginFenster->addMember( unregistrierung );
	fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 85, 250, 170, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Account löschen" );
	name = initTextFeld( 24, 20, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Name" );
	name->setTastaturEreignisParameter( this );
	name->setTastaturEreignis( unregistrierungNameTE );
	initToolTip( name, "Account Name eingeben.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( name );
	passwort = initTextFeld( 24, 50, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Passwort" );
	passwort->setTastaturEreignisParameter( this );
	passwort->setTastaturEreignis( unregistrierungPasswortTE );
	initToolTip( passwort, "Account Passwort eingeben.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( passwort );
	geheimnis = initTextFeld( 24, 80, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Geheimnis" );
	geheimnis->setTastaturEreignisParameter( this );
	geheimnis->setTastaturEreignis( unregistrierungGeheimnisTE );
	initToolTip( geheimnis, "Account Geheimnis eingeben.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( geheimnis );
	weiter = initKnopf( 74, 110, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Weiter" );
	weiter->setMausEreignisParameter( this );
	weiter->setMausEreignis( unregistrierungWeiterME );
	fenster->addMember( weiter );
	text = initTextFeld( 0, 5, 250, 170, zSchrift, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
	fenster->addMember( text );
	schlüssel = initTextFeld( 25, 85, 200, 20, zSchrift, TextFeld::Style::TextFeld & ~TextFeld::Style::Sichtbar, "Schlüssel" );
	schlüssel->setTastaturEreignisParameter( this );
	schlüssel->setTastaturEreignis( unregistrierungSchlüsselTE );
	initToolTip( schlüssel, "Zugeschickter Bestätigungsschlüssel.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( schlüssel );
	später = initKnopf( 20, 145, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Später" );
	später->setMausEreignisParameter( this );
	später->setMausEreignis( unregistrierungSpäterME );
	initToolTip( später, "Vorgang später unter 'Bestätigung' beenden.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( später );
	neuSenden = initKnopf( 129, 145, 100, 20, zSchrift, Knopf::Style::Sichtbar, "neu senden" );
	neuSenden->setMausEreignisParameter( this );
	neuSenden->setMausEreignis( unregistrierungNeuSendenME );
	initToolTip( neuSenden, "E-Mail erneut senden.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( neuSenden );
	fertig = initKnopf( 129, 115, 100, 20, zSchrift, 0, "Fertig" );
	fertig->setMausEreignisParameter( this );
	fertig->setMausEreignis( unregistrierungFertigME );
	fenster->addMember( fertig );
	zVorLoginFenster->addMember( fenster );
	ref = 1;
}

// Destruktor 
Unregistrierung::~Unregistrierung()
{
	if( fenster )
		fenster = fenster->release();
	if( name )
		name = name->release();
	if( passwort )
		passwort = passwort->release();
	if( geheimnis )
		geheimnis = geheimnis->release();
	if( weiter )
		weiter = weiter->release();
	if( text )
		text = text->release();
	if( schlüssel )
		schlüssel = schlüssel->release();
	if( später )
		später = später->release();
	if( neuSenden )
		neuSenden = neuSenden->release();
	if( fertig )
		fertig = fertig->release();
	if( unregistrierung )
		unregistrierung = unregistrierung->release();
}

// Privat
void Unregistrierung::zeigeNachricht( const char *txt )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	name->löscheStyle( TextFeld::Style::Sichtbar );
	passwort->löscheStyle( TextFeld::Style::Sichtbar );
	geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
	schlüssel->löscheStyle( TextFeld::Style::Sichtbar );
	später->löscheStyle( Knopf::Style::Sichtbar );
	fertig->löscheStyle( Knopf::Style::Sichtbar );
	neuSenden->löscheStyle( Knopf::Style::Sichtbar );
	fenster->setGröße( 250, 150 );
	fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 75 );
	weiter->setPosition( 139, 100 );
	weiter->setText( "Ok" );
	text->setText( txt );
	if( text->zText()->getLänge() > 30 )
	{
		int pos = -1;
		bool set = 0;
		int lastp = 0;
		for( int i = 20; i < text->zText()->getLänge(); )
		{
			char *tmp = &text->zText()->getText()[ i ];
			while( *tmp != ' ' && i < text->zText()->getLänge() )
			{
				tmp++;
				i++;
				if( i - 30 >= lastp )
				{
					if( set )
					{
						lastp = pos;
						set = 0;
						text->zText()->getText()[ pos ] = '\n';
					}
					else
						lastp += 5;
				}
			}
			if( i < text->zText()->getLänge() )
			{
				pos = i;
				set = 1;
				tmp++;
				i++;
			}
		}
	}
	text->addStyle( TextFeld::Style::Sichtbar );
}

// Knopfdruck
void Unregistrierung::druckFremdKnopf() // Ein anderer Knopfwurde gedrückt
{
	fenster->löscheStyle( Fenster::Style::Sichtbar );
	registerKlient->trenne();
	unregistrierung->setLinienRahmenBreite( 2 );
	unregistrierung->setAlphaFeldFarbe( 0x5500FF00 );
	unregistrierung->setAlphaFeldStärke( -5 );
}

bool Unregistrierung::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 Unregistrierung::passwortTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld passwort
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Press )
		passwort->setSchowChar( '*' );
	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
	{
		passwort->löscheStyle( TextFeld::Style::Fokus );
		geheimnis->addStyle( TextFeld::Style::Fokus );
		geheimnis->setAuswahl( geheimnis->zText()->getLänge(), 0 );
	}
	if( passwort->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

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

bool Unregistrierung::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
{
	if( me.id == ME_RLinks )
	{
		Punkt bildchirmGröße = BildschirmGröße();
		if( schlüssel->hatStyle( TextFeld::Style::Sichtbar ) )
		{
			text->löscheStyle( TextFeld::Style::Sichtbar );
			schlüssel->löscheStyle( TextFeld::Style::Sichtbar );
			fertig->löscheStyle( Knopf::Style::Sichtbar );
			später->löscheStyle( Knopf::Style::Sichtbar );
			neuSenden->löscheStyle( Knopf::Style::Sichtbar );
			weiter->setPosition( 74, 110 );
			weiter->setText( "Weiter" );
			fenster->setGröße( 250, 170 );
			fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 85 );
			fenster->setTitel( "Account löschen" );
			name->addStyle( TextFeld::Style::Sichtbar );
			passwort->addStyle( TextFeld::Style::Sichtbar );
			geheimnis->addStyle( TextFeld::Style::Sichtbar );
			registerKlient->abbrechen();
			name->addStyle( TextFeld::Style::Fokus );
			name->setAuswahl( name->zText()->getLänge(), 0 );
		}
		else
		{
			if( weiter->zText()->istGleich( "Ok" ) )
			{
				if( fenster->zTitel()->istGleich( "Account löschen" ) )
				{
					text->löscheStyle( TextFeld::Style::Sichtbar );
					fenster->setGröße( 250, 170 );
					fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 85 );
					weiter->setPosition( 74, 110 );
					weiter->setText( "Weiter" );
					name->addStyle( TextFeld::Style::Sichtbar );
					passwort->addStyle( TextFeld::Style::Sichtbar );
					geheimnis->addStyle( TextFeld::Style::Sichtbar );
					name->addStyle( TextFeld::Style::Fokus );
					name->setAuswahl( name->zText()->getLänge(), 0 );
				}
				else
				{
					fenster->setGröße( 250, 200 );
					fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 100 );
					weiter->setPosition( 20, 115 );
					weiter->setText( "Abbrechen" );
					text->setText( "Dir wurde eine E-Mail mit einem\ndeaktivierungsode zugeschickt,\nden du in den nächsten 12 Stunden\nhier eingeben musst." );
					schlüssel->addStyle( TextFeld::Style::Sichtbar );
					später->addStyle( Knopf::Style::Sichtbar );
					neuSenden->addStyle( Knopf::Style::Sichtbar );
					fertig->addStyle( Knopf::Style::Sichtbar );
					schlüssel->addStyle( TextFeld::Style::Fokus );
					schlüssel->setAuswahl( schlüssel->zText()->getLänge(), 0 );
				}
			}
			else
			{
				if( name->zText()->getLänge() == 0 ||
					passwort->zText()->getLänge() == 0 ||
					geheimnis->zText()->getLänge() == 0 )
				{
					if( name->zText()->getLänge() == 0 )
						zeigeNachricht( "Bitte gebe deinen Accountnamen\nein." );
					else if( passwort->zText()->getLänge() == 0 )
						zeigeNachricht( "Bitte gebe dein Accountpasswort\nein." );
					else if( geheimnis->zText()->getLänge() == 0 )
						zeigeNachricht( "Bitte gebe dein Accountgeheimnis\nein." );
					return 1;
				}
				new AktionsThread( 17, name->zText()->getText(), passwort->zText()->getText(), geheimnis->zText()->getText(), 0, 0 );
			}
		}
	}
	return 1;
}

bool Unregistrierung::schlüsselTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld schlüssel
{
	if( te.id == TE_Press && te.taste == T_Enter )
		return 0;
	if( te.id == TE_Release && te.taste == T_Enter )
	{
		schlüssel->löscheStyle( TextFeld::Style::Fokus );
		MausEreignis me;
		me.id = ME_RLinks;
		fertigME( 0, me );
	}
	if( schlüssel->zText()->getLänge() >= 20 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Unregistrierung::späterME( void *obj, MausEreignis me ) // MausEreignis im Knopf später
{
	if( me.id == ME_RLinks )
	{
		fenster->setTitel( "Account löschen" );
		zeigeNachricht( "Du kannst den Vorgang nun später unter 'Bestätigung' vollenden." );
	}
	return 1;
}

bool Unregistrierung::neuSendenME( void *obj, MausEreignis me ) // MausEreignis im Knopf neuSenden
{
	if( me.id == ME_RLinks )
		registerKlient->eMailErneutSenden();
	return 1;
}

bool Unregistrierung::fertigME( void *obj, MausEreignis me ) // MausEreignis im Knopf fertig
{
	if( me.id == ME_RLinks )
		new AktionsThread( 18, schlüssel->zText()->getText(), 0, 0, 0, 0 );
	return 1;
}

bool Unregistrierung::unregistrierungME( void *obj, MausEreignis me ) // MausEreignis im Knopf unregistrierung
{
	if( me.id == ME_RLinks )
	{
		vorLogin->setUnregistrierung();

		fenster->addStyle( Fenster::Style::Sichtbar );
		unregistrierung->setLinienRahmenBreite( 3 );
		unregistrierung->setAlphaFeldFarbe( 0xFF000000 );
		unregistrierung->setAlphaFeldStärke( 20 );

		if( schlüssel->hatStyle( TextFeld::Style::Sichtbar ) )
			registerKlient->abbrechen();
		text->löscheStyle( TextFeld::Style::Sichtbar );
		schlüssel->löscheStyle( TextFeld::Style::Sichtbar );
		fertig->löscheStyle( Knopf::Style::Sichtbar );
		später->löscheStyle( Knopf::Style::Sichtbar );
		neuSenden->löscheStyle( Knopf::Style::Sichtbar );
		weiter->setPosition( 74, 110 );
		weiter->setText( "Weiter" );
		fenster->setTitel( "Account löschen" );
		fenster->setGröße( 250, 170 );
		Punkt bildchirmGröße = BildschirmGröße();
		fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 85 );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		geheimnis->addStyle( TextFeld::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

void Unregistrierung::setWeiterReturn( bool ret ) // setzt den Weiter Returnwert
{
	Punkt bildchirmGröße = BildschirmGröße();
	if( ret )
	{
		name->löscheStyle( TextFeld::Style::Sichtbar );
		passwort->löscheStyle( TextFeld::Style::Sichtbar );
		geheimnis->löscheStyle( TextFeld::Style::Sichtbar );
		fenster->setTitel( "Account deaktiveren" );
		fenster->setGröße( 250, 200 );
		fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 100 );
		weiter->setPosition( 20, 115 );
		weiter->setText( "Abbrechen" );
		text->setText( "Dir wurde eine E-Mail mit einem\ndeaktivierungsode zugeschickt,\nden du in den nächsten 12 Stunden\nhier eingeben musst." );
		text->addStyle( TextFeld::Style::Sichtbar );
		schlüssel->addStyle( TextFeld::Style::Sichtbar );
		fertig->addStyle( Knopf::Style::Sichtbar );
		später->addStyle( Knopf::Style::Sichtbar );
		neuSenden->addStyle( Knopf::Style::Sichtbar );
		schlüssel->addStyle( TextFeld::Style::Fokus );
		schlüssel->setAuswahl( schlüssel->zText()->getLänge(), 0 );
	}
	else if( registerKlient->getLetzterFehler() )
		zeigeNachricht( registerKlient->getLetzterFehler() );
}

void Unregistrierung::setFertigReturn( bool ret ) // setzt den Fertig Returnwert
{
	if( ret )
		vorLogin->setLogin( 0 );
	else
		zeigeNachricht( registerKlient->getLetzterFehler() );
}

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

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


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

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

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

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

bool unregistrierungSchlüsselTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Unregistrierung*)p )->schlüsselTE( obj, te );
}

bool unregistrierungSpäterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Unregistrierung*)p )->späterME( obj, me );
}

bool unregistrierungNeuSendenME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Unregistrierung*)p )->neuSendenME( obj, me );
}

bool unregistrierungFertigME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Unregistrierung*)p )->fertigME( obj, me );
}

bool unregistrierungUnregistrierungME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Unregistrierung*)p )->unregistrierungME( obj, me );
}