#include "AccountAktivität.h"
#include "../../../Global/Initialisierung.h"
#include "../../../Global/Variablen.h"

// Inhalt der AccountAktivität Klasse aus AccountAktivität.h
// Konstruktor
AccountAktivität::AccountAktivität( Schrift *zSchrift )
	: Thread(),
  aktivitätF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Aktivität von " ) ),
  online( initLinienDiagramm( 10, 10, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ),
  spiele( initLinienDiagramm( 10, 220, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ),
  status( 0 ),
  accId( 0 ),
  animation( 0 ),
  alpha( 255 ),
  tickVal( 0 ),
  rend( 0 ),
  ref( 1 )
{
	online->setHIntervallBreite( 36.8 );
	spiele->setVIntervallHöhe( 36.8 );
	online->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
	spiele->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
	online->setRasterDicke( 1 );
	spiele->setRasterDicke( 1 );
	online->setRasterFarbe( 0xFF505050 );
	spiele->setRasterFarbe( 0xFF505050 );
	online->setHIntervallFarbe( 0xFFFFFFFF );
	spiele->setHIntervallFarbe( 0xFFFFFFFF );
	online->setHIntervallName( "Tage" );
	spiele->setHIntervallName( "Tage" );
	online->setVIntervallFarbe( 0xFFFFFFFF );
	spiele->setVIntervallFarbe( 0xFFFFFFFF );
	online->setVIntervallName( "Stunden" );
	spiele->setVIntervallName( "Spiele" );
	aktivitätF->addMember( online );
	aktivitätF->addMember( spiele );
}

// Destruktor
AccountAktivität::~AccountAktivität()
{
	if( run )
	{
		warteAufThread( 1000 );
		ende();
	}
	aktivitätF->release();
	online->release();
	spiele->release();
}

// nicht constant
void AccountAktivität::reset()
{
	int wAnz = online->zDiagDaten()->werte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		online->removeWert( 0 );
	wAnz = spiele->zDiagDaten()->werte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		spiele->removeWert( 0 );
	wAnz = online->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		online->löscheHIntervallText( online->zDiagDaten()->hIntervallWerte->get( 0 ) );
	wAnz = spiele->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		spiele->löscheHIntervallText( spiele->zDiagDaten()->hIntervallWerte->get( 0 ) );
	wAnz = online->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		online->löscheVIntervallText( online->zDiagDaten()->vIntervallWerte->get( 0 ) );
	wAnz = spiele->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
	for( int i = 0; i < wAnz; i++ )
		spiele->löscheVIntervallText( spiele->zDiagDaten()->vIntervallWerte->get( 0 ) );
}

void AccountAktivität::ladeStatistik( int accId )
{
	if( this->accId == accId )
		return;
	this->status = 0;
	if( run )
	{
		warteAufThread( 1000 );
		ende();
	}
	if( ( animation | 0x1 ) == animation )
	{
		animation |= 0x4;
		this->accId = accId;
		this->status = 1;
		return;
	}
	if( this->accId )
		reset();
	this->accId = accId;
	start();
	this->status = 1;
}

void AccountAktivität::thread()
{
	Text *name = infoKlient->getSpielerName( accId );
	if( name )
	{
		name->einfügen( 0, "Aktivität von " );
		aktivitätF->setTitel( *name );
		name->release();
	}
	RCArray< Text > *datum = new RCArray< Text >();
	Array< double > *stOnline = new Array< double >();
	Array< double > *stGespielt = new Array< double >();
	Array< int > *anzSpiele = new Array< int >();
	Array< int > *anzGewonnen = new Array< int >();
	if( infoKlient->getSpielerAktivität( accId, datum, stOnline, stGespielt, anzSpiele, anzGewonnen ) )
	{
		int anz = datum->getEintragAnzahl();
		double maxO = 0;
		int maxS = 0;
		for( int i = 0; i < anz; i++ )
		{
			if( stOnline->hat( i ) && stOnline->get( i ) > maxO )
				maxO = stOnline->get( i );
			if( stGespielt->hat( i ) && stGespielt->get( i ) > maxO )
				maxO = stGespielt->get( i );
			if( anzSpiele->hat( i ) && anzSpiele->get( i ) > maxS )
				maxS = anzSpiele->get( i );
			if( anzGewonnen->hat( i ) && anzGewonnen->get( i ) > maxS )
				maxS = anzGewonnen->get( i );
		}
		maxO += ( maxO / 100 ) * 10;
		maxS++;
		online->addVIntervallText( 0, "0" );
		online->addVIntervallText( (int)maxO + 1, Text() += (int)( maxO + 1 ) );
		spiele->addVIntervallText( 0, "0" );
		spiele->addVIntervallText( (int)maxS + 1, Text() += (int)( maxS + 1 ) );
		online->addHIntervallText( 0, datum->z( 0 )->getText() );
		online->addHIntervallText( anz - 1, datum->z( anz - 1 )->getText() );
		spiele->addHIntervallText( 0, datum->z( 0 )->getText() );
		spiele->addHIntervallText( anz - 1, datum->z( anz - 1 )->getText() );
		DiagWert *w = new DiagWert();
		w->farbe = 0xFF00FFFF;
		w->hintergrund = 0xFF205050;
		w->name->setText( "Zeit Online" );
		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
		online->addWert( w );
		w = new DiagWert();
		w->farbe = 0xFF00FF00;
		w->hintergrund = 0xFF205020;
		w->name->setText( "Zeit im Spiel" );
		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
		online->addWert( w );
		w = new DiagWert();
		w->farbe = 0xFF00FFFF;
		w->hintergrund = 0xFF205050;
		w->name->setText( "Spiele am Tag" );
		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
		spiele->addWert( w );
		w = new DiagWert();
		w->farbe = 0xFF00FF00;
		w->hintergrund = 0xFF205020;
		w->name->setText( "Gewonnene Spiele" );
		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
		spiele->addWert( w );
		for( int i = 0; i < anz; i++ )
		{
			online->addPunkt( 0, i, stOnline->get( i ) );
			online->addPunkt( 1, i, stGespielt->get( i ) );
			spiele->addPunkt( 0, i, anzSpiele->get( i ) );
			spiele->addPunkt( 1, i, anzGewonnen->get( i ) );
		}
	}
	else
		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Aktivität des Spielers konnte nicht ermittelt werden." ), new Text( "Ok" ) );
	datum->release();
	stOnline->release();
	stGespielt->release();
	anzSpiele->release();
	anzGewonnen->release();
	animation &= ~0x4;
	status = 2;
	run = 0;
}

void AccountAktivität::setSichtbar( bool sichtbar, bool nachRechts )
{
	if( sichtbar )
	{
		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
		{
			if( nachRechts )
				aktivitätF->setPosition( -810, 40 );
			else
				aktivitätF->setPosition( 810, 40 );
		}
		animation |= 0x1;
	}
	else
		animation &= ~0x1;
	if( nachRechts )
		animation |= 0x2;
	else
		animation &= ~0x2;
}

bool AccountAktivität::tick( double zeit )
{
	rend |= aktivitätF->tick( zeit );
	tickVal += zeit;
	int valA = (int)( tickVal * 150 );
	int valB = (int)( tickVal * 500 );
	tickVal -= valA / 150.0;
	if( valA )
	{
		if( ( animation | 0x4 ) == animation && alpha )
		{
			if( alpha - valA <= 0 )
				alpha = 0;
			else
				alpha -= valA;
			rend = 1;
			if( !alpha )
			{
				reset();
				start();
			}
		}
		if( ( animation | 0x4 ) != animation && alpha != 255 )
		{
			if( alpha + valA >= 255 )
				alpha = 255;
			else
				alpha += valA;
			rend = 1;
		}
	}
	if( valB )
	{
		if( ( animation | 0x1 ) == animation )
		{ // Sichtbar
			if( ( animation | 0x2 ) == animation )
			{ // Nach Rechts
				if( aktivitätF->getX() != 10 )
				{
					if( aktivitätF->getX() + valB > 10 )
						aktivitätF->setPosition( 10, aktivitätF->getY() );
					else
						aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
					rend = 1;
				}
			}
			else
			{ // Nach Links
				if( aktivitätF->getX() != 10 )
				{
					if( aktivitätF->getX() - valB < 10 )
						aktivitätF->setPosition( 10, aktivitätF->getY() );
					else
						aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
					rend = 1;
				}
			}
		}
		else
		{ // Unsichtbar
			if( ( animation | 0x2 ) == animation )
			{ // Nach Rechts
				if( aktivitätF->getX() != 810 )
				{
					if( aktivitätF->getX() + valB > 810 )
						aktivitätF->setPosition( 810, aktivitätF->getY() );
					else
						aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
					rend = 1;
				}
			}
			else
			{ // Nach Links
				if( aktivitätF->getX() != -810 )
				{
					if( aktivitätF->getX() - valB < -810 )
						aktivitätF->setPosition( -810, aktivitätF->getY() );
					else
						aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
					rend = 1;
				}
			}
		}
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void AccountAktivität::render( Bild &zRObj )
{
	zRObj.setAlpha( alpha );
	aktivitätF->render( zRObj );
	zRObj.releaseAlpha();
}

// constant
int AccountAktivität::getStatus() const
{
	return status;
}

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

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