#include "KEBeschreibung.h"
#include "../../../../Global/Initialisierung.h"
#include "../../../../Global/Variablen.h"

bool KEBKnopfPressME( void *p, void *obj, MausEreignis me )
{
    if( p )
        ( (KEBeschreibung*)p )->knopfPress( (Knopf*)obj, &me );
    return 1;
}

// Inhalt der KEBeschreibung Klasse aus KEBeschreibung.h
// Konstruktor
KEBeschreibung::KEBeschreibung( int karte, Schrift *zSchrift )
    : Thread()
{
    schrift = zSchrift->getThis();
    Text *kName = infoClient->getKarteName( karte );
    Text titel = kName ? kName->getText() : "<Karte>";
    titel += " - Beschreibung";
    if( kName )
        kName->release();
    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
    editor = new KEBEditor( zSchrift, this );
    vorschau = new KEBVorschau( zSchrift );
    fenster->addMember( editor );
    fenster->addMember( vorschau );
    laden = (Animation2D*)ladeAnimation->dublizieren();
    laden->setPosition( 425, 275 );
    laden->setSichtbar( 0 );
    importDialog = 0;
    importPfad = 0;
    animation = 0;
    tickVal = 0;
    sichtbar = 0;
    rechts = 0;
    xStart = 0;
    breite = 0;
    aktion = 0;
    jetzt = 0;
    this->karte = karte;
    alpha = 255;
    ref = 1;
}

// Destruktor
KEBeschreibung::~KEBeschreibung()
{
    if( run )
    {
        warteAufThread( 5000 );
        if( run )
            ende();
    }
    fenster->release();
    laden->release();
    schrift->release();
    editor->release();
    vorschau->release();
    if( importDialog )
        importDialog->release();
    if( importPfad )
        importPfad->release();
}

// nicht constant
void KEBeschreibung::setSichtbar( bool s, bool vr )
{
    animation = 1;
    sichtbar = s;
    rechts = vr;
    if( sichtbar )
    {
        if( vr )
        {
            xStart = 900;
            breite = 0;
        }
        else
        {
            xStart = 0;
            breite = 0;
        }
        if( !run )
        {
            aktion = 0;
            start();
        }
    }
}

void KEBeschreibung::thread()
{
    laden->setSichtbar( 1 );
    if( aktion == 0 )
    {
        if( jetzt == 1 )
        { // beschreibung laden
            Text *t = editorClient->beschreibungLaden();
            t->ersetzen( "\r\n", "\n" );
            hauptScreen->lock();
            if( !t )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
            else
                editor->setText( t );
            hauptScreen->unlock();
            t->release();
        }
        if( jetzt == 2 )
        { // Titelbild laden
            Bild *b = editorClient->titelbildLaden();
            hauptScreen->lock();
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
            else
                editor->setBild( b );
            hauptScreen->unlock();
            b->release();
        }
        if( jetzt == 3 )
        { // Minimap Bild laden
            Bild *b = editorClient->minimapLaden();
            hauptScreen->lock();
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
            else
                editor->setBild( b );
            hauptScreen->unlock();
            b->release();
        }
        if( jetzt == 4 )
        { // Ladebild laden
            Bild *b = editorClient->ladebildLaden();
            hauptScreen->lock();
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
            else
                editor->setBild( b );
            hauptScreen->unlock();
            b->release();
        }
        editor->setSichtbar( 1 );
    }
    if( aktion == 1 )
    {
        if( jetzt == 1 )
        { // Beschreibung speichern
            if( !editorClient->beschreibungSpeichern( editor->zBeschreibung() ) )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
        }
        if( jetzt == 2 )
        { // Titelbild hochladen
            importPfad->ersetzen( "\\", "/" );
            Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 );
            Text name = n->getText();
            n->release();
            Text *err = new Text();
            Bild *b = ladeBild( importPfad->getText(), err );
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) );
            else
            {
                err->release();
                if( !editorClient->titelbildSpeichern( b ) )
                    nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
                hauptScreen->lock();
                editor->setBild( b );
                hauptScreen->unlock();
                b->release();
            }
        }
        if( jetzt == 3 )
        { // Minimap hochladen
            importPfad->ersetzen( "\\", "/" );
            Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 );
            Text name = n->getText();
            n->release();
            Text *err = new Text();
            Bild *b = ladeBild( importPfad->getText(), err );
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) );
            else
            {
                err->release();
                if( !editorClient->minimapSpeichern( b ) )
                    nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
                hauptScreen->lock();
                editor->setBild( b );
                hauptScreen->unlock();
                b->release();
            }
        }
        if( jetzt == 4 )
        { // Ladebild hochladen
            importPfad->ersetzen( "\\", "/" );
            Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 );
            Text name = n->getText();
            n->release();
            Text *err = new Text();
            Bild *b = ladeBild( importPfad->getText(), err );
            if( !b )
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) );
            else
            {
                err->release();
                if( !editorClient->ladebildSpeichern( b ) )
                    nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
                hauptScreen->lock();
                editor->setBild( b );
                hauptScreen->unlock();
                b->release();
            }
        }
    }
    if( aktion == 2 )
    { // Vorschau
        if( vorschau->ladeKarte() )
        {
            editor->setSichtbar( 0 );
            vorschau->setSichtbar( 1 );
        }
    }
    run = 0;
    laden->setSichtbar( 0 );
    return;
}

void KEBeschreibung::knopfPress( Knopf *k, MausEreignis *me )
{
    if( run || me->id != ME_RLinks )
        return;
    if( editor->getKNum( k ) > 0 && jetzt != editor->getKNum( k ) )
    {
        jetzt = editor->getKNum( k );
        aktion = 0;
        start();
    }
    if( editor->getKNum( k ) == -1 )
    {
        aktion = 1;
        start();
    }
    if( editor->getKNum( k ) == -2 )
    {
        if( !importDialog )
        {
            importDialog = new DateiDialogTh();
            importDialog->setOpen( 1 );
            importDialog->setDateiTypAuswahl( 4 );
            importDialog->addDateiTyp( "JPEG-Bild", "*.jpg;*.jpeg;*.jpe" );
            importDialog->addDateiTyp( "GIF-Bild", "*.gif" );
            importDialog->addDateiTyp( "PNG-Bild", "*.png" );
            importDialog->addDateiTyp( "Alle Dateien", "*.*" );
            importDialog->start();
        }
    }
    if( editor->getKNum( k ) == -3 )
    {
        aktion = 2;
        start();
    }
}

void KEBeschreibung::doMausEreignis( MausEreignis &me )
{
    if( !run )
        fenster->doMausEreignis( me );
}

void KEBeschreibung::doTastaturEreignis( TastaturEreignis &te )
{
    if( !run )
        fenster->doTastaturEreignis( te );
}

bool KEBeschreibung::tick( double z )
{
    if( importDialog )
    {
        if( !importDialog->isRunning() )
        {
            if( importPfad )
                importPfad->release();
            importPfad = importDialog->getPfad();
            importDialog = importDialog->release();
            if( sichtbar && importPfad )
            {
                aktion = 1;
                start();
            }
        }
    }
    if( vorschau->istSichtbar() )
    {
        if( vorschau->getAktion() )
        {
            vorschau->setSichtbar( 0 );
            editor->setSichtbar( 1 );
        }
    }
    bool ret = laden->tick( z );
    tickVal += z * 150;
    int val = (int)tickVal;
    tickVal -= val;
    if( val )
    {
        if( run && alpha > 100 )
        {
            if( alpha - val < 100 )
                alpha = 100;
            else
                alpha -= val;
            ret = 1;
        }
        if( sichtbar && !run && alpha != 255 )
        {
            if( alpha + val > 255 )
                alpha = 255;
            else
                alpha += val;
            ret = 1;
        }
        val *= 3;
        if( sichtbar )
        {
            if( alpha < 100 )
            {
                if( alpha + val > 100 )
                    alpha = 100;
                else
                    alpha += val;
                ret = 1;
            }
            if( xStart != 0 || breite != 900 )
            {
                if( rechts )
                {
                    if( xStart - val <= 0 )
                    {
                        xStart = 0;
                        breite = 900;
                        animation = 0;
                    }
                    else
                    {
                        xStart -= val;
                        breite += val;
                    }
                }
                else
                {
                    if( breite + val >= 900 )
                    {
                        breite = 900;
                        animation = 0;
                    }
                    else
                        breite += val;
                }
                ret = 1;
            }
        }
        else
        {
            if( breite != 0 )
            {
                if( rechts )
                {
                    if( breite - val <= 0 )
                    {
                        breite = 0;
                        animation = 0;
                    }
                    else
                        breite -= val;
                }
                else
                {
                    if( breite - val <= 0 )
                    {
                        breite = 0;
                        xStart = 900;
                        animation = 0;
                    }
                    else
                    {
                        breite -= val;
                        xStart += val;
                    }
                }
                ret = 1;
            }
        }
    }
    return ret || fenster->tick( z );
}

void KEBeschreibung::render( Bild &zRObj )
{
    if( !zRObj.setDrawOptions( xStart, 0, breite, 600 ) )
        return;
    zRObj.setAlpha( alpha );
    fenster->render( zRObj );
    zRObj.releaseAlpha();
    laden->render( zRObj );
    zRObj.releaseDrawOptions();
}

// constant
bool KEBeschreibung::istSichtbar() const
{
    return sichtbar || animation;
}

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

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