#include "News.h"
#include <DateiSystem.h>
#include <Bildschirm.h>
#include <Punkt.h>
#include <Textfeld.h>
#include <Schrift.h>
#include <Datei.h>
#include <InitDatei.h>

void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
{
	if( !p )
		return;
	( (News*)p )->rückruf( parameter, ret );
}

// Inhalt der News Klasse aus News.h
// Konstruktor
News::News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client )
{
    this->client = client;
	ref = 1;
	// Ladeanimation laden
	Animation2DData *aData = new Animation2DData();
	LTDBDatei *aDatei = new LTDBDatei();
	aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
	aDatei->leseDaten( 0 );
	aData->ladeAnimation( aDatei );
	aData->setFPS( 30 );
	aData->setWiederhohlend( 1 );
	aData->setTransparent( 0 );
	laden = new Animation2D();
	laden->setPosition( zB->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
	laden->setSize( 50, 50 );
	laden->setAPS( 450 );
	laden->setAnimationDataZ( aData );
	laden->setRahmen( 1 );
	laden->setRahmenBreite( 1 );
	laden->setRahmenFarbe( 0xFFFFFFFF );
	laden->setSichtbar( 0 );
	zB->setOnTopZeichnung( laden );
	// Fehler Textfeld Initialisieren
	fehler = new TextFeld();
	fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar );
	fehler->setPosition( 10, 60 );
	fehler->setSize( 480, 312 );
	fehler->setSchriftFarbe( 0xFFFFFFFF );
	fehler->setSchriftZ( zS->getThis() );
	fehler->setText( "Fehler beim Laden der Seite!\n" );
	zB->addMember( fehler );
	// Startwerte Initialisieren
	screen = zB->getThis();
	schrift = zS->getThis();
	// DLL Datei Laden
	ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" );
	if( !ksgsDll )
	{ // Error
		fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." );
		fehler->addStyle( TextFeld::Style::Sichtbar );
		laden->setSichtbar( 0 );
		screen->setOnTop( 0 );
		run = 0;
		return;
	}
	KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION );
	if( !getKSGSZeichnung )
	{ // Error
		fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." );
		fehler->addStyle( TextFeld::Style::Sichtbar );
		laden->setSichtbar( 0 );
		screen->setOnTop( 0 );
		run = 0;
		return;
	}
	frame = getKSGSZeichnung();
	if( !frame )
	{ // Error
		fehler->addZeile( "Unbekannter Fehler." );
		fehler->addStyle( TextFeld::Style::Sichtbar );
		laden->setSichtbar( 0 );
		screen->setOnTop( 0 );
		run = 0;
		return;
	}
	frame->setSchriftZ( schrift->getThis() );
	frame->setBildschirmZ( screen->getThis() );
	frame->setPosition( 10, 60 );
	frame->setSize( 480, 312 );
	frame->setRückrufParam( this );
	frame->setRückrufFunktion( KSGSRückruf );
	screen->addMember( frame );
	scriptName = new Text( "Patcher/Start" );
	// Lade Thread starten
	start();
}

// Destruktor
News::~News()
{
	warteAufThread( INFINITE );
    if( client )
    {
        client->trenne( 1 );
        client->release();
    }
    if( frame )
    {
        frame->zurücksetzen();
        frame->release();
    }
	if( ksgsDll )
		FreeLibrary( ksgsDll );
	if( scriptName )
		scriptName->release();
	laden->release();
	screen->release();
	fehler->release();
	schrift->release();
}

// nicht constant
void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
{
	if( isRunning() )
		return;
	KSGSVariable *bef = parameter->z( 0 );
	if( !bef )
		return;
	Text *sn = bef->getText();
	if( !sn || !sn->getLength() )
	{
		if( sn )
			sn->release();
		return;
	}
	scriptName->setText( sn->getText() );
	sn->release();
	start();
}

void News::thread()
{
	screen->setOnTop( 1 );
	laden->setSichtbar( 1 );
	frame->zurücksetzen();
	// KSGScript Seite Herunterladen
    if( client )
    {
        if( !client->verbinde() )
        {
            fehler->addZeile( "Fehler beim verbinden mit dem News-Server." );
            fehler->addStyle( TextFeld::Style::Sichtbar );
            laden->setSichtbar( 0 );
            screen->setOnTop( 0 );
            return;
        }
        if( !client->ladeSeite( scriptName->getText() ) )
        {
            client->trenne( 0 );
            fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." );
            fehler->addStyle( TextFeld::Style::Sichtbar );
            laden->setSichtbar( 0 );
            screen->setOnTop( 0 );
            return;
        }
        client->trenne( 0 );
    }
    else
    {
        fehler->addZeile( "Es steht kein News Client zur Verfügung." );
        fehler->addStyle( TextFeld::Style::Sichtbar );
        laden->setSichtbar( 0 );
        screen->setOnTop( 0 );
        return;
    }
	// KSGScript Laden
	Text *pfad = new Text( "data/tmp/news/" );
	pfad->append( scriptName->getText() );
	pfad->append( "/seite.ksgs" );
	frame->setScriptDatei( pfad );
	if( !frame->neuLaden() )
	{ // error
		fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
		fehler->addStyle( TextFeld::Style::Sichtbar );
		laden->setSichtbar( 0 );
		screen->setOnTop( 0 );
		run = 0;
		return;
	}
	laden->setSichtbar( 0 );
	screen->setOnTop( 0 );
	run = 0;
}

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

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