#include "SpielerGUI.h"
#include "../../Initialisierung/Initialisierung.h"
#include <MausEreignis.h>
#include <Rahmen.h>
#include <Fortschritt.h>

using namespace Framework;

int getStellen( double d )
{
    int ret = 0;
    for( int i = 1; d >= i; i *= 10 )
        ret++;
    return ret;
}

// Inhalt der Ship Klasse aus Ship.h
// Konstruktor
SpielerGUI::SpielerGUI( Schrift * zSchrift )
{
    player = 0;
    ram = new LRahmen();
    ram->setSize( 200, 417 );
    ram->setFarbe( 0xFFFFFFFF );
    spieler = initTextFeld( 5, 5, 190, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
    stabilit�t = initTextFeld( 5, 30, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
    energie = initTextFeld( 5, 55, 165, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
    stabilit�tB = new FBalken();
    stabilit�tB->setPosition( 5, 30 );
    stabilit�tB->setSize( 165, 20 );
    stabilit�tB->setHintergrundFarbe( 0xFF000000 );
    stabilit�tB->setFBgFarbe( 0xFF55FF55 );
    stabilit�tB->setRahmenFarbe( 0xFF00FF00 );
    stabilit�tB->setRahmenBreite( 1 );
    stabilit�tB->setFRFarbe( 0xFF00FF00 );
    stabilit�tB->setFRBreite( 1 );
    stabilit�tB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
    energieB = new FBalken();
    energieB->setPosition( 5, 55 );
    energieB->setSize( 165, 20 );
    energieB->setHintergrundFarbe( 0xFF000000 );
    energieB->setFBgFarbe( 0xFF5555FF );
    energieB->setRahmenFarbe( 0xFF0000FF );
    energieB->setRahmenBreite( 1 );
    energieB->setFRFarbe( 0xFF0000FF );
    energieB->setFRBreite( 1 );
    energieB->setStyle( FBalken::Style::Sichtbar | FBalken::Style::L_R | FBalken::Style::Hintergrund | FBalken::Style::FFarbe | FBalken::Style::Rahmen | FBalken::Style::FRahmen );
    reparatur = initTextFeld( 5, 80, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    akkuLeistung = initTextFeld( 5, 105, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    wendigkeit = initTextFeld( 5, 130, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    beschleunigung = initTextFeld( 5, 155, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    antriebEffizienz = initTextFeld( 5, 180, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    laserIntensit�t = initTextFeld( 5, 205, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    laserEffizienz = initTextFeld( 5, 230, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    laserTempo = initTextFeld( 5, 255, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    energieSchild = initTextFeld( 5, 280, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    energieSchildEffizienz = initTextFeld( 5, 305, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    netzwerk = initTextFeld( 5, 330, 165, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    stabilit�tSkill = initKnopf( 172, 30, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    energieSkill = initKnopf( 172, 55, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    reparaturSkill = initKnopf( 172, 80, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    akkuLeistungSkill = initKnopf( 172, 105, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    wendigkeitSkill = initKnopf( 172, 130, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    beschleunigungSkill = initKnopf( 172, 155, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    antriebEffizienzSkill = initKnopf( 172, 180, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    laserIntensit�tSkill = initKnopf( 172, 205, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    laserEffizienzSkill = initKnopf( 172, 230, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    laserTempoSkill = initKnopf( 172, 255, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    energieSchildSkill = initKnopf( 172, 280, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    energieSchildEffizienzSkill = initKnopf( 172, 305, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    netzwerkSkill = initKnopf( 172, 330, 20, 20, zSchrift, Knopf::Style::Sichtbar, "+" );
    stabilit�tSkill->removeStyle( Knopf::Style::Erlaubt );
    energieSkill->removeStyle( Knopf::Style::Erlaubt );
    reparaturSkill->removeStyle( Knopf::Style::Erlaubt );
    akkuLeistungSkill->removeStyle( Knopf::Style::Erlaubt );
    wendigkeitSkill->removeStyle( Knopf::Style::Erlaubt );
    beschleunigungSkill->removeStyle( Knopf::Style::Erlaubt );
    laserIntensit�tSkill->removeStyle( Knopf::Style::Erlaubt );
    laserEffizienzSkill->removeStyle( Knopf::Style::Erlaubt );
    laserTempoSkill->removeStyle( Knopf::Style::Erlaubt );
    energieSchildSkill->removeStyle( Knopf::Style::Erlaubt );
    energieSchildEffizienzSkill->removeStyle( Knopf::Style::Erlaubt );
    netzwerkSkill->removeStyle( Knopf::Style::Erlaubt );
    skillPoints = initTextFeld( 5, 355, 180, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    speed = initTextFeld( 5, 380, 180, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::VCenter, "" );
    renderer = new TextRenderer( zSchrift );
    ref = 1;
}

// Destruktor
SpielerGUI::~SpielerGUI()
{
    player->release();
    ram->release();
    spieler->release();
    stabilit�t->release();
    energie->release();
    stabilit�tB->release();
    energieB->release();
    reparatur->release();
    akkuLeistung->release();
    wendigkeit->release();
    beschleunigung->release();
    antriebEffizienz->release();
    laserIntensit�t->release();
    laserEffizienz->release();
    laserTempo->release();
    energieSchild->release();
    energieSchildEffizienz->release();
    netzwerk->release();
    stabilit�tSkill->release();
    energieSkill->release();
    reparaturSkill->release();
    akkuLeistungSkill->release();
    wendigkeitSkill->release();
    beschleunigungSkill->release();
    antriebEffizienzSkill->release();
    laserIntensit�tSkill->release();
    laserEffizienzSkill->release();
    laserTempoSkill->release();
    energieSchildSkill->release();
    energieSchildEffizienzSkill->release();
    netzwerkSkill->release();
    skillPoints->release();
    speed->release();
    renderer->release();
}

// nicht constant
void SpielerGUI::update( Spieler * zSpieler )
{
    if( !player )
        player = (Spieler *)zSpieler->getThis();
    spieler->setText( zSpieler->name->getText() );
    spieler->setSchriftFarbe( zSpieler->farbe );
    Text txt;
    txt.setPrecision( getStellen( zSpieler->stabilit�t ) + 2 );
    txt = zSpieler->stabilit�t;
    txt += "/";
    txt.setPrecision( getStellen( zSpieler->maxStabilit�t ) + 2 );
    txt += zSpieler->maxStabilit�t;
    int pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->maxStabilit�t ) + 2 );
    txt += zSpieler->zteam->maxStabilit�t;
    txt += ")";
    stabilit�t->setText( txt );
    stabilit�t->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    stabilit�tB->reset();
    stabilit�tB->setAktionAnzahl( (int)( zSpieler->maxStabilit�t + zSpieler->zteam->maxStabilit�t ) );
    stabilit�tB->aktionPlus( (int)( zSpieler->stabilit�t ) );
    txt.setPrecision( getStellen( zSpieler->energie ) + 2 );
    txt = zSpieler->energie;
    txt += "/";
    txt.setPrecision( getStellen( zSpieler->maxEnergie ) + 2 );
    txt += zSpieler->maxEnergie;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->maxEnergie ) + 2 );
    txt += zSpieler->zteam->maxEnergie;
    txt += ")";
    energie->setText( txt );
    energie->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    energieB->reset();
    energieB->setAktionAnzahl( (int)( zSpieler->maxEnergie + zSpieler->zteam->maxEnergie ) );
    energieB->aktionPlus( (int)( zSpieler->energie ) );
    txt = "Reparatur:";
    txt.setPrecision( getStellen( zSpieler->reparatur ) + 2 );
    txt += zSpieler->reparatur;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->reparatur ) + 2 );
    txt += zSpieler->zteam->reparatur;
    txt += ")";
    reparatur->setText( txt );
    reparatur->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Akku:";
    txt.setPrecision( getStellen( zSpieler->akkuLeistung ) + 2 );
    txt += zSpieler->akkuLeistung;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->akkuLeistung ) + 2 );
    txt += zSpieler->zteam->akkuLeistung;
    txt += ")";
    akkuLeistung->setText( txt );
    akkuLeistung->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Wendigkeit:";
    txt.setPrecision( getStellen( zSpieler->wendigkeit ) + 2 );
    txt += zSpieler->wendigkeit;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->wendigkeit ) + 2 );
    txt += zSpieler->zteam->wendigkeit;
    txt += ")";
    wendigkeit->setText( txt );
    wendigkeit->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Beschleunigung:";
    txt.setPrecision( getStellen( zSpieler->beschleunigung ) + 2 );
    txt += zSpieler->beschleunigung;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->beschleunigung ) + 2 );
    txt += zSpieler->zteam->beschleunigung;
    txt += ")";
    beschleunigung->setText( txt );
    beschleunigung->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Antrieb effizienz:";
    txt.setPrecision( getStellen( zSpieler->antriebEffizienz ) + 2 );
    txt += zSpieler->antriebEffizienz;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->antriebEffizienz ) + 2 );
    txt += zSpieler->zteam->antriebEffizienz;
    txt += ")";
    antriebEffizienz->setText( txt );
    antriebEffizienz->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Laser intensit�t:";
    txt.setPrecision( getStellen( zSpieler->laserIntensit�t ) + 2 );
    txt += zSpieler->laserIntensit�t;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->laserIntensit�t ) + 2 );
    txt += zSpieler->zteam->laserIntensit�t;
    txt += ")";
    laserIntensit�t->setText( txt );
    laserIntensit�t->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Laser effizienz:";
    txt.setPrecision( getStellen( zSpieler->laserEffizienz ) + 2 );
    txt += zSpieler->laserEffizienz;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->laserEffizienz ) + 2 );
    txt += zSpieler->zteam->laserEffizienz;
    txt += ")";
    laserEffizienz->setText( txt );
    laserEffizienz->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Laser tempo:";
    txt.setPrecision( getStellen( zSpieler->laserTempo ) + 2 );
    txt += zSpieler->laserTempo;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->laserTempo ) + 2 );
    txt += zSpieler->zteam->laserTempo;
    txt += ")";
    laserTempo->setText( txt );
    laserTempo->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Energie Schild:";
    txt.setPrecision( getStellen( zSpieler->energieSchild ) + 2 );
    txt += zSpieler->energieSchild;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->energieSchild ) + 2 );
    txt += zSpieler->zteam->energieSchild;
    txt += ")";
    energieSchild->setText( txt );
    energieSchild->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Schild effizienz:";
    txt.setPrecision( getStellen( zSpieler->energieSchildEffizienz ) + 2 );
    txt += zSpieler->energieSchildEffizienz;
    pos = txt.getLength();
    txt += "(+";
    txt.setPrecision( getStellen( zSpieler->zteam->energieSchildEffizienz ) + 2 );
    txt += zSpieler->zteam->energieSchildEffizienz;
    txt += ")";
    energieSchildEffizienz->setText( txt );
    energieSchildEffizienz->setSchriftFarbe( pos, txt.getLength(), 0xFF00FF00 );
    txt = "Netzwerk:";
    txt.setPrecision( getStellen( zSpieler->netzwerk ) + 2 );
    txt += zSpieler->netzwerk;
    netzwerk->setText( txt );
    stabilit�tSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    energieSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    reparaturSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    akkuLeistungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    wendigkeitSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    beschleunigungSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    antriebEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    laserIntensit�tSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    laserEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    laserTempoSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    energieSchildSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    energieSchildEffizienzSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    netzwerkSkill->setStyle( Knopf::Style::Erlaubt, zSpieler->hatSkill() );
    skillPoints->setText( Text( zSpieler->skillPunkte ) += " Punkte" );
}

int SpielerGUI::doMausEreignis( MausEreignis & me )
{
    me.mx -= ram->getX();
    me.my -= ram->getY();
    if( me.mx < 0 || me.my < 0 )
    {
        me.mx += ram->getX();
        me.my += ram->getY();
        return -1;
    }
    int aktion = me.verarbeitet;
    stabilit�tSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 2;
    energieSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 3;
    reparaturSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 4;
    antriebEffizienzSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 12;
    laserIntensit�tSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 5;
    laserEffizienzSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 6;
    laserTempoSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 7;
    beschleunigungSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 8;
    wendigkeitSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 9;
    netzwerkSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 10;
    akkuLeistungSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 11;
    energieSchildSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 13;
    energieSchildEffizienzSkill->doMausEreignis( me );
    if( !aktion && me.verarbeitet && me.id == ME_RLinks )
        aktion = 14;
    me.mx += ram->getX();
    me.my += ram->getY();
    if( aktion > 1 )
        return aktion - 2;
    return -1;
}

bool SpielerGUI::tick( double tickVal )
{
    bool ret = stabilit�tSkill->tick( tickVal );
    ret |= energieSkill->tick( tickVal );
    ret |= reparaturSkill->tick( tickVal );
    ret |= akkuLeistungSkill->tick( tickVal );
    ret |= wendigkeitSkill->tick( tickVal );
    ret |= beschleunigungSkill->tick( tickVal );
    ret |= antriebEffizienzSkill->tick( tickVal );
    ret |= laserIntensit�tSkill->tick( tickVal );
    ret |= laserEffizienzSkill->tick( tickVal );
    ret |= laserTempoSkill->tick( tickVal );
    ret |= energieSchildSkill->tick( tickVal );
    ret |= energieSchildEffizienzSkill->tick( tickVal );
    ret |= netzwerkSkill->tick( tickVal );
    return ret;
}

void SpielerGUI::render( Bild & zRObj )
{
    ram->setPosition( Punkt( zRObj.getBreite() - 210, 10 ) );
    zRObj.alphaRegion( ram->getX() + 1, ram->getY() + 1, ram->getBreite() - 2, ram->getHeight() - 2, 0xA0000000 );
    ram->render( zRObj );
    if( !zRObj.setDrawOptions( ram->getPosition() + Punkt( 1, 1 ), ram->getSize() - Punkt( 2, 2 ) ) )
        return;
    spieler->render( zRObj );
    stabilit�tB->render( zRObj );
    stabilit�t->render( zRObj );
    stabilit�tSkill->render( zRObj );
    energieB->render( zRObj );
    energie->render( zRObj );
    energieSkill->render( zRObj );
    reparatur->render( zRObj );
    reparaturSkill->render( zRObj );
    akkuLeistung->render( zRObj );
    akkuLeistungSkill->render( zRObj );
    wendigkeit->render( zRObj );
    wendigkeitSkill->render( zRObj );
    beschleunigung->render( zRObj );
    beschleunigungSkill->render( zRObj );
    antriebEffizienz->render( zRObj );
    antriebEffizienzSkill->render( zRObj );
    laserIntensit�t->render( zRObj );
    laserIntensit�tSkill->render( zRObj );
    laserEffizienz->render( zRObj );
    laserEffizienzSkill->render( zRObj );
    laserTempo->render( zRObj );
    laserTempoSkill->render( zRObj );
    energieSchild->render( zRObj );
    energieSchildSkill->render( zRObj );
    energieSchildEffizienz->render( zRObj );
    energieSchildEffizienzSkill->render( zRObj );
    netzwerk->render( zRObj );
    netzwerkSkill->render( zRObj );
    skillPoints->render( zRObj );
    if( player )
    {
        Text txt( "Geschwindigkeit: " );
        float sp = player->speed.getLength();
        txt.setPrecision( getStellen( sp ) + 2 );
        txt += sp;
        txt += " p/s";
        speed->setText( txt );
        speed->render( zRObj );
        zRObj.drawLinieH( 5, ram->getHeight() - 12, ram->getBreite() - 12, 0xFFFFFFFF );
        zRObj.drawLinieH( 5, ram->getHeight() - 7, ram->getBreite() - 12, 0xFFFFFFFF );
        zRObj.drawLinieV( 5, ram->getHeight() - 12, 5, 0xFFFFFFFF );
        zRObj.drawLinieV( ram->getBreite() - 7, ram->getHeight() - 12, 5, 0xFFFFFFFF );
        zRObj.fillRegion( 5, ram->getHeight() - 12, (int)( ( ram->getBreite() - 12 ) * ( player->getEp() / player->getMaxEp() ) ), 5, 0xFFFFFFFF );
    }
    zRObj.releaseDrawOptions();
    int anz = player->activeSkills->getEintragAnzahl();
    int x = zRObj.getBreite() - anz * 51 - 1 - 220;
    int y = zRObj.getHeight() - 56;
    int index = 0;
    for( auto s = player->activeSkills->getIterator(); s; s++ )
    {
        s->render( x + 1, y + 1, zRObj );
        zRObj.drawLinieH( x, y, 51, 0xFFFFFFFF );
        zRObj.drawLinieH( x, y + 55, 51, 0xFFFFFFFF );
        zRObj.drawLinieV( x, y, 56, 0xFFFFFFFF );
        zRObj.drawLinieV( x + 51, y, 56, 0xFFFFFFFF );
        renderer->renderText( x + 3, y + 3, Text( ++index ), zRObj, 0xFFFFFF );
        x += 51;
    }
}

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

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