#include "Bestenliste.h"

// Inhalt der Bestenliste Klasse aus Bestenliste.h
// Konstruktor
Bestenliste::Bestenliste()
{
	spielerPunkte = new Array< int >();
	spielerNummern = new Array< int >();
	teamPunkte = new Array< int >();
	teamMaxPunkte = new Array< int >();
	teamNummern = new Array< int >();
	spielerAnzahl = 0;
	teamAnzahl = 0;
	ref = 1;
}

// Destruktor
Bestenliste::~Bestenliste()
{
	spielerPunkte->release();
	spielerNummern->release();
	teamPunkte->release();
	teamMaxPunkte->release();
	teamNummern->release();
}

// nicht constant
void Bestenliste::setTeamMaxPunkte( int team, int mP )
{
	int i = -1;
	for( int j = 0; j < teamAnzahl; j++ )
	{
		if( teamNummern->hat( j ) && teamNummern->get( j ) == team )
		{
			i = j;
			break;
		}
	}
	if( i < 0 )
	{
		i = teamAnzahl;
		teamNummern->add( team, teamAnzahl );
		teamPunkte->add( 0, teamAnzahl );
		teamMaxPunkte->add( 0, teamAnzahl );
		teamAnzahl++;
	}
	teamMaxPunkte->set( mP, i );
}

void Bestenliste::setTeamPunkte( int team, int p )
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
		{
			teamPunkte->set( p, i );
			return;
		}
	}
}

void Bestenliste::setSpielerPunkte( int spieler, int p )
{
	int i = -1;
	for( int j = 0; j < spielerAnzahl; j++ )
	{
		if( spielerNummern->hat( j ) && spielerNummern->get( j ) == spieler )
		{
			i = j;
			break;
		}
	}
	if( i < 0 )
	{
		i = spielerAnzahl;
		spielerNummern->add( spieler, spielerAnzahl );
		spielerPunkte->add( 0, spielerAnzahl );
		spielerAnzahl++;
	}
	spielerPunkte->set( p, i );
}

void Bestenliste::addTeamPunkt( int team, bool plus )
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
		{
			int jetzt = teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
			if( plus )
				jetzt++;
			else
				jetzt--;
			if( jetzt < 0 )
				jetzt = 0;
			teamPunkte->set( jetzt, i );
			return;
		}
	}
}

void Bestenliste::addSpielerPunkt( int spieler, bool plus )
{
	for( int i = 0; i < spielerAnzahl; i++ )
	{
		if( spielerNummern->hat( i ) && spielerNummern->get( i ) == spieler )
		{
			if( plus )
				spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) + 1, i );
			else
				spielerPunkte->set( ( spielerPunkte->hat( i ) ? spielerPunkte->get( i ) : 0 ) - 1, i );
			return;
		}
	}
}

// constant
bool Bestenliste::istTeamAmLeben( int team ) const
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
			return teamPunkte->hat( i ) && teamPunkte->get( i ) != 0;
	}
	return 0;
}

bool Bestenliste::hatTeamGewonnen( int team ) const
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
			return ( ( teamPunkte->hat( i ) && teamMaxPunkte->hat( i ) ) ? ( teamPunkte->get( i ) >= teamMaxPunkte->get( i ) ) : 0 );
	}
	return 0;
}

int Bestenliste::getTeamPunkte( int team ) const
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
			return teamPunkte->hat( i ) ? teamPunkte->get( i ) : 0;
	}
	return 0;
}

int Bestenliste::getTeamMaxPunkte( int team ) const
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teamNummern->hat( i ) && teamNummern->get( i ) == team )
			return teamMaxPunkte->hat( i ) ? teamMaxPunkte->get( i ) : 0;
	}
	return 0;
}

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

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