#include "AccountAnsehen.h"
#include "../../Global/Variablen.h"
#include "../../Global/Initialisierung.h"
#include <Punkt.h>
#include <Rahmen.h>

// inhalt der AccountAnsehen Klasse aus AccountAnsehen.h
// Konstruktor
AccountAnsehen::AccountAnsehen( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
	: Zeichnung(),
  laden( (Animation2D*)ladeAnimation->dublizieren() ),
  bildschirmGröße( BildschirmGröße() ),
  rahmen( new LRahmen() ),
  aktivitätK( initKnopf( 145, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spieler Aktivität" ) ),
  historieK( initKnopf( 665, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiel Historie" ) ),
  spieleUndKartenK( initKnopf( 275, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiele / Karten" ) ),
  spielPartnerK( initKnopf( 405, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spielpartner" ) ),
  statistikK( initKnopf( 535, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiel Statistik" ) ),
  suchenK( initKnopf( 15, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spieler suchen" ) ),
  suche( new AccountSuchen( zSchrift->getThis() ) ),
  aktivität( new AccountAktivität( zSchrift ) ),
  spieleUndKarten( new AccountSpieleUndKarten( zSchrift ) ),
  partner( new AccountSpielPartner( zSchrift ) ),
  statistik( new AccountStatistik( zSchrift ) ),
  historie( new AccountHistorie( zSchrift ) ),
  account( 0 ),
  alpha( 0 ),
  alpha2( 255 ),
  sichtbar( 0 ),
  jetzt( 0 ),
  nachher( 0 ),
  prozent1( 0 ),
  prozent2( 0 ),
  tickVal( 0 ),
  animation( 0 ),
  knopfX( 810 ),
  rend( 0 ),
  ref( 1 )
{
	laden->setSichtbar( 0 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setGröße( 102, 32 );
	begPos = Punkt( x, 67 );
	begGröße = Punkt( 102, 32 );
	pos = Punkt( x, 67 );
	gr = Punkt( 102, 32 );
	pos1 = begPos;
	größe1 = begGröße;
	größe2 = Punkt( 800, 500 );
	pos2 = bildschirmGröße / 2 - größe2 / 2;
	laden->setPosition( 375, 225 );
	zNachLoginFenster->addMember( this );
}

// Destruktor
AccountAnsehen::~AccountAnsehen()
{
	laden->release();
	rahmen->release();
	aktivitätK->release();
	historieK->release();
	spieleUndKartenK->release();
	spielPartnerK->release();
	statistikK->release();
	suchenK->release();
	suche->release();
	aktivität->release();
	spieleUndKarten->release();
	partner->release();
	statistik->release();
	historie->release();
}

// nicht constant
void AccountAnsehen::setSichtbar( bool sicht )
{
	begPos = pos;
	begGröße = gr;
	animation |= ( sicht ? 0x1 : 0x2 );
	rend = 1;
}

bool AccountAnsehen::setSpielerDetails( int account, int nachher )
{
	if( laden->istSichtbar() )
		return 0;
	laden->setSichtbar( 1 );
	if( nachher == 2 )
		aktivität->ladeStatistik( account );
	if( nachher == 3 )
		spieleUndKarten->ladeStatistik( account );
	if( nachher == 4 )
		partner->ladeStatistik( account );
	if( nachher == 5 )
		statistik->ladeStatistik( account );
	if( nachher == 6 )
		historie->ladeStatistik( account );
	this->nachher = nachher;
	this->account = account;
	return 1;
}

bool AccountAnsehen::tick( double tickVal )
{
	if( !knopfX )
	{
		rend |= aktivitätK->tick( tickVal );
		rend |= historieK->tick( tickVal );
		rend |= spieleUndKartenK->tick( tickVal );
		rend |= spielPartnerK->tick( tickVal );
		rend |= statistikK->tick( tickVal );
		rend |= suchenK->tick( tickVal );
	}
	rend |= laden->tick( tickVal );
	rend |= suche->tick( tickVal );
	rend |= aktivität->tick( tickVal );
	rend |= spieleUndKarten->tick( tickVal );
	rend |= partner->tick( tickVal );
	rend |= statistik->tick( tickVal );
	rend |= historie->tick( tickVal );
	this->tickVal += tickVal;
	int val = (int)( this->tickVal * 150 );
	int val2 = (int)( this->tickVal * 500 );
	this->tickVal -= val / 150.0;
	if( val )
	{
		if( ( animation | 0x1 ) == animation ) // Einblenden
		{
			if( prozent1 != 100 )
			{
				prozent1 += val;
				if( prozent1 >= 100 )
				{
					prozent1 = 100;
					if( !jetzt && !nachher )
						setSpielerDetails( loginKlient->getAccountId(), 2 );
				}
				pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
				gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
			}
			else if( alpha != 255 )
			{
				alpha += val * 2;
				if( alpha >= 255 || ( animation | 0x2 ) == animation )
				{
					alpha = 255;
					animation &= ~0x1;
					sichtbar = 1;
					prozent1 = 0;
				}
			}
			rend = 1;
		}
		if( ( animation | 0x2 ) == animation ) // ausblenden
		{
			if( alpha != 0 )
			{
				alpha -= val * 2;
				if( alpha < 0 )
					alpha = 0;
			}
			else
			{
				prozent2 += val;
				if( prozent2 > 100 )
					prozent2 = 100;
				pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
				gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
				if( prozent2 == 100 )
				{
					prozent2 = 0;
					animation &= ~0x2;
					sichtbar = 0;
				}
			}
			rend = 1;
		}
		if( laden->istSichtbar() && alpha2 != 100 )
		{
			if( alpha2 - val <= 100 )
				alpha2 = 100;
			else
				alpha2 -= val;
			rend = 1;
		}
		if( !laden->istSichtbar() && alpha2 != 255 )
		{
			if( alpha2 + val >= 255 )
				alpha2 = 255;
			else
				alpha2 += val;
			rend = 1;
		}
	}
	if( val2 )
	{
		if( jetzt > 1 && !laden->istSichtbar() && knopfX != 0 )
		{
			if( knopfX - val2 < 0 )
				knopfX = 0;
			else
				knopfX -= val2;
			rend = 1;
		}
		if( jetzt < 2 && !laden->istSichtbar() && knopfX != 810 )
		{
			if( knopfX + val2 > 810 )
				knopfX = 810;
			else
				knopfX += val2;
			rend = 1;
		}
	}
	switch( nachher )
	{
	case 2:
		if( aktivität->getStatus() == 2 )
		{
			switch( jetzt )
			{
			case 0:
				aktivität->setSichtbar( 1, 0 );
				break;
			case 1:
				suchenK->setAlphaFeldStärke( -5 );
				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
				suche->setSichtbar( 0 );
				aktivität->setSichtbar( 1, 0 );
				break;
			case 3:
				spieleUndKartenK->setAlphaFeldStärke( -5 );
				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
				spieleUndKarten->setSichtbar( 0, 1 );
				aktivität->setSichtbar( 1, 1 );
				break;
			case 4:
				spielPartnerK->setAlphaFeldStärke( -5 );
				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
				partner->setSichtbar( 0, 1 );
				aktivität->setSichtbar( 1, 1 );
				break;
			case 5:
				statistikK->setAlphaFeldStärke( -5 );
				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
				statistik->setSichtbar( 0, 1 );
				aktivität->setSichtbar( 1, 1 );
				break;
			case 6:
				historieK->setAlphaFeldStärke( -5 );
				historieK->setAlphaFeldFarbe( 0x5500FF00 );
				historie->setSichtbar( 0, 1 );
				aktivität->setSichtbar( 1, 1 );
				break;
			}
			aktivitätK->setAlphaFeldStärke( -2 );
			aktivitätK->setAlphaFeldFarbe( 0x3000FF00 );
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		if( !aktivität->getStatus() )
		{
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		break;
	case 3:
		if( spieleUndKarten->getStatus() == 2 )
		{
			switch( jetzt )
			{
			case 0:
				spieleUndKarten->setSichtbar( 1, 0 );
				break;
			case 1:
				suchenK->setAlphaFeldStärke( -5 );
				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
				suche->setSichtbar( 0 );
				spieleUndKarten->setSichtbar( 1, 0 );
				break;
			case 2:
				aktivitätK->setAlphaFeldStärke( -5 );
				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
				aktivität->setSichtbar( 0, 0 );
				spieleUndKarten->setSichtbar( 1, 0 );
				break;
			case 4:
				spielPartnerK->setAlphaFeldStärke( -5 );
				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
				partner->setSichtbar( 0, 1 );
				spieleUndKarten->setSichtbar( 1, 1 );
				break;
			case 5:
				statistikK->setAlphaFeldStärke( -5 );
				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
				statistik->setSichtbar( 0, 1 );
				spieleUndKarten->setSichtbar( 1, 1 );
				break;
			case 6:
				historieK->setAlphaFeldStärke( -5 );
				historieK->setAlphaFeldFarbe( 0x5500FF00 );
				historie->setSichtbar( 0, 1 );
				spieleUndKarten->setSichtbar( 1, 1 );
				break;
			}
			spieleUndKartenK->setAlphaFeldStärke( -2 );
			spieleUndKartenK->setAlphaFeldFarbe( 0x3000FF00 );
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		if( !spieleUndKarten->getStatus() )
		{
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		break;
	case 4:
		if( partner->getStatus() == 2 )
		{
			switch( jetzt )
			{
			case 0:
				partner->setSichtbar( 1, 0 );
				break;
			case 1:
				suchenK->setAlphaFeldStärke( -5 );
				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
				suche->setSichtbar( 0 );
				partner->setSichtbar( 1, 0 );
				break;
			case 2:
				aktivitätK->setAlphaFeldStärke( -5 );
				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
				aktivität->setSichtbar( 0, 0 );
				partner->setSichtbar( 1, 0 );
				break;
			case 3:
				spieleUndKartenK->setAlphaFeldStärke( -5 );
				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
				spieleUndKarten->setSichtbar( 0, 0 );
				partner->setSichtbar( 1, 0 );
				break;
			case 5:
				statistikK->setAlphaFeldStärke( -5 );
				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
				statistik->setSichtbar( 0, 1 );
				partner->setSichtbar( 1, 1 );
				break;
			case 6:
				historieK->setAlphaFeldStärke( -5 );
				historieK->setAlphaFeldFarbe( 0x5500FF00 );
				historie->setSichtbar( 0, 1 );
				partner->setSichtbar( 1, 1 );
				break;
			}
			spielPartnerK->setAlphaFeldStärke( -2 );
			spielPartnerK->setAlphaFeldFarbe( 0x3000FF00 );
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		if( !partner->getStatus() )
		{
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		break;
	case 5:
		if( statistik->getStatus() == 2 )
		{
			switch( jetzt )
			{
			case 0:
				statistik->setSichtbar( 1, 0 );
				break;
			case 1:
				suchenK->setAlphaFeldStärke( -5 );
				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
				suche->setSichtbar( 0 );
				statistik->setSichtbar( 1, 0 );
				break;
			case 2:
				aktivitätK->setAlphaFeldStärke( -5 );
				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
				aktivität->setSichtbar( 0, 0 );
				statistik->setSichtbar( 1, 0 );
				break;
			case 3:
				spieleUndKartenK->setAlphaFeldStärke( -5 );
				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
				spieleUndKarten->setSichtbar( 0, 0 );
				statistik->setSichtbar( 1, 0 );
				break;
			case 4:
				spielPartnerK->setAlphaFeldStärke( -5 );
				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
				partner->setSichtbar( 0, 0 );
				statistik->setSichtbar( 1, 0 );
				break;
			case 6:
				historieK->setAlphaFeldStärke( -5 );
				historieK->setAlphaFeldFarbe( 0x5500FF00 );
				historie->setSichtbar( 0, 1 );
				statistik->setSichtbar( 1, 1 );
				break;
			}
			statistikK->setAlphaFeldStärke( -2 );
			statistikK->setAlphaFeldFarbe( 0x3000FF00 );
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		if( !statistik->getStatus() )
		{
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		break;
	case 6:
		if( historie->getStatus() == 2 )
		{
			switch( jetzt )
			{
			case 0:
				historie->setSichtbar( 1, 0 );
				break;
			case 1:
				suchenK->setAlphaFeldStärke( -5 );
				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
				suche->setSichtbar( 0 );
				historie->setSichtbar( 1, 0 );
				break;
			case 2:
				aktivitätK->setAlphaFeldStärke( -5 );
				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
				aktivität->setSichtbar( 0, 0 );
				historie->setSichtbar( 1, 0 );
				break;
			case 3:
				spieleUndKartenK->setAlphaFeldStärke( -5 );
				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
				spieleUndKarten->setSichtbar( 0, 0 );
				historie->setSichtbar( 1, 0 );
				break;
			case 4:
				spielPartnerK->setAlphaFeldStärke( -5 );
				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
				partner->setSichtbar( 0, 0 );
				historie->setSichtbar( 1, 0 );
				break;
			case 5:
				statistikK->setAlphaFeldStärke( -5 );
				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
				statistik->setSichtbar( 0, 0 );
				historie->setSichtbar( 1, 0 );
				break;
			}
			historieK->setAlphaFeldStärke( -2 );
			historieK->setAlphaFeldFarbe( 0x3000FF00 );
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		if( !historie->getStatus() )
		{
			laden->setSichtbar( 0 );
			jetzt = nachher;
			nachher = 0;
		}
		break;
	}
	int tmp = suche->getAuswahlAccountId();
	if( tmp )
		setSpielerDetails( tmp, 2 );
	bool ret = rend;
	rend = 0;
	return ret;
}

void AccountAnsehen::doMausEreignis( MausEreignis &me )
{
	if( !sichtbar || animation || laden->istSichtbar() )
		return;
	int mx = me.mx;
	int my = me.my;
	me.mx -= pos.x;
	me.my -= pos.y;
	if( jetzt > 1 )
	{
		int ak = 0;
		bool tmp = me.verarbeitet;
		suchenK->doMausEreignis( me );
		ak = me.verarbeitet ? 1 : 0;
		aktivitätK->doMausEreignis( me );
		ak = me.verarbeitet && !ak ? 2 : ak;
		spieleUndKartenK->doMausEreignis( me );
		ak = me.verarbeitet && !ak ? 3 : ak;
		spielPartnerK->doMausEreignis( me );
		ak = me.verarbeitet && !ak ? 4 : ak;
		statistikK->doMausEreignis( me );
		ak = me.verarbeitet && !ak ? 5 : ak;
		historieK->doMausEreignis( me );
		ak = me.verarbeitet && !ak ? 6 : ak;
		if( tmp )
			ak = 0;
		if( me.id == ME_RLinks )
		{
			switch( ak )
			{
			case 1: // Suchen Klick
				if( jetzt == 1 )
					break;
				switch( jetzt )
				{
				case 2:
					aktivitätK->setAlphaFeldStärke( -5 );
					aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
					aktivität->setSichtbar( 0, 1 );
					break;
				case 3:
					spieleUndKartenK->setAlphaFeldStärke( -5 );
					spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
					spieleUndKarten->setSichtbar( 0, 1 );
					break;
				case 4:
					spielPartnerK->setAlphaFeldStärke( -5 );
					spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
					partner->setSichtbar( 0, 1 );
					break;
				case 5:
					statistikK->setAlphaFeldStärke( -5 );
					statistikK->setAlphaFeldFarbe( 0x5500FF00 );
					statistik->setSichtbar( 0, 1 );
					break;
				case 6:
					historieK->setAlphaFeldStärke( -5 );
					historieK->setAlphaFeldFarbe( 0x5500FF00 );
					historie->setSichtbar( 0, 1 );
					break;
				}
				suchenK->setAlphaFeldStärke( -2 );
				suchenK->setAlphaFeldFarbe( 0x3000FF00 );
				this->suche->setSichtbar( 1 );
				jetzt = 1;
				break;
			case 2: // Aktivität Klick
				setSpielerDetails( account, 2 );
				break;
			case 3: // SpieleUndKarten Klick
				setSpielerDetails( account, 3 );
				break;
			case 4: // SpielPartner Klick
				setSpielerDetails( account, 4 );
				break;
			case 5: // Statistik Klick
				setSpielerDetails( account, 5 );
				break;
			case 6: // Historie Klick
				setSpielerDetails( account, 6 );
				break;
			}
		}
	}
	switch( jetzt )
	{
	case 1: // Suchen
		suche->doMausEreignis( me );
		break;
	case 3: // SpieleUndKarten
		spieleUndKarten->doMausEreignis( me );
		break;
	case 4: // SpielPartner
		partner->doMausEreignis( me );
		break;
	case 5: // Statistik
		statistik->doMausEreignis( me );
		break;
	case 6: // Historie
		historie->doMausEreignis( me );
		break;
	}
	me.mx = mx;
	me.my = my;
}

void AccountAnsehen::doTastaturEreignis( TastaturEreignis &te )
{
	if( !sichtbar || animation || laden->istSichtbar() )
		return;
	switch( jetzt )
	{
	case 1: // Suchen
		suche->doTastaturEreignis( te );
		break;
	case 6: // Historie
		historie->doTastaturEreignis( te );
		break;
	}
}

void AccountAnsehen::render( Bild &zRObj )
{
	if( pos == pos1 )
		return;
	if( !zRObj.setDrawOptions( pos, gr ) )
		return;
	rahmen->setGröße( gr );
	rahmen->render( zRObj );
	int rbr = rahmen->getRBreite();
	zRObj.setAlpha( (unsigned char)alpha );
	zRObj.setAlpha( (unsigned char)alpha2 );
	zRObj.addScrollOffset( -knopfX, 0 );
	aktivitätK->render(zRObj );
	historieK->render( zRObj );
	spieleUndKartenK->render( zRObj );
	spielPartnerK->render( zRObj );
	statistikK->render( zRObj );
	suchenK->render( zRObj );
	zRObj.addScrollOffset( knopfX, 0 );
	suche->render( zRObj );
	aktivität->render( zRObj );
	spieleUndKarten->render( zRObj );
	partner->render( zRObj );
	statistik->render( zRObj );
	historie->render( zRObj );
	zRObj.releaseAlpha();
	laden->render( zRObj );
	zRObj.releaseAlpha();
	zRObj.releaseDrawOptions();
}

// constant
bool AccountAnsehen::istAnimiert() const
{
	return animation != 0;
}

bool AccountAnsehen::istSichtbar() const
{
	return sichtbar || prozent1 != 0;
}

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

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