#include "Bestenliste.h"
#include "Initialisierung.h"


Bestenliste::Bestenliste( int id, UIInit& uiFactory )
    : Variable( BESTENLISTE )
{
    this->uiFactory = uiFactory;
    this->id = id;
    ram.setFarbe( 0xFFFFFFFF );
    ram.setRamenBreite( 1 );
    sichtbar = 1;
}

Bestenliste::~Bestenliste()
{}

int Bestenliste::getSpaltenBreite( int j ) const
{
    if( j == -1 )
    {
        int maxBr = 0;
        for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
        {
            if( maxBr < zeilen.z( i )->getBreite() )
                maxBr = zeilen.z( i )->getBreite();
        }
        return maxBr;
    }
    int maxBr = spalten.z( j )->getBreite();
    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
    {
        if( werte.z( i ) && werte.z( i )->z( j ) )
        {
            if( maxBr < werte.z( i )->z( j )->getBreite() )
                maxBr = werte.z( i )->z( j )->getBreite();
        }
    }
    return maxBr;
}

void Bestenliste::setSichtbar( bool sichtbar )
{
    this->sichtbar = sichtbar;
}

void Bestenliste::addSpalte( const char* name )
{
    spalten.add( initTextFeld( 0, 0, -1, -1, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
}

void Bestenliste::addZeile( const char* name )
{
    zeilen.add( initTextFeld( 0, 0, -1, -1, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
}

void Bestenliste::setWert( const char* spalte, const char* zeile, const char* wert )
{
    int spalteI = 0;
    for( auto s = spalten.begin(); s; s++, spalteI++ )
    {
        if( s->zText() && s->zText()->istGleich( spalte ) )
            break;
    }
    int zeileI = 0;
    for( auto z = zeilen.begin(); z; z++, zeileI++ )
    {
        if( z->zText() && z->zText()->istGleich( zeile ) )
            break;
    }
    if( !werte.z( zeileI ) )
        werte.set( new RCArray< TextFeld >(), zeileI );
    werte.z( zeileI )->set( initTextFeld( 0, 0, -1, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, wert ), spalteI );
}

const char* Bestenliste::getWert( const char* spalte, const char* zeile )
{
    int spalteI = 0;
    for( auto s = spalten.begin(); s; s++, spalteI++ )
    {
        if( s->zText() && s->zText()->istGleich( spalte ) )
            break;
    }
    int zeileI = 0;
    for( auto z = zeilen.begin(); z; z++, spalteI++ )
    {
        if( z->zText() && z->zText()->istGleich( zeile ) )
            break;
    }
    if( !werte.z( zeileI ) || !werte.z( zeileI )->hat( spalteI ) || !werte.z( zeileI )->z( spalteI )->zText() )
        return "";
    return werte.z( zeileI )->z( spalteI )->zText()->getText();
}

void Bestenliste::render( int x, int y, Bild& rObj )
{
    ram.setPosition( x, y );
    ram.setSize( getBreite(), getHeight() );
    ram.render( rObj );
    Array<int> spaltenBr;
    x += 1;
    y += 1;
    int startX = x;
    int br = getBreite();
    int hi = getHeight();
    int ssbr = getSpaltenBreite( -1 );
    x += ssbr;
    for( int i = 0; i < spalten.getEintragAnzahl(); i++ )
    {
        rObj.drawLinieV( x++, y, hi - 2, 0xFFFFFFFF );
        int sbr = getSpaltenBreite( i );
        TextFeld* tf = spalten.z( i );
        tf->setSize( sbr, 20 );
        tf->setPosition( x, y );
        tf->render( rObj );
        x += sbr;
        spaltenBr.add( sbr );
    }
    x = startX;
    y += 20;
    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
    {
        rObj.drawLinieH( x, y++, br - 2, 0xFFFFFFFF );
        TextFeld* tf = zeilen.z( i );
        tf->setSize( ssbr, 20 );
        tf->setPosition( x, y );
        tf->render( rObj );
        x += ssbr + 1;
        for( int j = 0; j < spalten.getEintragAnzahl(); j++ )
        {
            int sbr = spaltenBr.get( j );
            TextFeld* tf = werte.z( i ) ? werte.z( i )->z( j ) : 0;
            if( tf )
            {
                tf->setSize( sbr, 20 );
                tf->setPosition( x, y );
                tf->render( rObj );
            }
            x += sbr + 1;
        }
        x = startX;
        y += 20;
    }
}

int Bestenliste::getBreite() const
{
    int br = 1;
    for( int i = -1; i < spalten.getEintragAnzahl(); i++ )
        br += getSpaltenBreite( i ) + 1;
    return br;
}

int Bestenliste::getHeight() const
{
    int hi = 22;
    for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
        hi += 21;
    return hi;
}