#include "KERelease.h"
#include "../../../../Global/Initialisierung.h"
#include "../../../../Global/Variablen.h"
#include <Text.h>

bool kEReleaseHerstellenME( void *p, void *obj, MausEreignis me )
{
    if( p )
        return ( (KERelease*)p )->herstellenME( (Knopf*)obj, me );
    return 1;
}

bool kEReleaseL�schenME( void *p, void *obj, MausEreignis me )
{
    if( p )
        return ( (KERelease*)p )->removeME( (Knopf*)obj, me );
    return 1;
}

bool kEReleaseVer�ffME( void *p, void *obj, MausEreignis me )
{
    if( p )
        return ( (KERelease*)p )->ver�ffentlichenME( me );
    return 1;
}

bool kEReleaseAbbildErstellenME( void *p, void *obj, MausEreignis me )
{
    if( p )
        return ( (KERelease*)p )->abbildErstellenME( me );
    return 1;
}

bool kEReleaseShop�bernehmenME( void *p, void *obj, MausEreignis me )
{
    if( p )
        return ( (KERelease*)p )->shop�bernehmenME( me );
    return 1;
}

// Inhalt der KERelease Klasse aus KERelease.h
// Konstruktor
KERelease::KERelease( int karte, Schrift *zSchrift )
    : Thread()
{
    schrift = zSchrift->getThis();
    Text *kName = infoKlient->getKarteName( karte );
    Text titel = kName ? kName->getText() : "<Karte>";
    titel += " - Release";
    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 );
    abbilder = initObjTabelle( 10, 10, 700, 510, zSchrift, OTSTYLE, { { "Name", 270, 270, 270 },
    { "Datum", 200, 200, 200 }, { "Herstellen", 100, 100, 100 }, { "L�schen", 100, 100, 100 } }, 20 );
    ver�ff = initKnopf( 720, 10, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Ver�ffentlichen" );
    ver�ff->setMausEreignisParameter( this );
    ver�ff->setMausEreignis( kEReleaseVer�ffME );
    initToolTip( ver�ff, "Ver�ffentlicht die momentane Version der Karte.\nDieser Vorgang kann einiege Minuten dauern.\nW�hrend dieses Vorgangs k�nnen keine �nderungen\nan der Karte vorgenommen werden.", schrift->getThis(), hauptScreen );
    abbildName = initTextFeld( 720, 40, 150, 20, zSchrift, TextFeld::Style::TextFeld, "Abbild Name" );
    initToolTip( abbildName, "Name eines neu zu erstellenen Kartenabbilds.", schrift->getThis(), hauptScreen );
    abbildErstellen = initKnopf( 720, 70, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Abbild Erstellen" );
    abbildErstellen->setMausEreignisParameter( this );
    abbildErstellen->setMausEreignis( kEReleaseAbbildErstellenME );
    initToolTip( abbildErstellen, "Erstellt ein Abbild von der aktuellen Kartenversion,\ndas zu einem sp�teren Zeitpunkt wiederhergestellt werden kann.", schrift->getThis(), hauptScreen );
    shopT = initTextFeld( 720, 350, 150, 20, zSchrift, TextFeld::Style::Text, "Im Shop zu kaufen:" );
    testVersionErwerbbar = initAuswahlBox( 720, 375, 150, 20, zSchrift, ABSTYLE, { "Testversion ja", "Testversion nein" } );
    vollVersionErwerbbar = initAuswahlBox( 720, 400, 150, 20, zSchrift, ABSTYLE, { "Vollversion ja","Vollversion nein" } );
    preisT = initTextFeld( 720, 425, 150, 20, zSchrift, TextFeld::Style::Text, "Preis in Kupfer:" );
    testVersionPreisT = initTextFeld( 720, 450, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Testversion:" );
    vollVersionPreisT = initTextFeld( 720, 475, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Vollversion:" );
    testVersionPreis = initTextFeld( 820, 450, 50, 20, zSchrift, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
    testVersionPreis->setTastaturEreignis( _nurNummernTE );
    vollVersionPreis = initTextFeld( 820, 475, 50, 20, zSchrift, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
    vollVersionPreis->setTastaturEreignis( _nurNummernTE );
    shop�bernehmen = initKnopf( 745, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "�bernehmen" );
    shop�bernehmen->setMausEreignis( kEReleaseShop�bernehmenME );
    shop�bernehmen->setMausEreignisParameter( this );
    laden = (Animation2D*)ladeAnimation->dublizieren();
    laden->setPosition( 425, 275 );
    laden->setSichtbar( 0 );
    fenster->addMember( abbilder );
    fenster->addMember( ver�ff );
    fenster->addMember( abbildName );
    fenster->addMember( abbildErstellen );
    fenster->addMember( shopT );
    fenster->addMember( preisT );
    fenster->addMember( testVersionPreisT );
    fenster->addMember( vollVersionPreisT );
    fenster->addMember( testVersionPreis );
    fenster->addMember( vollVersionPreis );
    fenster->addMember( shop�bernehmen );
    fenster->addMember( vollVersionErwerbbar );
    fenster->addMember( testVersionErwerbbar );
    animation = 0;
    tickVal = 0;
    sichtbar = 0;
    rechts = 0;
    xStart = 0;
    breite = 0;
    aktion = 0;
    zeile = 0;
    this->karte = karte;
    alpha = 255;
    ref = 1;
}

// Destruktor
KERelease::~KERelease()
{
    if( run )
    {
        warteAufThread( 5000 );
        if( run )
            ende();
    }
    int anz = abbilder->getZeilenAnzahl();
    for( int i = 0; i < anz; i++ )
    {
        ( (TextFeld*)abbilder->zZeichnung( 0, 0 ) )->release();
        ( (TextFeld*)abbilder->zZeichnung( 1, 0 ) )->release();
        if( i != 0 )
        {
            ( (Knopf*)abbilder->zZeichnung( 2, 0 ) )->release();
            ( (Knopf*)abbilder->zZeichnung( 3, 0 ) )->release();
        }
        else
        {
            ( (TextFeld*)abbilder->zZeichnung( 2, 0 ) )->release();
            ( (TextFeld*)abbilder->zZeichnung( 3, 0 ) )->release();
        }
        abbilder->removeZeile( 0 );
    }
    fenster->release();
    abbilder->release();
    ver�ff->release();
    abbildName->release();
    abbildErstellen->release();
    laden->release();
    schrift->release();
    shopT->release();
    testVersionErwerbbar->release();
    vollVersionErwerbbar->release();
    preisT->release();
    testVersionPreisT->release();
    vollVersionPreisT->release();
    testVersionPreis->release();
    vollVersionPreis->release();
    shop�bernehmen->release();
}

// nicht constant
bool KERelease::herstellenME( Knopf *obj, MausEreignis &me )
{
    if( me.id == ME_RLinks )
    {
        int anz = abbilder->getZeilenAnzahl();
        for( int i = 1; i < anz; i++ )
        {
            if( obj == (Knopf*)abbilder->zZeichnung( 2, i ) )
            {
                if( !run )
                {
                    zeile = i;
                    aktion = 1;
                    start();
                }
                break;
            }
        }
    }
    return 1;
}

bool KERelease::removeME( Knopf *obj, MausEreignis &me )
{
    if( me.id == ME_RLinks )
    {
        int anz = abbilder->getZeilenAnzahl();
        for( int i = 1; i < anz; i++ )
        {
            if( obj == (Knopf*)abbilder->zZeichnung( 3, i ) )
            {
                if( !run )
                {
                    zeile = i;
                    aktion = 2;
                    start();
                }
                break;
            }
        }
    }
    return 1;
}

bool KERelease::ver�ffentlichenME( MausEreignis &me )
{
    if( me.id == ME_RLinks )
    {
        if( !run )
        {
            aktion = 3;
            start();
        }
    }
    return 1;
}

bool KERelease::abbildErstellenME( MausEreignis &me )
{
    if( me.id == ME_RLinks )
    {
        if( !run )
        {
            aktion = 4;
            start();
        }
    }
    return 1;
}

bool KERelease::shop�bernehmenME( MausEreignis &me )
{
    if( me.id == ME_RLinks )
    {
        if( !run )
        {
            aktion = 5;
            start();
        }
    }
    return 1;
}

void KERelease::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 KERelease::thread()
{
    laden->setSichtbar( 1 );
    if( aktion == 1 && zeile )
    {
        if( !editorKlient->abbildHerstellen( abbilder->zZeilenName( zeile )->getText() ) )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        zeile = 0;
        run = 0;
        laden->setSichtbar( 0 );
        return;
    }
    if( aktion == 2 && zeile )
    {
        if( !editorKlient->abbildL�schen( abbilder->zZeilenName( zeile )->getText() ) )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        zeile = 0;
    }
    if( aktion == 3 )
    {
        if( !editorKlient->ver�ffentlichen() )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        run = 0;
        laden->setSichtbar( 0 );
        return;
    }
    if( aktion == 4 )
    {
        if( !editorKlient->abbildErstellen( abbildName->zText()->getText() ) )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
    }
    if( aktion == 0 )
    {
        int es = 0, tp = 0, vp = 0;
        if( editorKlient->getShopDaten( es, tp, vp ) )
        {
            if( ( es | 1 ) == es )
                testVersionErwerbbar->setAuswahl( 0 );
            else
                testVersionErwerbbar->setAuswahl( 1 );
            if( ( es | 2 ) == es )
                vollVersionErwerbbar->setAuswahl( 0 );
            else
                vollVersionErwerbbar->setAuswahl( 1 );
            testVersionPreis->setText( Text() += tp );
            vollVersionPreis->setText( Text() += vp );
        }
        else
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
    }
    if( aktion == 5 )
    {
        int es = 0;
        if( !testVersionErwerbbar->getAuswahl() )
            es |= 1;
        if( !vollVersionErwerbbar->getAuswahl() )
            es |= 2;
        int tp = (int)*testVersionPreis->zText();
        int vp = (int)*vollVersionPreis->zText();
        if( !editorKlient->setShopDaten( es, tp, vp ) )
            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) );
        run = 0;
        laden->setSichtbar( 0 );
        return;
    }
    int anz = abbilder->getZeilenAnzahl();
    for( int i = 1; i < anz; i++ )
    {
        hauptScreen->lock();
        ( (TextFeld*)abbilder->zZeichnung( 0, 1 ) )->release();
        ( (TextFeld*)abbilder->zZeichnung( 1, 1 ) )->release();
        ( (Knopf*)abbilder->zZeichnung( 2, 1 ) )->release();
        ( (Knopf*)abbilder->zZeichnung( 3, 1 ) )->release();
        abbilder->removeZeile( 1 );
        hauptScreen->unlock();
    }
    RCArray< Text > *name = new RCArray< Text >();
    RCArray< Zeit > *datum = new RCArray< Zeit >();
    anz = editorKlient->getAbbildListe( name, datum );
    for( int i = 0; i < anz; i++ )
    {
        hauptScreen->lock();
        abbilder->addZeile( name->z( i )->getText() );
        abbilder->setZeichnungZ( 0, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, name->z( i )->getText() ) );
        Text *d = datum->z( i )->getZeit( "h:i:s d.m.y" );
        abbilder->setZeichnungZ( 1, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, d->getText() ) );
        d->release();
        Knopf *k = initKnopf( 0, 0, 100, 20, schrift, Knopf::Style::Sichtbar, "Herstellen" );
        initToolTip( k, "Stellt die abgespeicherte Version der Karte wiederher.", schrift->getThis(), hauptScreen );
        k->setMausEreignisParameter( this );
        k->setMausEreignis( kEReleaseHerstellenME );
        abbilder->setZeichnungZ( 2, i + 1, k );
        k = initKnopf( 0, 0, 100, 20, schrift, Knopf::Style::Sichtbar, "L�schen" );
        initToolTip( k, "L�scht die abgespeicherte Version der Karte.", schrift->getThis(), hauptScreen );
        k->setMausEreignisParameter( this );
        k->setMausEreignis( kEReleaseL�schenME );
        abbilder->setZeichnungZ( 3, i + 1, k );
        hauptScreen->unlock();
    }
    name->release();
    datum->release();
    run = 0;
    laden->setSichtbar( 0 );
}

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

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

bool KERelease::tick( double z )
{
    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( !run && alpha != 255 )
        {
            if( alpha + val > 255 )
                alpha = 255;
            else
                alpha += val;
            ret = 1;
        }
        val *= 3;
        if( sichtbar )
        {
            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 KERelease::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 KERelease::istSichtbar() const
{
    return sichtbar || animation;
}

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

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