#include "Angemeldet.h"
#include <Punkt.h>
#include <Rahmen.h>
#include "..\..\..\Global\Initialisierung.h"
#include "..\..\..\Global\Variablen.h"

// Inhalt der AngemeldetFenster Klasse aus Angemeldet.h
// Konstruktor
AngemeldetFenster::AngemeldetFenster( Schrift *zSchrift )
{
    pos = Punkt( 10, 10 );
    gr = Punkt( 780, 480 );
    rahmen = new LRahmen();
    rahmen->setRamenBreite( 1 );
    rahmen->setFarbe( 0xFFFFFFFF );
    rahmen->setGröße( 780, 480 );
    spielName = initTextFeld( 290, 165, 200, 20, zSchrift, TextFeld::Style::Text, "" );
    karteName = initTextFeld( 290, 190, 200, 20, zSchrift, TextFeld::Style::Text, "" );
    zeit = initTextFeld( 290, 215, 200, 20, zSchrift, TextFeld::Style::Text, "Zeit in Warteschlange: " );
    abbrechen = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal, "abbrechen" );
    spielGefunden = initTextFeld( 340, 140, 100, 20, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Spiel gefunden" );
    warten = initTextFeld( 290, 240, 200, 20, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Warte auf andere Spieler" );
    beitreten = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "beitreten" );
    kick = initTextFeld( 190, 215, 400, 20, zSchrift, TextFeld::Style::Text & ~Knopf::Style::Sichtbar, "Du wurdest wegen Abwesenheit aus der Warteschlange entfernt." );
    ok = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "Zurück" );
    karteId = 0;
    gameId = 0;
    animation = 0;
    alpha = 0;
    aAlpha = 0;
    tickVal = 0;
    time = 0;
    status = 0;
    rend = 0;
    ref = 1;
}

// Destruktor
AngemeldetFenster::~AngemeldetFenster()
{
    if( karteId && anmeldungKlient )
        anmeldungKlient->abmelden();
    rahmen->release();
    spielName->release();
    karteName->release();
    zeit->release();
    abbrechen->release();
    spielGefunden->release();
    warten->release();
    beitreten->release();
    kick->release();
    ok->release();
}

// nicht constant
bool AngemeldetFenster::setKarteId( int karteId )
{
    if( !anmeldungKlient )
        return 0;
    if( !karteId )
    {
        if( anmeldungKlient->abmelden() )
        {
            this->karteId = 0;
            return 1;
        }
        else
            return 0;
    }
    if( !anmeldungKlient->anmelden( karteId ) )
    {
        if( nachLogin && nachLogin->zNachrichtenListe() )
        {
            if( anmeldungKlient->getLetzterFehler() )
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                              new Text( anmeldungKlient->getLetzterFehler() ),
                                                              new Text( "Ok" ),
                                                              0,
                                                              NachrichtType::nachricht,
                                                              0
                                                              );
            }
            else
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                              new Text( "Fehler beim anmelden." ),
                                                              new Text( "Ok" ),
                                                              0,
                                                              NachrichtType::nachricht,
                                                              0
                                                              );
            }
        }
        return 0;
    }
    else
    {
        time = 0;
        this->karteId = karteId;
        if( infoKlient )
        {
            Text *sN = infoKlient->getSpielName( infoKlient->getSpielId( karteId ) );
            Text *kN = infoKlient->getKarteName( karteId );
            if( sN )
            {
                spielName->setText( "Spiel: " );
                spielName->zText()->anhängen( sN );
            }
            if( kN )
            {
                karteName->setText( "Karte: " );
                karteName->zText()->anhängen( kN );
            }
        }
        rend = 1;
        return 1;
    }
}

void AngemeldetFenster::setSichtbar( bool sichtbar )
{
    if( sichtbar )
    {
        status = 1;
        spielName->addStyle( TextFeld::Style::Sichtbar );
        karteName->addStyle( TextFeld::Style::Sichtbar );
        zeit->addStyle( TextFeld::Style::Sichtbar );
        abbrechen->addStyle( Knopf::Style::Sichtbar );
        spielGefunden->löscheStyle( TextFeld::Style::Sichtbar );
        warten->löscheStyle( TextFeld::Style::Sichtbar );
        beitreten->löscheStyle( Knopf::Style::Sichtbar );
        kick->löscheStyle( TextFeld::Style::Sichtbar );
        ok->löscheStyle( Knopf::Style::Sichtbar );
        animation |= 0x1 | 0x4;
    }
    else
    {
        animation &= ~( 0x1 | 0x4 | 0x8 );
        status = 0;
    }
    rend = 1;
}

void AngemeldetFenster::setSpielGefunden()
{
    status = 2;
    spielName->addStyle( TextFeld::Style::Sichtbar );
    karteName->addStyle( TextFeld::Style::Sichtbar );
    zeit->addStyle( TextFeld::Style::Sichtbar );
    abbrechen->löscheStyle( Knopf::Style::Sichtbar );
    spielGefunden->addStyle( TextFeld::Style::Sichtbar );
    warten->löscheStyle( TextFeld::Style::Sichtbar );
    beitreten->addStyle( Knopf::Style::Sichtbar );
    kick->löscheStyle( TextFeld::Style::Sichtbar );
    ok->löscheStyle( Knopf::Style::Sichtbar );
    rend = 1;
}

void AngemeldetFenster::setVerbleibendeZeit( int sekunden )
{
    if( time != sekunden )
    {
        time = sekunden;
        rend = 1;
    }
}

void AngemeldetFenster::spielGefundenAbbruch()
{
    status = 4;
    spielName->löscheStyle( TextFeld::Style::Sichtbar );
    karteName->löscheStyle( TextFeld::Style::Sichtbar );
    zeit->löscheStyle( TextFeld::Style::Sichtbar );
    abbrechen->löscheStyle( Knopf::Style::Sichtbar );
    spielGefunden->löscheStyle( TextFeld::Style::Sichtbar );
    warten->löscheStyle( TextFeld::Style::Sichtbar );
    beitreten->löscheStyle( Knopf::Style::Sichtbar );
    kick->addStyle( TextFeld::Style::Sichtbar );
    ok->addStyle( Knopf::Style::Sichtbar );
    rend = 1;
}

void AngemeldetFenster::zurückInWarteschlange( int stunden, int minuten, int sekunden )
{
    time = sekunden + minuten * 60 + stunden * 60 * 60;
    status = 1;
    spielName->addStyle( TextFeld::Style::Sichtbar );
    karteName->addStyle( TextFeld::Style::Sichtbar );
    zeit->addStyle( TextFeld::Style::Sichtbar );
    abbrechen->addStyle( Knopf::Style::Sichtbar );
    spielGefunden->löscheStyle( TextFeld::Style::Sichtbar );
    warten->löscheStyle( TextFeld::Style::Sichtbar );
    beitreten->löscheStyle( Knopf::Style::Sichtbar );
    kick->löscheStyle( TextFeld::Style::Sichtbar );
    ok->löscheStyle( Knopf::Style::Sichtbar );
    rend = 1;
}

bool AngemeldetFenster::tick( double tickVal )
{
    rend |= spielName->tick( tickVal );
    rend |= karteName->tick( tickVal );
    rend |= zeit->tick( tickVal );
    rend |= abbrechen->tick( tickVal );
    rend |= spielGefunden->tick( tickVal );
    rend |= warten->tick( tickVal );
    rend |= beitreten->tick( tickVal );
    rend |= kick->tick( tickVal );
    rend |= ok->tick( tickVal );
    if( status == 2 || status == 3 )
    {
        Text txt = "Verbleibende Zeit: ";
        txt += (int)( time / 60 / 60 );
        txt += ":";
        txt += ( (int)( time / 60 ) % 60 );
        txt += ":";
        txt += (int)time % 60;
        if( !zeit->zText()->istGleich( txt ) )
            zeit->setText( txt );
    }
    if( status == 1 )
        time += tickVal;
    this->tickVal += tickVal * 750;
    int val = ( int )this->tickVal;
    if( val < 1 )
    {
        bool ret = rend;
        rend = 0;
        return ret;
    }
    if( val > 25 )
        val = 25;
    this->tickVal -= val;
    if( val )
    {
        if( ( animation | 0x4 ) == animation )
        {
            if( status == 1 )
            {
                if( !alpha )
                    time = 0;
                Text txt = "Zeit in Warteschlange: ";
                txt += (int)( time / 60 / 60 );
                txt += ":";
                txt += ( (int)( time / 60 ) % 60 );
                txt += ":";
                txt += (int)time % 60;
                if( !zeit->zText()->istGleich( txt ) )
                    zeit->setText( txt );
            }
            if( alpha + ( val / 3 ) > 255 )
                alpha = 255;
            else
            {
                alpha += ( val / 3 );
                rend = 1;
            }
        }
        else
        {
            if( alpha - ( val / 2 ) < 0 )
                alpha = 0;
            else
            {
                alpha -= ( val / 2 );
                rend = 1;
            }
        }
        if( ( animation | 0x1 ) == animation ) // sichtbar
        {
            if( aAlpha != 255 )
            {
                if( aAlpha + val > 255 )
                    aAlpha = 255;
                else
                    aAlpha += val;
                rend = 1;
            }
        }
        else // unsichtbar
        {
            if( aAlpha != 0 )
            {
                if( aAlpha - val < 0 )
                    aAlpha = 0;
                else
                    aAlpha -= val;
                rend = 1;
            }
        }
    }
    bool ret = rend;
    rend = 0;
    return ret;
}

void AngemeldetFenster::doMausEreignis( MausEreignis &me )
{
    me.mx -= pos.x;
    me.my -= pos.y;
    bool ak = !me.verarbeitet;
    abbrechen->doMausEreignis( me );
    int aktion = ( abbrechen->hatStyle( Knopf::Style::Sichtbar ) && ak && me.verarbeitet ) ? 1 : 0;
    beitreten->doMausEreignis( me );
    aktion = ( beitreten->hatStyle( Knopf::Style::Sichtbar ) && ak && me.verarbeitet && !aktion ) ? 2 : aktion;
    ok->doMausEreignis( me );
    aktion = ( ok->hatStyle( Knopf::Style::Sichtbar ) && ak && me.verarbeitet && !aktion ) ? 3 : aktion;
    if( me.id == ME_RLinks )
    {
        switch( aktion )
        {
        case 1: // abbrechen
            if( anmeldungKlient && anmeldungKlient->abmelden() )
                if( nachLogin && nachLogin->zSpielenFenster() )
                    nachLogin->zSpielenFenster()->anmeldungAbbrechen();
            break;
        case 2: // beitreten
            if( spielKlient->spielErstelltAnnehmen() )
            {
                status = 3;
                spielName->addStyle( TextFeld::Style::Sichtbar );
                karteName->addStyle( TextFeld::Style::Sichtbar );
                zeit->addStyle( TextFeld::Style::Sichtbar );
                abbrechen->löscheStyle( Knopf::Style::Sichtbar );
                spielGefunden->addStyle( TextFeld::Style::Sichtbar );
                warten->addStyle( TextFeld::Style::Sichtbar );
                beitreten->löscheStyle( Knopf::Style::Sichtbar );
                kick->löscheStyle( TextFeld::Style::Sichtbar );
                ok->löscheStyle( Knopf::Style::Sichtbar );
                rend = 1;
            }
            else if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( spielKlient->getLetzterFehler() ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
            break;
        case 3: // Zurück
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->anmeldungAbbrechen();
            break;
        }
    }
    me.mx += pos.x;
    me.my += pos.y;
}

void AngemeldetFenster::render( Bild &zrObj )
{
    int x = pos.x;
    int y = pos.y;
    int br = gr.x;
    int hö = gr.y;
    if( !zrObj.setDrawOptions( x, y, br, br ) )
        return;
    zrObj.setAlpha( aAlpha );
    rahmen->render( zrObj );
    zrObj.setAlpha( alpha );
    spielName->render( zrObj );
    karteName->render( zrObj );
    zeit->render( zrObj );
    abbrechen->render( zrObj );
    spielGefunden->render( zrObj );
    warten->render( zrObj );
    beitreten->render( zrObj );
    kick->render( zrObj );
    ok->render( zrObj );
    zrObj.releaseAlpha();
    zrObj.releaseDrawOptions();
    zrObj.releaseAlpha();
}

int AngemeldetFenster::getAktion()
{
    int ret = aktion;
    aktion = 0;
    return ret;
}

// constant
int AngemeldetFenster::getKarteId() const
{
    return karteId;
}

// Reference Countong
AngemeldetFenster *AngemeldetFenster::getThis()
{
    ref++;
    return this;
}

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