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

// Inhalt der Shop Klasse aus Shop.h
// Konstruktor
Shop::Shop( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
	: Zeichnung()
{
	bildschirmGröße = BildschirmGröße();
	pos = Punkt( x, 67 );
	gr = Punkt( 102, 32 );
	rahmen = new LRahmen();
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setGröße( 102, 32 );
	spiele = initKnopf( 10, 10, 100, 30, zSchrift, Knopf::Style::Sichtbar, "Spiele" );
	spiele->setLinienRahmenBreite( 2 );
	spiele->setAlphaFeldFarbe( 0xFF000000 );
	spiele->setAlphaFeldStärke( 20 );
	initToolTip( spiele, "Shop nach Spielen durchsuchen.", zSchrift->getThis(), hauptScreen );
	karten = initKnopf( 120, 10, 100, 30, zSchrift, Knopf::Style::Sichtbar, "Karten" );
	initToolTip( karten, "Shop nach Karten durchsuchen.", zSchrift->getThis(), hauptScreen );
	alpha = 0;
	animation = 0;
	sichtbar = 0;
	tickVal = 0;
	jetzt = 0;
	prozent1 = 0;
	prozent2 = 0;
	begPos = Punkt( 0, 0 );
	begGröße = Punkt( 0, 0 );
	größe1 = Punkt( 102, 32 );
	pos1 = Punkt( x, 67 );
	größe2 = Punkt( 800, 500 );
	pos2 = bildschirmGröße / 2 - größe2 / 2;
	zNachLoginFenster->addMember( this );
	spielKaufen = new SpieleKaufen( zSchrift );
	karteKaufen = new KartenKaufen( zSchrift );
	ref = 1;
}

// Destruktor
Shop::~Shop()
{
	rahmen->release();
	spiele->release();
	karten->release();
	spielKaufen->release();
	karteKaufen->release();
}

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

bool Shop::tick( double tickVal )
{
	rend |= spiele->tick( tickVal );
	rend |= karten->tick( tickVal );
	rend |= spielKaufen->tick( tickVal );
	rend |= karteKaufen->tick( tickVal );
	this->tickVal += tickVal * 150;
	int val = ( int )this->tickVal;
	if( val < 1 )
	{
		bool ret = rend;
		rend = 0;
		return ret;
	}
	this->tickVal -= val;
	if( ( animation | 0x1 ) == animation ) // Einblenden
	{
		if( prozent1 != 100 )
		{
			prozent1 += val;
			if( prozent1 >= 100 )
			{
				prozent1 = 100;
				if( !jetzt )
				{
					spielKaufen->setSichtbar( 1 );
					jetzt = 1;
				}
			}
			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;
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void Shop::doMausEreignis( MausEreignis &me )
{
	if( !sichtbar )
		return;
	if( animation )
		return;
	int mx = me.mx;
	int my = me.my;
	me.mx -= pos.x;
	me.my -= pos.y;
	int ak = 0;
	bool tmp = me.verarbeitet;
	spiele->doMausEreignis( me );
	ak = me.verarbeitet ? 1 : 0;
	karten->doMausEreignis( me );
	ak = me.verarbeitet && !ak ? 2 : ak;
	if( tmp )
		ak = 0;
	if( me.id == ME_RLinks )
	{
		switch( ak )
		{
		case 1: // spiele Klick
			if( jetzt == 1 )
				break;
			karten->setLinienRahmenBreite( 1 );
			karten->setAlphaFeldFarbe( 0x5500FF00 );
			karten->setAlphaFeldStärke( -5 );
			spiele->setLinienRahmenBreite( 2 );
			spiele->setAlphaFeldFarbe( 0xFF000000 );
			spiele->setAlphaFeldStärke( 20 );
			karteKaufen->setSichtbar( 0 );
			spielKaufen->setSichtbar( 1 );
			jetzt = 1;
			break;
		case 2: // karten Klick
			if( jetzt == 2 || jetzt == 3 )
				break;
			spiele->setLinienRahmenBreite( 1 );
			spiele->setAlphaFeldFarbe( 0x5500FF00 );
			spiele->setAlphaFeldStärke( -5 );
			karten->setLinienRahmenBreite( 2 );
			karten->setAlphaFeldFarbe( 0xFF000000 );
			karten->setAlphaFeldStärke( 20 );
			spielKaufen->setSichtbar( 0 );
			karteKaufen->setSichtbar( 1 );
			jetzt = 2;
			break;
		}
	}
	switch( jetzt )
	{
	case 1: // Spiel kaufen
		spielKaufen->doMausEreignis( me );
		break;
	case 2: // Karten kaufen
		karteKaufen->doMausEreignis( me );
		break;
	}
	me.mx = mx;
	me.my = my;
}

void Shop::doTastaturEreignis( TastaturEreignis &te )
{
	if( !sichtbar )
		return;
	switch( jetzt )
	{
	case 1: // Spiel kaufen
		spielKaufen->doTastaturEreignis( te );
		break;
	case 2: // Karten kaufen
		karteKaufen->doTastaturEreignis( te );
		break;
	}
}

void Shop::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 );
	spiele->render( zRObj );
	karten->render( zRObj );
	spielKaufen->render( zRObj );
	karteKaufen->render( zRObj );
	zRObj.releaseAlpha();
	zRObj.releaseDrawOptions();
}

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

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

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

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