#include "KEShopSeite.h"
#include <Schrift.h>
#include <Datei.h>
#include "../../../../Global/Variablen.h"
#include "../../../../Global/Initialisierung.h"
#include <Bild.h>

// Inhalt der KEShopSeite Klasse aus KEShopSeite.h
// Konstruktor
KEShopSeite::KEShopSeite( int karte, Schrift *zSchrift )
    : Thread()
{
    schrift = zSchrift->getThis();
    Text *kName = infoKlient->getKarteName( karte );
    Text titel = kName ? kName->getText() : "<Karte>";
    titel += " - Shop Seite";
    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 KESSEditor( zSchrift );
    vorschau = new KESSVorschau( zSchrift );
    laden = (Animation2D*)ladeAnimation->dublizieren();
    laden->setPosition( 425, 275 );
    laden->setSichtbar( 0 );
    fenster->addMember( editor );
    fenster->addMember( vorschau );
    animation = 0;
    tickVal = 0;
    sichtbar = 0;
    rechts = 0;
    xStart = 0;
    breite = 0;
    aktion = 0;
    zeile = 0;
    this->karte = karte;
    alpha = 255;
    ref = 1;
}

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

// nicht constant
void KEShopSeite::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 KEShopSeite::thread()
{
    laden->setSichtbar( 1 );
    switch( aktion )
    {
    case 0: // Init
    {
        RCArray< Text > *list = new RCArray< Text >();
        int anz = editorKlient->ssGetDateiListe( list );
        if( anz < 0 )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            list->release();
            break;
        }
        editor->setDateiListe( list );
        break;
    }
    case 1: // Neue Datei
    {
        if( !editorKlient->ssDateiErstellen( editor->zNeuDateiName()->getText(), editor->getNeuDateiTyp() ) )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            break;
        }
        RCArray< Text > *list = new RCArray< Text >();
        int anz = editorKlient->ssGetDateiListe( list );
        if( anz < 0 )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            list->release();
            break;
        }
        editor->setDateiListe( list );
        break;
    }
    case 2: // Datei Auswählen
    {
        Text *zName = editor->zDateiAuswahl();
        if( zName->hat( ".ltdb" ) )
        {
            RCArray< Text > *list = new RCArray< Text >();
            int anz = editorKlient->ssGetBildListe( zName->getText(), list );
            if( anz < 0 )
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
                list->release();
                break;
            }
            editor->setBildListe( list );
        }
        else if( zName->hat( ".ksgs" ) )
        {
            Text *txt = editorKlient->ssTextLaden( zName->getText() );
            if( !txt )
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
                break;
            }
            editor->setDateiText( txt );
        }
        else
        {
            if( !editorKlient->ssOrdnerÖffnen(zName->getText() ) )
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
                break;
            }
            RCArray< Text > *list = new RCArray< Text >();
            int anz = editorKlient->ssGetDateiListe( list );
            if( anz < 0 )
            {
                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
                list->release();
                break;
            }
            editor->setDateiListe( list );
        }
        break;
    }
    case 3: // Bild Auswählen
    {
        Bild *b = editorKlient->ssBildLaden( editor->zDateiAuswahl()->getText(), editor->zBildAuswahl()->getText() );
        if( !b )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            break;
        }
        editor->setBild( b );
        break;
    }
    case 4: // Datei Löschen
    {
        if( ( editor->zDateiAuswahl() && !editorKlient->ssDateiLöschen( editor->zDateiAuswahl()->getText() ) ) || ( !editor->zDateiAuswahl() && !editorKlient->ssDateiLöschen( "." ) ) )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            break;
        }
        RCArray< Text > *list = new RCArray< Text >();
        int anz = editorKlient->ssGetDateiListe( list );
        if( anz < 0 )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            list->release();
            break;
        }
        editor->setDateiListe( list );
        break;
    }
    case 5: // Text Speichern
    {
        if( !editorKlient->ssTextSpeichern( editor->zDateiAuswahl()->getText(), editor->zDateiText() ) )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        break;
    }
    case 6: // Bild Löschen
    {
        if( !editorKlient->ssBildLöschen( editor->zDateiAuswahl()->getText(), editor->zBildAuswahl()->getText() ) )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            break;
        }
        RCArray< Text > *list = new RCArray< Text >();
        int anz = editorKlient->ssGetBildListe( editor->zDateiAuswahl()->getText(), list );
        if( anz < 0 )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            list->release();
            break;
        }
        editor->setBildListe( list );
        break;
    }
    case 7: // Importieren
    {
        Text *pfad = editor->zBildImportPfad();
        pfad->ersetzen( "\\", "/" );
        Text *n = pfad->getTeilText( pfad->positionVon( "/", pfad->anzahlVon( "/" ) - 1 ) + 1 );
        Text name = n->getText();
        n->release();
        Text *err = new Text();
        Bild *b = ladeBild( pfad->getText(), err );
        if( !b )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) );
            break;
        }
        err->release();
        if( !editorKlient->ssBildSpeichern( editor->zDateiAuswahl()->getText(), name, b ) )
        {
            b->release();
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            break;
        }
        b->release();
        RCArray< Text > *list = new RCArray< Text >();
        int anz = editorKlient->ssGetBildListe( editor->zDateiAuswahl()->getText(), list );
        if( anz < 0 )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            list->release();
            break;
        }
        editor->setBildListe( list );
        break;
    }
    case 8: // Vorschau
    {
        editor->setSichtbar( 0 );
        if( !editorKlient->ladeShopSeiteVorschau() )
        {
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
            editor->setSichtbar( 1 );
            break;
        }
        vorschau->ladeKarte( "data/tmp/ke/ssv" );
        vorschau->setSichtbar( 1 );
        break;
    }
    case 9: // Veröffentlichen
    {
        if( !editorKlient->shopSeiteVeröffentlichen() )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        break;
    }
    case 10: // Vorschau Beenden
    {
        vorschau->setSichtbar( 0 );
        DateiLöschen( "data/tmp/ke/ssv" );
        editor->setSichtbar( 1 );
        break;
    }
    }
    laden->setSichtbar( 0 );
    run = 0;
}

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

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

bool KEShopSeite::tick( double z )
{
    aktion = vorschau->getAktion();
    if( aktion )
        aktion += 9;
    else
        aktion = editor->getAktion();
    if( aktion && !run )
        start();
    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;
                        if( !editor->istSichtbar() && !vorschau->istSichtbar() )
                            editor->setSichtbar( 1 );
                    }
                    else
                    {
                        xStart -= val;
                        breite += val;
                    }
                }
                else
                {
                    if( breite + val >= 900 )
                    {
                        breite = 900;
                        animation = 0;
                        if( !editor->istSichtbar() && !vorschau->istSichtbar() )
                            editor->setSichtbar( 1 );
                    }
                    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 KEShopSeite::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 KEShopSeite::istSichtbar() const
{
    return sichtbar || animation;
}

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

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