#include "KartenLeser.h"
#include <Datei.h>
#include "Karte.h"

// Inhalt der KartenLeser Klasse aus KartenLeser.h
// Kontruktor
KartenLeser::KartenLeser( int karteId, SSDatenbankV *db, char *tmpPfad )
{
    this->karteId = karteId;
    this->db = db;
    pfad = new Text( tmpPfad );
    ref = 1;
}

// Destruktor
KartenLeser::~KartenLeser()
{
    if( db )
        db->release();
    if( pfad )
        pfad->release();
}

// nicht constant
bool KartenLeser::ladeSpielerTeamStruktur( SpielerTeamStruktur *zSts )
{
    if( !pfad )
        return 0;
    Text *pf = new Text( pfad->getText() );
    pf->append( "sts.ltgd" );
    Datei *datei = new Datei();
    datei->setDatei( pf );
    if( !datei->existiert() || datei->istOrdner() )
    {
        datei->release();
        return 0;
    }
    datei->open( Datei::Style::lesen );
    datei->lese( (char*)&zSts->spielerAnzahl, 4 );
    datei->lese( (char*)&zSts->teamAnzahl, 4 );
    if( zSts->spielerFarbe )
        zSts->spielerFarbe->release();
    zSts->spielerFarbe = new Array< int >();
    for( int i = 0; i < zSts->spielerAnzahl; i++ )
    {
        int farbe = 0;
        datei->lese( (char*)&farbe, 4 );
        zSts->spielerFarbe->set( farbe, i );
    }
    if( zSts->teamFarbe )
        zSts->teamFarbe->release();
    zSts->teamFarbe = new Array< int >();
    for( int i = 0; i < zSts->teamAnzahl; i++ )
    {
        int farbe = 0;
        datei->lese( (char*)&farbe, 4 );
        zSts->teamFarbe->set( farbe, i );
    }
    if( zSts->teamName )
        zSts->teamName->release();
    zSts->teamName = new RCArray< Text >();
    for( int i = 0; i < zSts->teamAnzahl; i++ )
    {
        char len = 0;
        datei->lese( &len, 1 );
        char *txt = new char[ len + 1 ];
        txt[ (int)len ] = 0;
        datei->lese( txt, len );
        Text *name = new Text( txt );
        delete[] txt;
        zSts->teamName->set( name, i );
    }
    if( zSts->teamSize )
        zSts->teamSize->release();
    zSts->teamSize = new Array< int >();
    for( int i = 0; i < zSts->teamAnzahl; i++ )
    {
        int size = 0;
        datei->lese( (char*)&size, 4 );
        zSts->teamSize->set( size, i );
    }
    datei->close();
    datei->release();
    return 1;
}

Karte *KartenLeser::ladeKarte( SpielerTeamStruktur *zSts )
{
    if( !pfad )
        return 0;
    Text *pf = new Text( pfad->getText() );
    pf->append( "data.map" );
    Datei *datei = new Datei();
    datei->setDatei( pf );
    if( !datei->existiert() || datei->istOrdner() )
    {
        datei->release();
        return 0;
    }
    datei->open( Datei::Style::lesen );
    Karte *ret = new Karte();
    ret->ladeDaten( datei, db, zSts, pfad->getText(), karteId );
    datei->close();
    datei->release();
    return ret;
}

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

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;
}