#include "graphics.hpp"
#include <iostream>
#include <vector>
#include <fstream>

#include "widget.h"
#include "color.h"
#include "focus.h"

using namespace genv;
using namespace std;

/// ---- Konstansok ------------------
// rajzvászon mérete
const unsigned int X = 700;
const unsigned int Y = 500;

const unsigned int t = 40;  // timer idõköze

/// ---- Vezérlők --------------------
#include "widget.h"
#include "label.h"
#include "checkbox.h"
#include "textbox.h"
#include "scrollBar.h"
#include "listBox.h"

vector<widget*> widgets;

label* label1;
label* label2;
scrollBar* scrollBar1;
scrollBar* scrollBar2;
label* label3;
label* label4;
textBox* textBox1;
textBox* textBox2;
listBox* listBox1;
listBox* listBox2;

/// ---- Függvények ------------------
// Ablak törlése
inline void scrClear()
{
    colorize(BackgroundColor);
    gout << move_to(0,0) << box(X,Y);
}

// Általános billentyűvezérlés, gyorsbillentyűk
bool keyEvents(event &ev)
{
    static int i = 0;
    if (ev.keycode == key_tab)
    {
        focus::next();
        return true;
    }
    else if (ev.keycode == key_enter)
    {
        listBox1->addItem(textBox1->getText());
        listBox2->addItem(textBox2->getText());
    }
    else if (ev.keycode == key_f5)
    {
        ofstream f("data.txt");
        f << scrollBar1->getValue() << endl;
        f << scrollBar2->getValue() << endl << endl;
        for (unsigned int i = 0; i < listBox1->getCount(); i++)
            f << listBox1->getItem(i) << endl;
        f << endl;
        for (unsigned int i = 0; i < listBox2->getCount(); i++)
            f << listBox2->getItem(i) << endl;
    }
    return false;
}

/// ---- Main ------------------------
int main ()
{
    gout.open(X,Y);

    label1 = new label(50,20,150,30);
    label2 = new label(50,40,150,30);
    scrollBar1 = new scrollBar(50 , 80, 300, horizontal, -5, 5);
    scrollBar2 = new scrollBar(50 , 110, 300, horizontal, 0, 100);
    label3 = new label(370,80,30,20);
    label4 = new label(370,110,30,20);
    textBox1 = new textBox(50,150,150,30, "Szoveg 1");
    textBox2 = new textBox(250,150,150,30, "Szoveg 2");
    vector<string> temp = { "Elso elem", "Masodik elem", "Harmadik elem" };
    listBox1 = new listBox(50,200, 150,200, temp);
    listBox2 = new listBox(250, 200, 150,200, temp);

    widgets.push_back(label1);
    widgets.push_back(label2);
    widgets.push_back(scrollBar1);
    widgets.push_back(scrollBar2);
    widgets.push_back(label3);
    widgets.push_back(label4);
    widgets.push_back(textBox1);
    widgets.push_back(textBox2);
    widgets.push_back(listBox1);
    widgets.push_back(listBox2);

    label1->autoSize = true;
    label2->autoSize = true;
    label1->setText("Enter: Textboxok tartalmanak hozzaadasa a listahoz.");
    label2->setText("F5: Widgetek tartalmanak mentese");
    label3->background = true;
    label4->background = true;
    label3->setMargin(0,0);
    label4->setMargin(0,0);
    textBox1->align = align_left;
    textBox2->align = align_left;
    label3->align = align_center;
    label4->align = align_center;

    event ev;
    gin.timer(t);
    while (gin >> ev && ev.keycode != key_escape)
    {
        scrClear();

        // Általános billentyűparancsok kezelése (pl.: tab)
        if (ev.type == ev_key && keyEvents(ev)) continue;

        // Vezérlők kirajzolása
        for (unsigned int i = 0; i < widgets.size(); i++)
            widgets[i]->draw();

        // Ha több elemhez is eljutna az esemény, akkor csak a legfelső kapja meg, és az kerüljön fókuszba
        for (int i = widgets.size()-1; i >= 0; i--)
            if (widgets[i]->event(ev)) { focus::setFocus(i); break; }

        label3->setText(convert(scrollBar1->getValue()));
        label4->setText(convert(scrollBar2->getValue()));

        gout << refresh;

    }

    delete label1;
    delete label2;
    delete scrollBar1;
    delete scrollBar2;
    delete label3;
    delete label4;
    delete textBox1;
    delete textBox2;
    delete listBox1;
    delete listBox2;

    return 0;
}
