#include "SpielMessageProcessor.h"
#include "../Global/Variablen.h"

SpielMessageProcessor::SpielMessageProcessor()
    : Thread()
{
    start();
}

void SpielMessageProcessor::thread()
{
    KSGClient::SpielServerNachricht msg;
    msg.sts = new SpielerTeamStruktur();
    while( spielClient && spielClient->istVerbunden() && spielClient->getNextMessage( msg ) )
    {
        switch( msg.type )
        {
        case 0: // verbindung getrennt
            msg.sts->release();
            return;
        case 1: // verbleibende Zeit
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->spielGefundenZeitVerbleibend( msg.sekunden );
            break;
        case 2: // SpielErstellt abbruch
            if( nachLogin && nachLogin->zNachrichtenListe() )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Spiel Abgebrochen" ), msg.message.getThis(), new Text( "Ok" ), 0 );
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->spielGefundenAbbruch();
            break;
        case 3: // Fehler
            hauptScreen->lock();
            if( nachLogin && nachLogin->zNachrichtenListe() )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg.message.getThis(), new Text( "Ok" ), 0 );
            hauptScreen->unlock();
            break;
        case 4: // zur�ck in Warteschlange
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->zur�ckInWarteschlange( msg.stunden, msg.minuten, msg.sekunden );
            break;
        case 5: // Erstellung fortsetzen
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlBetreten();
            break;
        case 6: // SpielErstellt Initialisierung
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlInit( (SpielerTeamStruktur*)msg.sts );
            else
                msg.sts->release();
            msg.sts = new SpielerTeamStruktur();
            break;
        case 7: // SpielErstellt Spieler hinzugef�gt
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlAddSpieler( msg.accountId );
            break;
        case 8: // SpielErstellt Spieler entfernt
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlRemoveSpieler( msg.accountId );
            break;
        case 9: // SpielErstellt Spieler wechselt Team
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlSpielerWehseltTeam( msg.accountId, msg.spielerNummer );
            break;
        case 0xA: // SpielErstellt Chat Nachricht
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->teamAuswahlChatNachricht( msg.message );
            break;
        case 0xB: // Spiel gefunden
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->spielGefunden( msg.karteId );
            break;
        case 0xC: // Spiel Laden beginnen
            aktion = 5;
            break;
        case 0xD: // Spiel Laden Spieler hinzuf�gen
            if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
                nachLogin->zImSpiel()->lBAddSpieler( msg.accountId, msg.spielerNummer );
            break;
        case 0xE: // Spiel Laden Spieler Prozent
            if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
                nachLogin->zImSpiel()->lBSetSpielerProzent( msg.accountId, msg.prozent );
            break;
        case 0xF: // Spiel Laden Spieler Ping
            if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
                nachLogin->zImSpiel()->lBSetSpielerPing( msg.accountId, msg.ping );
            break;
        case 0x11: // Spiel Laden Fertig
            if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
                nachLogin->zImSpiel()->endLaden();
            break;
        case 0x12: // Spiel Nachricht
            if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
                nachLogin->zImSpiel()->spielNachricht( msg.l�n, msg.data );
            delete[] msg.data;
            break;
        case 0x13: // Statistik Nachricht
            if( nachLogin && nachLogin->zSpielenFenster() )
                nachLogin->zSpielenFenster()->statistikNachricht( msg.l�n, msg.data );
            delete[] msg.data;
            break;
        default: // Unbekannte Servernachricht
            if( nachLogin && nachLogin->zNachrichtenListe() )
            {
                hauptScreen->lock();
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                              new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
                                                              new Text( "Ok" ), 0 );
                hauptScreen->unlock();
            }
            break;
        }
    }
    msg.sts->release();
}