#include "TeamsEditor.h"
#include <Datei.h>
#include <DateiSystem.h>
#include <Bild.h>

// Inhalt der TeamsEditor Klasse aus TeamsEditor.h
// Konstruktor
TeamsEditor::TeamsEditor( int id, char *pf, EdSDatenbank *db )
{
    pfad = pf;
    pfad += "/live/map";
    fehler = "";
    this->id = id;
    this->db = db;
    ref = 1;
}

// Destruktor
TeamsEditor::~TeamsEditor()
{
    db->release();
}

// nicht constant
bool TeamsEditor::prozessMessage( SKlient *zKlient )
{
    char message = 0;
    zKlient->getNachrichtEncrypted( &message, 1 );
    switch( message )
    {
    case 0x1: // Team Struktur laden
    {
        Text p = pfad.getText();
        p += "/server/sts.ltgd";
        Datei d;
        d.setDatei( p );
        if( !d.open( Datei::Style::lesen ) )
        {
            fehler = "Es ist ein Fehler beim laden der Einstellungen aufgetreten.";
            return 0;
        }
        zKlient->sendeEncrypted( "\1", 1 );
        char *buffer = new char[ 2048 ];
        int gr = (int)d.getSize();
        while( gr > 0 )
        {
            int l = gr > 2048 ? 2048 : gr;
            d.lese( buffer, l );
            zKlient->sendeEncrypted( buffer, l );
            gr -= l;
        }
        delete[] buffer;
        d.close();
        return 1;
    }
    case 0x2: // Team Struktur speichern
    {
        Text p = pfad.getText();
        p += "/server/sts.ltgd";
        Datei d1;
        d1.setDatei( p );
        p = pfad.getText();
        p += "/client/map/data/data.sts";
        Datei d2;
        d2.setDatei( p );
        if( d1.open( Datei::Style::schreiben ) && d2.open( Datei::Style::schreiben ) )
            zKlient->sendeEncrypted( "\1", 1 );
        else
        {
            d1.close();
            d2.close();
            fehler = "Es ist ein Fehler beim speichern der Einstellungen aufgetreten.";
            return 0;
        }
        int sAnz = 0;
        zKlient->getNachrichtEncrypted( (char*)&sAnz, 4 );
        d1.schreibe( (char*)&sAnz, 4 );
        d2.schreibe( (char*)&sAnz, 4 );
        db->setMaxSpieler( id, sAnz );
        int tAnz = 0;
        zKlient->getNachrichtEncrypted( (char*)&tAnz, 4 );
        d1.schreibe( (char*)&tAnz, 4 );
        d2.schreibe( (char*)&tAnz, 4 );
        for( int i = 0; i < sAnz; i++ )
        { // Spielerfarbe
            int f = 0;
            zKlient->getNachrichtEncrypted( (char*)&f, 4 );
            d1.schreibe( (char*)&f, 4 );
            d2.schreibe( (char*)&f, 4 );
        }
        for( int i = 0; i < tAnz; i++ )
        { // Teamfarbe
            int f = 0;
            zKlient->getNachrichtEncrypted( (char*)&f, 4 );
            d1.schreibe( (char*)&f, 4 );
            d2.schreibe( (char*)&f, 4 );
        }
        for( int i = 0; i < tAnz; i++ )
        { // Teamname
            unsigned char l = 0;
            zKlient->getNachrichtEncrypted( (char*)&l, 1 );
            char *txt = new char[ l + 1 ];
            txt[ (int)l ] = 0;
            zKlient->getNachrichtEncrypted( txt, l );
            d1.schreibe( (char*)&l, 1 );
            d2.schreibe( (char*)&l, 1 );
            d1.schreibe( txt, l );
            d2.schreibe( txt, l );
            delete[] txt;
        }
        for( int i = 0; i < tAnz; i++ )
        { // Teamgröße
            int g = 0;
            zKlient->getNachrichtEncrypted( (char*)&g, 4 );
            d1.schreibe( (char*)&g, 4 );
            d2.schreibe( (char*)&g, 4 );
        }
        d1.close();
        d2.close();
        return 1;
    }
    default:
        fehler = "Unbekannte Nachricht. Eventuell ist der Client nicht auf dem neusten Stand.";
    }
    return 0;
}

// constant
char *TeamsEditor::getLetzterFehler() const
{
    return fehler;
}

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

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