#include "Bariere.h"
#include "Spiel.h"
#include "Ereignis.h"


Bariere::Bariere( int id, int x, int y, int breite, int height, int style, int verschiebungWeite, int autoSchaltungMaxTime, Team *team )
    : GameObject( BARIERE, x, y, breite, height )
{
    this->id = id;
    this->style = style;
    this->autoSchaltungMaxTime = autoSchaltungMaxTime;
    autoSchaltungCurrentTime = (float)autoSchaltungMaxTime;
    this->verschiebungWeite = verschiebungWeite;
    currentWeite = 0;
    verschiebungAnzahl = 0;
    schaltungAnzahl = 0;
    this->team = team;
}

Bariere::~Bariere()
{
    if( team )
        team->release();
}

void Bariere::setStyle( int style, bool add, Spiel *zSpiel )
{
    if( add )
    {
        if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) != this->style )
            zSpiel->setZuletztEingeschalteteBariere( (Bariere*)getThis() );
        this->style |= style;
    }
    else
    {
        if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) == this->style )
            zSpiel->setZuletztAusgeschalteteBariere( (Bariere *)getThis() );
        this->style &= ~style;
    }
}

void Bariere::setAutoVerschiebungWeite( int pixel )
{
    verschiebungWeite = pixel;
}

void Bariere::startAutoVerschiebung( Spiel *zSpiel )
{
    if( !hatStyle( Style::AutoVerschiebung ) || hatStyle( Style::InVerschiebung ) )
        return;
    zSpiel->setZuletztBewegteBariere( (Bariere *)getThis() );
    currentWeite = 0;
    setStyle( Style::InVerschiebung, 1, zSpiel );
    Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN );
    e->addParameter( "Betroffene Bariere", getThis() );
    e->addParameter( "Status", new String( "Start" ) );
    zSpiel->throwEvent( e );
}

void Bariere::setAutoSchaltungMaxTime( int seconds )
{
    autoSchaltungMaxTime = seconds;
}

void Bariere::startAutoSchaltung( Spiel *zSpiel )
{
    if( !hatStyle( Style::AutoSchaltung ) || hatStyle( Style::InSchaltung ) )
        return;
    autoSchaltungCurrentTime = (float)autoSchaltungMaxTime;
    setStyle( Style::InSchaltung, 1, zSpiel );
}

void Bariere::setTeam( Team *team )
{
    if( this->team )
        this->team->release();
    this->team = team;
}

void Bariere::tick( double time, Spiel* zSpiel)
{
    if( hatStyle( Style::InSchaltung ) )
    {
        autoSchaltungCurrentTime -= (float)time;
        if( autoSchaltungCurrentTime < 0 )
        {
            setStyle( Style::InSchaltung, 0, zSpiel );
            setStyle( Style::Aktiv, !hatStyle( Style::Aktiv ), zSpiel );
            schaltungAnzahl++;
			Ereignis* e = new Ereignis(BARIERE_SWITCHED);
			e->addParameter("Betroffene Bariere", getThis());
			zSpiel->throwEvent(e);
        }
    }
    if( hatStyle( Style::InVerschiebung ) )
    {
        float last = currentWeite;
        currentWeite += (float)time * 10;
        if( currentWeite >= verschiebungWeite )
        {
            currentWeite = (float)verschiebungWeite;
            setStyle( Style::InVerschiebung, 0, zSpiel );
            setStyle( Style::NextVerschiebungLinksOben, !hatStyle( Style::NextVerschiebungLinksOben ), zSpiel );
            verschiebungAnzahl++;
			Ereignis* e = new Ereignis(BARIERE_WIRD_VERSCHOBEN);
			e->addParameter( "Betroffene Bariere", getThis() );
			e->addParameter( "Status", new String( "Feritg" ) );
			zSpiel->throwEvent(e);
        }
        if( hatStyle( Style::VerschiebungWaagerecht ) )
        {
            if( hatStyle( Style::NextVerschiebungLinksOben ) )
                setX( getX() + last - currentWeite );
            else
                setX( getX() - last + currentWeite );
        }
        else
        {
            if( hatStyle( Style::NextVerschiebungLinksOben ) )
                setY( getX() + last - currentWeite );
            else
                setY( getX() - last + currentWeite );
        }
    }
}

bool Bariere::hatStyle( int style ) const
{
    return ( this->style | style ) == this->style;
}

int Bariere::getVerschiebungAnzahl() const
{
    return verschiebungAnzahl;
}

int Bariere::getSchaltungAnzahl() const
{
    return schaltungAnzahl;
}

int Bariere::getId() const
{
    return id;
}

Team *Bariere::getTeam() const
{
    if( !team )
        return 0;
    return (Team*)team->getThis();
}

Team *Bariere::zTeam() const
{
    return team;
}