#include "KartenLeser.h"
#include "..\Global\Variablen.h"
#include <Datei.h>
#include <DateiSystem.h>
#include <KSGTDatei.h>
#include <Bild.h>
#include <Punkt.h>

// Inhalt der KartenLeser Klasse aus KartenLeser.h
// Konstruktor
KartenLeser::KartenLeser()
{
    letzterFehler = new Text( "" );
    karteId = 0;
    ref = 1;
}

// Destruktor
KartenLeser::~KartenLeser()
{
    letzterFehler->release();
}

// nicht constant
void KartenLeser::setKarteId( int karteId )
{
    this->karteId = karteId;
}

// constant
Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift ) const
{
    bool ok = 1;
    int port = 0;
    Text ip;
    infoKlient->getKartenServer( karteId, &port, &ip );
    if( !kartenKlient->verbinde( port, ip ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        ok = 0;
    }
    if( !kartenKlient->downloadKarteTitel( karteId ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        ok = 0;
    }
    Bild *ret = 0;
    if( ok )
    {
        Text *pfad = getKartePfad();
        pfad->anhängen( "titel.ltdb" );
        LTDBDatei *datei = new LTDBDatei();
        datei->setDatei( pfad );
        datei->leseDaten( 0 );
        ret = datei->laden( 0, datei->zBildListe()->get( 0 ) );
        datei->release();
    }
    if( !ret )
    {
        ret = new Bild();
        ret->neuBild( 200, 100, 0xFF000000 );
        zSchrift->lock();
        zSchrift->setSchriftGröße( 12 );
        zSchrift->setDrawPosition( 10, 10 );
        Text *kn = getKarteName();
        zSchrift->renderText( kn, *ret, 0xFFFFFFFF );
        kn->release();
        zSchrift->unlock();
    }
    return ret;
}

Bild *KartenLeser::getKartenVorschauBild() const
{
    int port = 0;
    Text ip;
    infoKlient->getKartenServer( karteId, &port, &ip );
    if( !kartenKlient->verbinde( port, ip ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    if( !kartenKlient->downloadKarteMinimap( karteId ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    Text *pfad = getKartePfad();
    pfad->anhängen( "minimap.ltdb" );
    Bild *ret = 0;
    LTDBDatei *datei = new LTDBDatei();
    datei->setDatei( pfad );
    datei->leseDaten( 0 );
    ret = datei->laden( 0, datei->zBildListe()->get( 0 ) );
    datei->release();
    if( !ret )
        letzterFehler->anhängen( "Bild nicht gefunden." );
    return ret;
}

Bild *KartenLeser::getLadeBild() const
{
    int port = 0;
    Text ip;
    infoKlient->getKartenServer( karteId, &port, &ip );
    if( !kartenKlient->verbinde( port, ip ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    if( !kartenKlient->downloadKarteLadebild( karteId ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    Text *pfad = getKartePfad();
    pfad->anhängen( "ladebild.ltdb" );
    Bild *ret = 0;
    LTDBDatei *datei = new LTDBDatei();
    datei->setDatei( pfad );
    datei->leseDaten( 0 );
    ret = datei->laden( 0, datei->zBildListe()->get( 0 ) );
    datei->release();
    if( !ret )
        letzterFehler->anhängen( "Bild nicht gefunden." );
    return ret;
}

bool KartenLeser::getKartenBeschreibung() const
{
    int port = 0;
    Text ip;
    infoKlient->getKartenServer( karteId, &port, &ip );
    if( !kartenKlient->verbinde( port, ip ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    if( !kartenKlient->downloadKarteBeschreibung( karteId ) )
    {
        letzterFehler->setText( kartenKlient->getLetzterFehler() );
        return 0;
    }
    return 1;
}

int KartenLeser::getSpielId() const
{
    if( !karteId )
    {
        letzterFehler->setText( "Karte Id ist nicht gesetzt." );
        return 0;
    }
    if( infoKlient )
    {
        int id = infoKlient->getSpielId( karteId );
        if( !id )
            letzterFehler->setText( infoKlient->getLetzterFehler() );
        return id;
    }
    else
        letzterFehler->setText( "Informations Klient ist nicht Initialisiert." );
    return 0;
}

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

Text *KartenLeser::getSpielName() const
{
    if( infoKlient )
    {
        int id = getSpielId();
        if( !id )
            return 0;
        Text *name = infoKlient->getSpielName( id );
        if( !name )
            letzterFehler->setText( infoKlient->getLetzterFehler() );
        return name;
    }
    else
        letzterFehler->setText( "Informations Klient ist nicht Initialisiert." );
    return 0;
}

Text *KartenLeser::getSpielPfad() const
{
    int sId = getSpielId();
    int dg = infoKlient->getDateiGruppeIdVonSpiel( sId );
    Text *pfad = infoKlient->getDateiGruppePfad( dg );
    if( !pfad )
    {
        letzterFehler->setText( "Der Pfad des Spieles konnte nicht ermittelt werden." );
        return 0;
    }
    pfad->anhängen( "/" );
    return pfad;
}

Text *KartenLeser::getKarteName() const
{
    if( !karteId )
    {
        letzterFehler->setText( "Karte Id ist nicht gesetzt." );
        return 0;
    }
    if( infoKlient )
    {
        Text *name = infoKlient->getKarteName( karteId );
        if( !name )
            letzterFehler->setText( infoKlient->getLetzterFehler() );
        return name;
    }
    else
        letzterFehler->setText( "Informations Klient ist nicht Initialisiert." );
    return 0;
}

Text *KartenLeser::getKartePfad() const
{
    Text *pf = new Text( "data/tmp/Karten/" );
    pf->anhängen( karteId );
    pf->anhängen( "/" );
    return pf;
}

char *KartenLeser::getLetzterFehler() const
{
    return letzterFehler->getText();
}

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

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