#include "NachLogin.h"
#include <Schrift.h>
#include <Bildschirm.h>
#include <DateiSystem.h>
#include <Text.h>
#include "../Global/Variablen.h"

// Inhalt der NachLogin Klasse aus NachLogin.h
// Konstruktor
NachLogin::NachLogin( Schrift *zSchrift, Bildschirm *zBildschirm )
	: Zeichnung()
{
	if( zSchrift )
		schrift = zSchrift->getThis();
	if( zBildschirm )
		bildschirm = zBildschirm->getThis();
	fenster = 0;
	titel = 0;
	freunde = 0;
	chatLeiste = 0;
	nachrichtenListe = 0;
	spielenFenster = 0;
	shopFenster = 0;
	accountAnsehenFenster = 0;
	mgFenster = 0;
	newsFenster = 0;
	editorFenster = 0;
	spielAufzeichnung = 0;
    editor = 0;
	op = 0;
	status = NLALogin;
	ref = 1;
}

// Destruktor
NachLogin::~NachLogin()
{
	if( fenster )
		setAnzeige( NLALogin );
	if( schrift )
		schrift = schrift->release();
	if( bildschirm )
		bildschirm = bildschirm->release();
}

// nicht constant
void NachLogin::login() // Initialisiert die Oberfläche
{
	lockZeichnung();
	if( fenster )
		logout();
	fenster = new Fenster();
	fenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
	fenster->setGröße( bildschirm->getBackBufferGröße() );
	leistenFenster = new Fenster();
	leistenFenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar | Fenster::Style::METransparenz );
	leistenFenster->setGröße( bildschirm->getBackBufferGröße() );
	titel = new TitelLeiste( leistenFenster, schrift );
	spielenFenster = new Spiele( schrift, fenster, titel->getSpielenX() );
	shopFenster = new Shop( schrift, fenster, titel->getSpielenX() + 101 );
	accountAnsehenFenster = new AccountAnsehen( schrift, fenster, titel->getSpielenX() + 202 );
	mgFenster = new MiniGames( schrift, fenster, titel->getSpielenX() + 303 );
	newsFenster = new Neuigkeiten( schrift, fenster, titel->getSpielenX() + 404 );
	editorFenster = new Editor( schrift, fenster, titel->getSpielenX() );
	nachrichtenListe = new NachrichtenListe( schrift, leistenFenster );
	freunde = new FreundesListe( schrift, leistenFenster );
	chatLeiste = new ChatLeiste( schrift, leistenFenster );
	op = new Einstellungen( schrift, leistenFenster );
	imSpiel = new ImSpiel( schrift );
	fenster->addMember( leistenFenster );
	bildschirm->addMember( this );
	MausEreignis me;
	me.id = ME_RLinks;
	bildschirm->lock();
	titel->druckSpielen( me );
	bildschirm->unlock();
	status = NLANormal;
	unlockZeichnung();
}

void NachLogin::logout() // Setzt die Oberfläche zurück
{
	lockZeichnung();
	status = NLALogin;
	if( bildschirm )
		bildschirm->removeMember( this );
	if( spielenFenster )
		spielenFenster = spielenFenster->release();
	if( shopFenster )
		shopFenster = shopFenster->release();
	if( accountAnsehenFenster )
		accountAnsehenFenster = accountAnsehenFenster->release();
	if( mgFenster )
		mgFenster = mgFenster->release();
	if( newsFenster )
		newsFenster = newsFenster->release();
	if( editorFenster )
		editorFenster = editorFenster->release();
	if( titel )
		titel = titel->release();
	if( freunde )
		freunde = freunde->release();
	if( chatLeiste )
		chatLeiste = chatLeiste->release();
	if( nachrichtenListe )
		nachrichtenListe = nachrichtenListe->release();
	if( leistenFenster )
		leistenFenster = leistenFenster->release();
	if( fenster )
		fenster = fenster->release();
	if( imSpiel )
		imSpiel = imSpiel->release();
	if( op )
		op->release();
	unlockZeichnung();
}

void NachLogin::setSpielAufzeichnung( AufzeichnungV *video ) // Setzt die Spiel Aufzeichnung
{
	spielAufzeichnung = video;
}

void NachLogin::setEditor( EditorV *editor ) // Setzt die Spiel Aufzeichnung
{
    this->editor = editor;
}

void NachLogin::setAnzeige( NachLoginAnzeige s ) // Setzt den Status des Programms
{
	lockZeichnung();
	if( s == NLAImSpiel )
	{
		imSpiel->setSichtbar( 1 );
		MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
		leistenFenster->doMausEreignis( me );
		leistenFenster->löscheStyle( Fenster::Style::Sichtbar );
		fenster->removeMember( leistenFenster );
		bildschirm->addMember( leistenFenster );
		titel->setImSpiel( 1 );
	}
	else if( status == NLAImSpiel )
	{
		imSpiel->setSichtbar( 0 );
		fenster->addMember( leistenFenster );
		bildschirm->removeMember( leistenFenster );
		leistenFenster->addStyle( Fenster::Style::Sichtbar );
		titel->setImSpiel( 0 );
	}
	if( s == NLASpielVideo )
	{
		MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
		leistenFenster->doMausEreignis( me );
		leistenFenster->löscheStyle( Fenster::Style::Sichtbar );
		fenster->removeMember( leistenFenster );
		bildschirm->addMember( leistenFenster );
		titel->setImVideo( 1 );
	}
	else if( status == NLASpielVideo )
	{
		fenster->addMember( leistenFenster );
		bildschirm->removeMember( leistenFenster );
		leistenFenster->addStyle( Fenster::Style::Sichtbar );
		spielAufzeichnung = spielAufzeichnung->release();
		titel->setImVideo( 0 );
	}
    if( s == NLAEditor )
    {
        MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
        leistenFenster->doMausEreignis( me );
        leistenFenster->löscheStyle( Fenster::Style::Sichtbar );
        fenster->removeMember( leistenFenster );
        bildschirm->addMember( leistenFenster );
        titel->setImSpiel( 1 );
    }
    else if( status == NLAEditor )
    {
        fenster->addMember( leistenFenster );
        bildschirm->removeMember( leistenFenster );
        leistenFenster->addStyle( Fenster::Style::Sichtbar );
        editor = editor->release();
        titel->setImSpiel( 0 );
    }
	if( s == NLALogin )
		logout();
	else
	{
		if( !fenster )
			login();
		else
			status = s;
	}
	unlockZeichnung();
}

void NachLogin::doMausEreignis( MausEreignis &me )
{
	if( status == NLASpielVideo )
	{
		lockZeichnung();
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
			leistenFenster->doMausEreignis( me );
		else
		{
			spielAufzeichnung->doMausEreignis( me );
			if( spielAufzeichnung->hatVerlassen( 1 ) )
			{
				MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
				spielAufzeichnung->doMausEreignis( me );
				aktion = 8; // Aufzeichnung verlassen
			}
		}
		unlockZeichnung();
		return;
	}
    if( status == NLAEditor )
    {
        lockZeichnung();
        if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
            leistenFenster->doMausEreignis( me );
        else
        {
            editor->doMausEreignis( me );
            if( editor->hatVerlassen( 1 ) )
            {
                MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
                editor->doMausEreignis( me );
                aktion = 8; // Editor verlassen
            }
        }
        unlockZeichnung();
        return;
    }
	if( status == NLAImSpiel )
	{
		lockZeichnung();
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
			leistenFenster->doMausEreignis( me );
		else
			imSpiel->doMausEreignis( me );
		unlockZeichnung();
		return;
	}
	if( status != NLANormal )
		return;
	lockZeichnung();
	if( fenster )
		fenster->doMausEreignis( me );
	unlockZeichnung();
}

void NachLogin::doTastaturEreignis( TastaturEreignis &te )
{
	if( status == NLASpielVideo )
	{
		lockZeichnung();
		if( te.taste == T_F2 && te.id == TE_Release )
		{
			leistenFenster->setStyle( Fenster::Style::Sichtbar, !leistenFenster->hatStyle( Fenster::Style::Sichtbar ) );
			MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
			leistenFenster->doMausEreignis( me );
		}
		else
		{
			if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
				leistenFenster->doTastaturEreignis( te );
			else
				spielAufzeichnung->doTastaturEreignis( te );
		}
		unlockZeichnung();
		return;
	}
    if( status == NLAEditor )
    {
        lockZeichnung();
        if( te.taste == T_F2 && te.id == TE_Release )
        {
            leistenFenster->setStyle( Fenster::Style::Sichtbar, !leistenFenster->hatStyle( Fenster::Style::Sichtbar ) );
            MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
            leistenFenster->doMausEreignis( me );
        }
        else
        {
            if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
                leistenFenster->doTastaturEreignis( te );
            else
                editor->doTastaturEreignis( te );
        }
        unlockZeichnung();
        return;
    }
	if( status == NLAImSpiel )
	{
		lockZeichnung();
		if( te.taste == T_F2 && te.id == TE_Release )
		{
			leistenFenster->setStyle( Fenster::Style::Sichtbar, !leistenFenster->hatStyle( Fenster::Style::Sichtbar ) );
			MausEreignis me = { ME_Bewegung, -1, -1, -1, -1, 0 };
			leistenFenster->doMausEreignis( me );
		}
		else
		{
			if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
				leistenFenster->doTastaturEreignis( te );
			else
				imSpiel->doTastaturEreignis( te );
		}
		unlockZeichnung();
		return;
	}
	if( status != NLANormal )
		return;
	lockZeichnung();
	if( fenster )
		fenster->doTastaturEreignis( te );
	unlockZeichnung();
}

bool NachLogin::tick( double tickVal )
{
	if( status == NLASpielVideo )
	{
		lockZeichnung();
		bool ret = 0;
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
			ret |= leistenFenster->tick( tickVal );
		ret |= spielAufzeichnung->tick( tickVal );
		unlockZeichnung();
		return ret;
	}
    if( status == NLAEditor )
    {
        lockZeichnung();
        bool ret = 0;
        if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
            ret |= leistenFenster->tick( tickVal );
        ret |= editor->tick( tickVal );
        unlockZeichnung();
        return ret;
    }
	if( status == NLAImSpiel )
	{
		lockZeichnung();
		bool ret = 0;
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
			ret |= leistenFenster->tick( tickVal );
		ret |= imSpiel->tick( tickVal );
		unlockZeichnung();
		return ret;
	}
	if( status != NLANormal )
		return 0;
	lockZeichnung();
	bool ret = 0;
	if( titel )
		ret |= titel->tick();
	if( fenster )
		ret |= fenster->tick( tickVal );
	unlockZeichnung();
	return ret;
}

void NachLogin::render( Bild &zRObj )
{
	if( status == NLASpielVideo )
	{
		lockZeichnung();
		spielAufzeichnung->render( zRObj );
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
		    leistenFenster->render( zRObj );
		unlockZeichnung();
		return;
	}
    if( status == NLASpielVideo )
    {
        lockZeichnung();
        editor->render( zRObj );
        if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
            leistenFenster->render( zRObj );
        unlockZeichnung();
        return;
    }
	if( status == NLAImSpiel )
	{
		lockZeichnung();
		imSpiel->render( zRObj );
		if( leistenFenster->hatStyle( Fenster::Style::Sichtbar ) )
			leistenFenster->render( zRObj );
		unlockZeichnung();
		return;
	}
	if( status != NLANormal )
		return;
	lockZeichnung();
	if( fenster )
		fenster->render( zRObj );
	unlockZeichnung();
}

// constant
TitelLeiste *NachLogin::zTitelLeiste() const // gibt die Titelleiste zurück
{
	return titel;
}

FreundesListe *NachLogin::zFreundesListe() const // gibt die FreundesListe zurück
{
	return freunde;
}

ChatLeiste *NachLogin::zChatLeiste() const // gibt die ChatLeiste zurück
{
	return chatLeiste;
}

NachrichtenListe *NachLogin::zNachrichtenListe() const // gibt die NachrichtenListe zurück
{
	return nachrichtenListe;
}

Spiele *NachLogin::zSpielenFenster() const // gibt das Spiele Fenster zurück
{
	return spielenFenster;
}

Shop *NachLogin::zShopFenster() const // gibt das Shop Fenster zurück
{
	return shopFenster;
}

AccountAnsehen *NachLogin::zAccountAnsehenFenster() const // gibt das Account Ansehen Fenster zurück
{
	return accountAnsehenFenster;
}

MiniGames *NachLogin::zMGFenster() const // gibt das MiniGames Fenster zurück
{
	return mgFenster;
}

Neuigkeiten *NachLogin::zNewsFenster() const // gibt das News Fenster zurück
{
	return newsFenster;
}

Editor *NachLogin::zEditorFenster() const // gibt das News Fenster zurück
{
	return editorFenster;
}

ImSpiel *NachLogin::zImSpiel() const // Gibt das Im Spiel Zeichnung zurück
{
	return imSpiel;
}

Einstellungen *NachLogin::zEinstellungen() const // Gibt das Einstellungen Zeichnung zurück
{
	return op;
}

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

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