#include "KartenLeser.h"
#include <Datei.h>
#include "AccountHistorieDaten.h"
#include <Klient.h>

// Inhalt der KartenLeser Klasse aus KartenLeser.h
// Konstruktor 
KartenLeser::KartenLeser( int karteId, InformationServer *is )
{
	pfad = new Text( "" );
    *pfad += karteId;
    while( DateiExistiert( pfad->getText() ) )
        pfad->anhängen( "_" );
    ref = 1;
    Text ip;
    int port;
    is->zDB()->getKartenServerPortIp( 0, karteId, &port, &ip );
    Klient *klient = new Klient();
    unsigned char schlüssel[ 20 ] = { 24, 15, 53, 87, 38, 73, 154, 38, 246, 90, 39, 133, 11, 199, 22, 80, 26, 132, 95, 54 };
    klient->setSendeSchlüssel( (char*)schlüssel, 20 );
    klient->setEmpfangSchlüssel( (char*)schlüssel, 20 );
    if( !klient->verbinde( (unsigned short)port, ip ) )
    {
        klient = klient->release();
        return;
    }
    klient->sendeVerschlüsselt( "\x7", 1 );
    char ret = 0;
    klient->getNachrichtVerschlüsselt( &ret, 1 );
    if( ret == 1 )
    {
        klient->sendeVerschlüsselt( (char*)&karteId, 4 );
        klient->getNachrichtVerschlüsselt( &ret, 1 );
        if( ret == 1 )
        {
            int anz = 0;
            klient->getNachrichtVerschlüsselt( (char*)&anz, 4 );
            for( int i = 0; i < anz; i++ )
            {
                char län = 0;
                klient->getNachrichtVerschlüsselt( &län, 1 );
                if( !län )
                    continue;
                char *pfa = new char[ län + 1 ];
                pfa[ län ] = 0;
                klient->getNachrichtVerschlüsselt( pfa, län );
                __int64 größe = 0;
                klient->getNachrichtVerschlüsselt( (char*)&größe, 8 );
                char *buffer = new char[ 2048 ];
                Text pf = pfad->getText();
                pf += "/";
                pf += pfa;
                delete[] pfa;
                Datei d;
                d.setDatei( pf );
                d.erstellen();
                d.öffnen( Datei::Style::schreiben );
                while( größe )
                {
                    int l = größe >= 2048 ? 2048 : (int)größe;
                    klient->getNachricht( buffer, l );
                    d.schreibe( buffer, l );
                    größe -= l;
                }
                d.schließen();
                delete[] buffer;
            }
        }
    }
    if( ret == 3 )
    {
        char byte = 0;
        klient->getNachrichtVerschlüsselt( &byte, 1 );
        char *f = new char[ byte + 1 ];
        f[ byte ] = 0;
        klient->getNachrichtVerschlüsselt( f, byte );
        delete[] f;
    }
    klient->sendeVerschlüsselt( "\3", 1 );
    klient->getNachrichtVerschlüsselt( &ret, 1 );
    klient->trenne();
    klient->release();
}

// Destruktor
KartenLeser::~KartenLeser()
{
    DateiLöschen( pfad );
}

// nicht constant
bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *sts )
{
	if( !pfad->getLänge() )
		return 0;
	Text *pf = new Text( pfad->getText() );
	pf->anhängen( "/sts.ltgd" );
	Datei *datei = new Datei();
	datei->setDatei( pf );
	if( !datei->existiert() || datei->istOrdner() )
	{
		datei->release();
		return 0;
	}
	datei->öffnen( Datei::Style::lesen );
	datei->lese( (char*)&sts->spielerAnzahl, 4 );
	datei->lese( (char*)&sts->teamAnzahl, 4 );
	if( sts->spielerFarbe )
		sts->spielerFarbe->release();
	sts->spielerFarbe = new Array< int >();
	for( int i = 0; i < sts->spielerAnzahl; i++ )
	{
		int farbe = 0;
		datei->lese( (char*)&farbe, 4 );
		sts->spielerFarbe->set( farbe, i );
	}
	if( sts->teamFarbe )
		sts->teamFarbe->release();
	sts->teamFarbe = new Array< int >();
	for( int i = 0; i < sts->teamAnzahl; i++ )
	{
		int farbe = 0;
		datei->lese( (char*)&farbe, 4 );
		sts->teamFarbe->set( farbe, i );
	}
	if( sts->teamName )
		sts->teamName->release();
	sts->teamName = new RCArray< Text >();
	for( int i = 0; i < sts->teamAnzahl; i++ )
	{
		char län = 0;
		datei->lese( &län, 1 );
		char *txt = new char[ län + 1 ];
		txt[ län ] = 0;
		datei->lese( txt, län );
		Text *name = new Text( txt );
		delete[] txt;
		sts->teamName->set( name, i );
	}
	if( sts->teamGröße )
		sts->teamGröße->release();
	sts->teamGröße = new Array< int >();
	for( int i = 0; i < sts->teamAnzahl; i++ )
	{
		int größe = 0;
		datei->lese( (char*)&größe, 4 );
		sts->teamGröße->set( größe, i );
	}
	datei->schließen();
	datei->release();
	return 1;
}

// constant
Text *KartenLeser::getPfad() const
{
	return pfad ? pfad->getThis() : 0;
}

Text *KartenLeser::zPfad() const
{
	return pfad;
}

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

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