#include <Bildschirm.h>
#include <RenderThread.h>
#include <KSGScript.h>
#include <MausEreignis.h>
#include <TastaturEreignis.h>
#include <Schrift.h>
#include <DateiSystem.h>
#include <time.h>
#include <Textfeld.h>
#include <Datei.h>
#include <M2Datei.h>
#include <Model2D.h>
#include <Bild.h>
#include <Textur2D.h>
#include <MiniGameV.h>
#include "Minigames.h"
#include <DateiSystem.h>
#include "DLLDateien.h"
#include <Network.h>
#include <Globals.h>
#include <iostream>
#include <string>
#include <XML.h>
#include <Zeit.h>

struct HINSTANCE__;

using namespace Framework;

void FClose( void *p, void *zF )
{
    StopNachrichtenSchleife( ( (WFenster*)zF )->getFensterHandle() );
}


Bild *b1;
Bild *b2;
Bild *b3;

class Alpha : public Zeichnung
{
public:
    void render( Bild &zRObj )
    {
        zRObj.setDrawOptions( getPosition(), Punkt( 1000, 1000 ) );
        Bild tmp;
        tmp.neuBild( 100, 100, 0 );
        tmp.drawBild( 0, 0, 100, 100, *b1 );
        tmp.alphaBildAssoz( 0, 0, 100, 100, *b2 );
        zRObj.drawBild( 0, 0, 100, 100, tmp );
        zRObj.drawBild( 0, 150, 100, 100, *b1 );
        zRObj.drawBild( 0, 250, 100, 100, *b2 );
        zRObj.releaseDrawOptions();
    }
};

class Alpha2 : public Zeichnung
{
public:
    void render( Bild &zRObj )
    {
        zRObj.setDrawOptions( getPosition(), Punkt( 1000, 1000 ) );
        Bild tmp;
        tmp.neuBild( 100, 100, 0 );
        tmp.drawBild( 0, 0, 100, 100, *b2 );
        tmp.alphaBildAssoz( 0, 0, 100, 100, *b1 );
        zRObj.drawBild( 0, 0, 100, 100, tmp );
        zRObj.drawBild( 0, 150, 100, 100, *b2 );
        zRObj.drawBild( 0, 250, 100, 100, *b1 );
        zRObj.releaseDrawOptions();
    }
};

void doStuff()
{
    Network::Start( 1 );
    WFenster *f = new WFenster();
    WNDCLASS fc = F_Normal( 0 );
    fc.lpszClassName = "Test";
    f->erstellen( WS_OVERLAPPEDWINDOW, fc );
    f->setSize( 800, 500 );
    f->setPosition( Punkt( 100, 100 ) );
    f->setVSchließAktion( FClose );
    f->setMausAktion( _ret1ME );
    f->setTastaturAktion( _ret1TE );
    f->setAnzeigeModus( 1 );
    Punkt bildschirmGröße = BildschirmGröße();
    bildschirmGröße.x++;
    bildschirmGröße.y++;
    f->setSize( bildschirmGröße );
    f->setPosition( Punkt( 0, 20 ) );
    Bildschirm *b = new Bildschirm3D( f->getThis() );
    b->setBackBufferSize( f->getKörperGröße() );
    f->setBildschirm( b->getThis() );
    b->setFillFarbe( 0xFF000000 );
    b->setTestRend( 0 );

    LTDSDatei sd;
    sd.setPfad( new Text( "normal.ltds" ) );
    sd.leseDaten();
    Schrift *schrift = sd.ladeSchrift();
    DLLDateien dlls;
    Bild tmp;
    tmp.neuBild( 500, 1000, 0x30FFFFFF );
    Bild tmp2;
    tmp2.neuBild( 1900, 1000, 0x80355768 );
    ZeitMesser m;
    //while( true )
    //{
    //    m.messungStart();
    //    for( int i = 0; i < 2000; i++ )
    //    {
    //        tmp2.alphaRegion( 0, 0, 500, 1000, 0x40468349 );
    //    }
    //    m.messungEnde();
    //    std::cout << "time: " << m.getSekunden() << "\n";
    //}

    API *api = new API( f );

    MiniGames *mGames = new MiniGames( schrift, dlls.getThis(), b, api );
    b->addMember( mGames->getThis() );
    //b1 = new Bild();
    //b1->neuBild( 100, 100, 0x7F0545FF );
    //b2 = new Bild();
    //b2->neuBild( 100, 100, 0x7F79FF45 );
    //b3 = new Bild();
    //b3->neuBild( 100, 100, 0x77FF2020 );
    //Alpha *a = new Alpha();
    //a->setPosition( 0, 0 );
    //a->setSize( 100, 100 );
    //b->addMember( a );
    //Alpha2 *a2 = new Alpha2();
    //a2->setPosition( 100, 0 );
    //a2->setSize( 100, 100 );
    //b->addMember( a2 );

    b->update();
    RenderTh *r = new RenderTh();
    r->setBildschirm( b->getThis() );
    r->setMaxFps( 60 );
    r->setTickFunktion( []( void*p, void*o, double t )
    {
        if( getTastenStand( T_F1 ) )
            std::cout << t << "\n";
    } );
    r->beginn();
    StartNachrichtenSchleife();
    r->beenden();
    r->release();
    mGames->release();
    f->setBildschirm( 0 );
    b->release();
    f->release();
    schrift->release();
    delete api;
    Network::Exit();
}

int main()
{
#ifdef _DEBUG
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
    initFramework();
    doStuff();
    releaseFramework();
    return 0;
}