#include "graphics.hpp"
#include <cmath>
#include <vector>
#include "vektor.h"

using namespace std;
using namespace genv;

const unsigned char elemSzelesseg = 20;
const unsigned char elemMagassag = 20;
const unsigned int X = 800;
const unsigned int Y = 800;

struct elem
{
    vektor h, v;
    unsigned char r,g,b;
    vector<elem*> kapcsolatok;
    bool aktiv;
    elem(float x0, float y0)
    {
        h.x = x0;
        h.y = y0;
        r = g = 200; b = 230;
        aktiv = true;
        rajzol();
    }
    void rajzol ()
    {
        gout << color(r + aktiv*50, g + aktiv*30, b - aktiv*30) << move_to(h.x,h.y) << box(elemSzelesseg,elemMagassag);
        gout << color(100,100,100);
        for (unsigned int i = 0; i < kapcsolatok.size(); i++)
        {
            gout << move_to(h.x + elemSzelesseg/2, h.y + elemMagassag/2);
            gout << line_to(kapcsolatok[i]->h.x + elemSzelesseg/2, kapcsolatok[i]->h.y + elemMagassag/2);
        }
    }
    void mozgat()
    {
        vektor erok;
        vektor temp;
        for (unsigned int i = 0; i < kapcsolatok.size(); i++)
        {
            temp = (kapcsolatok[i]->h - h);
            if (temp.hossz() < 95) erok -= (temp / temp.hossz()*1.5);
            else if (temp.hossz() > 105) erok += (temp / temp.hossz()*1.5);
        }
        if (erok.hossz() != 0) h += erok/erok.hossz();
        rajzol();
    }
    void kapcsol(elem* mit)
    {
        kapcsolatok.push_back(mit);
    }
};


int main()
{
    gout.open(X,Y);
    gin.timer(30);
    vector<elem*> elemek;
    bool kattintott;
    elem* aktivElem = 0;
    event ev;

    while(gin >> ev && ev.keycode != key_escape)
    {
        kattintott = false;
        gout << color(0,0,0) << move_to(0,0) << box (X,Y);

        for (unsigned int i = 0; i < elemek.size(); i++)
            {//elemek[i].esemeny(ev, aktiv, kattintValamelyikre);
                if (!kattintott && ev.type == ev_mouse &&
                  elemek[i]->h.x < ev.pos_x && ev.pos_x < elemek[i]->h.x + elemSzelesseg &&
                   elemek[i]->h.y < ev.pos_y && ev.pos_y < elemek[i]->h.y + elemMagassag)
                {
                    if (ev.button == btn_right)
                    {
                        aktivElem->aktiv = false;
                        elemek[i]->aktiv = true;
                        aktivElem = elemek[i];
                    }
                    else if (ev.button == btn_left && !elemek[i]->aktiv)
                    {
                        elemek[i]->kapcsol(aktivElem);
                        aktivElem->kapcsol(elemek[i]);
                    }
                    kattintott = true;
                }

                else if (ev.type == ev_timer) elemek[i]->mozgat();

                elemek[i]->rajzol();
            }

        if (ev.button == btn_right && !kattintott)
        {
            aktivElem->h.x += (ev.pos_x - aktivElem->h.x)/2;
            aktivElem->h.y += (ev.pos_y - aktivElem->h.y)/2;
        }


        if (ev.type == ev_mouse && ev.button == btn_left && !kattintott)
        {
            elemek.push_back(new elem (ev.pos_x - elemSzelesseg/2, ev.pos_y - elemMagassag/2));
            if (aktivElem) aktivElem->aktiv = false;
            aktivElem = elemek[elemek.size()-1];
        }

        if (aktivElem)
        {
            gout << color(250,0,0) << move_to(aktivElem->h.x - 5, aktivElem->h.y - 5) << line(elemSzelesseg + 10, 0);
            gout << line(0, elemMagassag + 10) << line(-elemSzelesseg - 10,0) << line(0, -elemMagassag - 10);
        }
        gout << refresh;
    }
    for (unsigned int i = 0; i < elemek.size(); i++)
        delete elemek[i];
    return 0;
}
