#include "..\..\Global\Variablen.h"
#include "Bestätigung.h"
#include "..\..\Global\Initialisierung.h"
#include <Punkt.h>
#include <Text.h>

// Inhalt der Bestätigung Klasse aus Bestätigung.h
// Konstruktor
Bestätigung::Bestätigung( Schrift *zSchrift, Fenster *zVorLoginFenster )
{
	Punkt bildschirmGröße = BildschirmGröße();
	bestätigung = initKnopf( 10, 450, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Bestätigung" );
	bestätigung->setMausEreignisParameter( this );
	bestätigung->setMausEreignis( bestätigungBestätigungME );
	initToolTip( bestätigung, "Account aktivieren oder löschen.", zSchrift->getThis(), hauptScreen );
	zVorLoginFenster->addMember( bestätigung );
	fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 70, 250, 140, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Vorgang Bestätigen" );
	name = initTextFeld( 24, 20, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
	name->setTastaturEreignisParameter( this );
	name->setTastaturEreignis( bestätigungNameTE );
	initToolTip( name, "Account Name.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( name );
	passwort = initTextFeld( 24, 50, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
	passwort->setTastaturEreignisParameter( this );
	passwort->setTastaturEreignis( bestätigungPasswortTE );
	initToolTip( passwort, "Account Passwort.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( passwort );
	weiter = initKnopf( 74, 80, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Weiter" );
	weiter->setMausEreignisParameter( this );
	weiter->setMausEreignis( bestätigungWeiterME );
	fenster->addMember( weiter );
	nachricht = initTextFeld( 0, 5, 250, 150, zSchrift, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
	fenster->addMember( nachricht );
	schlüssel = initTextFeld( 24, 55, 200, 20, zSchrift, TextFeld::Style::TextFeld & ~TextFeld::Style::Sichtbar, "Schlüssel" );
	schlüssel->setTastaturEreignisParameter( this );
	schlüssel->setTastaturEreignis( bestätigungSchlüsselTE );
	initToolTip( schlüssel, "Zugeschickter Schlüssel.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( schlüssel );
	später = initKnopf( 20, 85, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Später" );
	später->setMausEreignisParameter( this );
	später->setMausEreignis( bestätigungSpäterME );
	initToolTip( später, "Vorgang später fortsetzen.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( später );
	abbruch = initKnopf( 20, 115, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
	abbruch->setMausEreignisParameter( this );
	abbruch->setMausEreignis( bestätigungAbbruchME );
	initToolTip( abbruch, "Vorgang abbrechen.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( abbruch );
	neuSenden = initKnopf( 129, 115, 100, 20, zSchrift, Knopf::Style::Sichtbar, "neu senden" );
	neuSenden->setMausEreignisParameter( this );
	neuSenden->setMausEreignis( bestätigungNeuSendenME );
	initToolTip( neuSenden, "E-Mail erneut senden.", zSchrift->getThis(), hauptScreen );
	fenster->addMember( neuSenden );
	zVorLoginFenster->addMember( fenster );
	ref = 1;
}

// Destruktor
Bestätigung::~Bestätigung()
{
	if( bestätigung )
		bestätigung = bestätigung->release();
	if( fenster )
		fenster = fenster->release();
	if( name )
		name = name->release();
	if( passwort )
		passwort = passwort->release();
	if( weiter )
		weiter = weiter->release();
	if( nachricht )
		nachricht = nachricht->release();
	if( schlüssel )
		schlüssel = schlüssel->release();
	if( später )
		später = später->release();
	if( abbruch )
		abbruch = abbruch->release();
	if( neuSenden )
		neuSenden = neuSenden->release();
}

// Privat
void Bestätigung::zeigeNachricht( const char *txt )
{
	Punkt bildschirmmitte = Bildschirmmitte();
	name->löscheStyle( TextFeld::Style::Sichtbar );
	passwort->löscheStyle( TextFeld::Style::Sichtbar );
	schlüssel->löscheStyle( TextFeld::Style::Sichtbar );
	später->löscheStyle( Knopf::Style::Sichtbar );
	abbruch->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" );
	nachricht->setText( txt );
	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 );
}

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

bool Bestätigung::bestätigungME( void *obj, MausEreignis me ) // MausEreignis im Knopf bestärigung
{
	if( me.id == ME_RLinks )
	{
		vorLogin->setBestätigung();

		bestätigung->setLinienRahmenBreite( 3 );
		bestätigung->setAlphaFeldFarbe( 0xFF000000 );
		bestätigung->setAlphaFeldStärke( 20 );

		Punkt bildschirmGröße = BildschirmGröße();
		nachricht->löscheStyle( TextFeld::Style::Sichtbar );
		schlüssel->löscheStyle( TextFeld::Style::Sichtbar );
		später->löscheStyle( Knopf::Style::Sichtbar );
		abbruch->löscheStyle( Knopf::Style::Sichtbar );
		neuSenden->löscheStyle( Knopf::Style::Sichtbar );
		fenster->setTitel( "Vorgang Bestätigen" );
		fenster->setGröße( 250, 140 );
		fenster->setPosition( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 70 );
		fenster->addStyle( Fenster::Style::Sichtbar );
		weiter->setText( "Weiter" );
		weiter->setPosition( 74, 80 );
		name->addStyle( TextFeld::Style::Sichtbar );
		passwort->addStyle( TextFeld::Style::Sichtbar );
		name->addStyle( TextFeld::Style::Fokus );
		name->setAuswahl( name->zText()->getLänge(), 0 );
	}
	return 1;
}

bool Bestätigung::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( bestätigung->zText()->getLänge() >= 25 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Bestätigung::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 )
	{
		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 Bestätigung::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
{
	if( me.id == ME_RLinks )
	{
		if( weiter->zText()->istGleich( "Weiter" ) )
		{
			if( name->zText()->getLänge() <= 0 )
				zeigeNachricht( "Bitte gebe deinen Accountnamen ein." );
			if( passwort->zText()->getLänge() == 0 )
				zeigeNachricht( "Bitte gebe dein Accountpasswort ein." );
			if( weiter->zText()->istGleich( "Ok" ) )
				return 1;
			new AktionsThread( 6, name->zText()->getText(), passwort->zText()->getText(), 0, 0, 0 );
		}
		else if( weiter->zText()->istGleich( "Fertig" ) )
		{
			if( schlüssel->zText()->getLänge() <= 0 )
			{
				zeigeNachricht( "Bitte gebe den dir zugesendeten Schlüssel ein." );
				return 1;
			}
			new AktionsThread( 7, schlüssel->zText()->getText(), 0, 0, 0, 0 );
		}
		else
		{
			if( fenster->zTitel()->istGleich( "Vorgang Bestätigen" ) )
			{
				MausEreignis me;
				me.id = ME_RLinks;
				bestätigungME( 0, me );
			}
			else
			{
				nachricht->setText( "Dir wurde eine E-Mail mit einem\nSchlüssel gesendet, den du hier\neingeben musst." );
				schlüssel->addStyle( TextFeld::Style::Sichtbar );
				fenster->setGröße( 250, 170 );
				Punkt bildschirmGröße = BildschirmGröße();
				fenster->setPosition( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 85 );
				später->addStyle( Knopf::Style::Sichtbar );
				weiter->setText( "Fertig" );
				weiter->setPosition( 129, 85 );
				abbruch->addStyle( Knopf::Style::Sichtbar );
				neuSenden->addStyle( Knopf::Style::Sichtbar );
			}
		}
	}
	return 1;
}

bool Bestätigung::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;
		weiterME( 0, me );
	}
	if( schlüssel->zText()->getLänge() >= 20 && istSchreibbar( te.taste ) )
		return 0;
	return 1;
}

bool Bestätigung::späterME( void *obj, MausEreignis me ) // MausEreignis im Knopf später
{
	if( me.id == ME_RLinks )
	{
		registerKlient->später();
		MausEreignis me;
		me.id = ME_RLinks;
		bestätigungME( 0, me );
	}
	return 1;
}

bool Bestätigung::abbruchME( void *obj, MausEreignis me ) // MausEreignis im Knopf abbruch
{
	if( me.id == ME_RLinks )
	{
		registerKlient->abbrechen();
		MausEreignis me;
		me.id = ME_RLinks;
		bestätigungME( 0, me );
	}
	return 1;
}

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

void Bestätigung::setWeiterResult( int ret ) // setzt den Returnwert des Weiter drückens
{
	if( !ret )
	{
		if( registerKlient->getLetzterFehler() )
			zeigeNachricht( registerKlient->getLetzterFehler() );
		else
			zeigeNachricht( "Es ist ein unbekannter Fehler aufgetreten." );
		return;
	}
	name->löscheStyle( TextFeld::Style::Sichtbar );
	passwort->löscheStyle( TextFeld::Style::Sichtbar );
	if( ret == 1 )
		fenster->setTitel( "Account aktivieren" );
	else
		fenster->setTitel( "Account löschen" );
	fenster->setGröße( 250, 170 );
	Punkt bildschirmGröße = BildschirmGröße();
	fenster->setPosition( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 85 );
	nachricht->setText( "Dir wurde eine E-Mail mit einem\nSchlüssel gesendet, den du hier\neingeben musst." );
	nachricht->addStyle( TextFeld::Style::Sichtbar );
	schlüssel->addStyle( TextFeld::Style::Sichtbar );
	später->addStyle( Knopf::Style::Sichtbar );
	weiter->setText( "Fertig" );
	weiter->setPosition( 129, 85 );
	abbruch->addStyle( Knopf::Style::Sichtbar );
	neuSenden->addStyle( Knopf::Style::Sichtbar );
}

void Bestätigung::setFertigResult( bool ret ) // setzt den Returnwert des Fertig drükens
{
	if( ret )
	{
		fenster->setTitel( "Vorgang Bestätigen" );
		zeigeNachricht( "Der Vorgang wurde erfolgreich abgeschlossen." );
	}
	else
		zeigeNachricht( "Du hast nicht den richtigen Schlüssel eingegeben." );
}

// Reference Counting
Bestätigung *Bestätigung::getThis()
{
	ref++;
	return this;
}

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


// messages
bool bestätigungBestätigungME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->bestätigungME( obj, me );
}

bool bestätigungNameTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->nameTE( obj, te );
}

bool bestätigungPasswortTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->passwortTE( obj, te );
}

bool bestätigungWeiterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->weiterME( obj, me );
}

bool bestätigungSchlüsselTE( void *p, void *obj, TastaturEreignis te )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->schlüsselTE( obj, te );
}

bool bestätigungSpäterME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->späterME( obj, me );
}

bool bestätigungAbbruchME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->abbruchME( obj, me );
}

bool bestätigungNeuSendenME( void *p, void *obj, MausEreignis me )
{
	if( !p )
		return 0;
	return ( (Bestätigung*)p )->neuSendenME( obj, me );
}