#include "HistorieStatistik.h"
#include <Knopf.h>
#include <MausEreignis.h>
#include <Bildschirm.h>
#include "../Initialisierung/Initialisierung.h"
#include <InitDatei.h>
#include <DateiSystem.h>
//#include "StatistikLeser.h"

// Inhalt der HistorieStatistik Klasse aus HistorieStatistik.h
// Konstruktor
HistorieStatistik::HistorieStatistik()
{
	schrift = 0;
	screen = 0;
	gss = new Array< SSDSpieler* >();
	gts = new Array< SSDTeam* >();
	tabelle = 0;
	fertig = 0;
	geladen = 0;
	geschlossen = 0;
	alpha = 0;
	sichtbar = 0;
	tickVal = 0;
	rend = 0;
	ref = 1;
}

// Destruktor
HistorieStatistik::~HistorieStatistik()
{
	if( schrift )
		schrift->release();
	if( screen )
		screen->release();
	if( !geladen )
	{
		gss->release();
		gts->release();
	}
	else
	{
		int anz = gss->getEintragAnzahl();
		for( int i = 0; i < anz; i++ )
		{
			if( gss->hat( i ) )
				delete gss->get( i );
		}
		gss->release();
		anz = gts->getEintragAnzahl();
		for( int i = 0; i < anz; i++ )
		{
			if( gts->hat( i ) )
				delete gts->get( i );
		}
		gts->release();
	}
	if( tabelle )
		tabelle->release();
	if( fertig )
		fertig->release();
}

// nicht constant
void HistorieStatistik::setSchrift( Schrift *schrift )
{
	if( this->schrift )
		this->schrift->release();
	this->schrift = schrift;
}

void HistorieStatistik::setBildschirm( Bildschirm *screen )
{
	if( this->screen )
		this->screen->release();
	this->screen = screen;
}

void HistorieStatistik::ladeDaten( int spielId )
{
	if( geladen )
		return;
	//StatistikLeser *reader = new StatistikLeser( spielId );
	//for( int i = 0; i < reader->getSpielerAnzahl(); i++ )
	//	gss->set( reader->getSSDGS( i ), i );
	//for( int i = 0; i < reader->getTeamAnzahl(); i++ )
	//	gts->set( reader->getSSDGT( i ), i );
	//reader->release();
	tabelle = new StatistikTabelle( gss->getThis(), gts->getThis(), schrift, screen, 1 );
	fertig = initKnopf( 600, 390, 100, 20, schrift, Knopf::Style::Sichtbar, "Zur�ck" );
	geladen = 1;
}

void HistorieStatistik::setSichtbar( bool sichtbar )
{
	this->sichtbar = sichtbar;
}

void HistorieStatistik::doMausEreignis( MausEreignis &me )
{
	if( !geladen )
		return;
    bool vera = me.verarbeitet;
    fertig->doMausEreignis( me );
    if( !vera && me.verarbeitet && me.id == ME_RLinks )
        geschlossen = 1;
	tabelle->doMausEreignis( me );
}

void HistorieStatistik::doTastaturEreignis( TastaturEreignis &te )
{
}

bool HistorieStatistik::tick( double tickVal )
{
	if( !geladen )
		return 0;
	rend |= tabelle->tick( tickVal );
	rend |= fertig->tick( tickVal );
	this->tickVal += tickVal * 150;
	int val = ( int )this->tickVal;
	this->tickVal -= val;
	if( val )
	{
		if( sichtbar && alpha != 255 )
		{
			if( alpha + val > 255 )
				alpha = 255;
			else
				alpha += val;
			rend = 1;
		}
		if( !sichtbar && alpha )
		{
			if( alpha - val < 0 )
				alpha = 0;
			else
				alpha -= val;
			rend = 1;
		}
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void HistorieStatistik::render( Bild &zRObj )
{
	if( !geladen )
		return;
	zRObj.setAlpha( alpha );
	tabelle->render( zRObj );
	fertig->render( zRObj );
	zRObj.releaseAlpha();
}

// constant
bool HistorieStatistik::istNochSichtbar() const
{
	return alpha != 0 || sichtbar;
}

bool HistorieStatistik::wurdeGeschlossen() const
{
	return geschlossen;
}

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

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