#include <unistd.h>
//#include "GL/glew.h"
#include "GLUT/glut.h"
#include "TDT/application.h"
#include "TDT/window.h"


class Widget
{
public:
    int x, y, w, h;

    Widget() : hasFocus(false), x(20), y(20), w(50), h(50)
    {
    }

    void paintEvent()
    {
    }

    void enterEvent()
    {
    }

    void leaveEvent()
    {
    }

    virtual void mousePressEvent(int button, int x, int y)
    {
        printf("widget mouse down\n");
    }    

    virtual void mouseReleaseEvent(int button, int x, int y)
    {
        printf("widget mouse up\n");
    }

    void mouseMoveEvent()
    {
    }

    virtual void keyPressEvent(int cAscii, int x, int y)
    {
    }

    bool hasFocus;
};



class myWindow : public TDT::Window
{
public:
    myWindow()
    {
        widgets = new Widget *;
        widgets[0] = new Widget;
        widgetCount = 1;

        setGeometry(50, 50, 100, 100);
    }

    virtual void paintEvent(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        printf("repainting\n");

        int *pixels = (int*)backingStore();

        if ( pixels ) {
            for (int j = 0; j < height(); j++)
                for (int i = 0; i < width(); i++)
                    pixels[j*width()+i] = (i << 8) | (j << 16);
            glDrawPixels(width(), height(), GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels);
        }
 
        float size = 0.25;
        glBegin(GL_TRIANGLES); 
            glVertex3f(-1.0f*size, -1.0f*size, -1.0f*size);
            glVertex3f(+1.0f*size, -1.0f*size, -1.0f*size);
            glVertex3f(+1.0f*size, +1.0f*size, -1.0f*size);
        glEnd();
/*        
        if ( pixels ) {
            for (int j = 0; j < height(); j++)
                for (int i = 0; i < width(); i++)
                    pixels[j*width()+i] = (127 << 8) | (127 << 16) | (127 << 24) | 127;
            glDrawPixels(width(), height(), GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
        }
*/

        //glViewport( 50, 50, 100, 100 );

        //glBegin(GL_POLYGON);
            //glRectf(-0.5f,-0.5f,1.0f,1.0f);
            //glRecti(-4000000,-4000000,50,50);
        //glEnd();


        //glViewport(-50, -50, 100, 100);
        //glLoadIdentity();
        //glTranslatef(-50.0, -50.0, 0.0);
        //glPushMatrix();
        //glWindowPos2(0, -5);
        
        //glWindowPos2fARB(0.0, 10.0);
        
        //glRasterPos4f(0.5, 0.5, 0.5, 0.5);

        //glPixelTransferi(GL_UNPACK_SKIP_ROWS, 50);
        //glPixelStorei(GL_UNPACK_SKIP_ROWS, 50);

        //glPushMatrix();
        ///glLoadIdentity();
        //glPushMatrix();
        //glScalef(50.0, 50.0, 0.0f);
        //glTranslatef(0.5f, 0.5f, 0.0f);

        //glPushMatrix();

/*
        glPopMatrix();
        glPopMatrix();
        glPopMatrix();
*/
        glutSwapBuffers();
    }

    virtual void idleEvent()
    {
        //printf("idle\n");   
        usleep(100000);
    }

    virtual void resizeEvent(int w, int h)
    {
        printf("resizing\n");   
    }

    virtual void closeEvent(void)
    {
        printf("closing\n");
    }

    bool pointInWidget(int x, int y, Widget *widget)
    {
        int w2 = widget->w / 2;
        int h2 = widget->h / 2;
        int centerX = widget->x + w2;
        int centerY = widget->y + h2;
        int radius = w2*w2 + h2*h2; 

        int dx = centerX - x;
        int dy = centerY - y;
        int dist = dx*dx + dy*dy;
        if ( dist > radius )
            return false;

        int x2 = widget->x + widget->w;
        int y2 = widget->y + widget->h;
        return ( x >= widget->x && x < x2 && y >= widget->y && y < y2 );
    }

    virtual void mousePressEvent(int button, int x, int y)
    {
        printf("mouse down\n");

        for (int i = 0; i < widgetCount; i++) {
            if ( pointInWidget(x, y, widgets[i]) ) {
                widgets[i]->mousePressEvent(button, x, y);
            }
        }
    }    

    virtual void mouseReleaseEvent(int button, int x, int y)
    {
        printf("mouse up\n");

        for (int i = 0; i < widgetCount; i++) {
            if ( pointInWidget(x, y, widgets[i]) ) {
                widgets[i]->mouseReleaseEvent(button, x, y);
            }
        }
    }

    virtual void keyPressEvent(int cAscii, int x, int y)
    {       
        printf("on key down %i %i\n", x, y);
        if (cAscii == 27) { // 0x1b = ESC
            exit(0); // Close Window!
        } 
    };

    virtual void keyReleaseEvent(int cAscii, int x, int y)
    {
        printf("on key up %i %i\n", x, y);
        if (cAscii == 'f') {
            showFullScreen();
        } else if (cAscii == 'w') {
            showNormal();
        }     
    };


    Widget **widgets;
    int widgetCount;
};


int main(int argc, char *argv[])
{
    TDT::Application app(argc, argv);

    myWindow *myWin1 = new myWindow();
    myWindow *myWin2 = new myWindow();

    return app.exec();
}


