#include <ui/App.h>
#include <ui/Layout.h>

struct ColorWidget : public ui::Widget
{
  public:
    ColorWidget(ui::Color first, ui::Color second) : m_color(first), m_first_color(first), m_second_color(second)
    {
    }

    Result<ui::EventResult> handle_mouse_move(ui::Point) override
    {
        m_color = m_second_color;
        return ui::EventResult::DidHandle;
    }

    Result<ui::EventResult> handle_mouse_leave(ui::Point) override
    {
        m_color = m_first_color;
        return ui::EventResult::DidHandle;
    }

    Result<ui::EventResult> handle_mouse_down(ui::Point, int) override
    {
        return ui::EventResult::DidNotHandle;
    }

    Result<ui::EventResult> handle_mouse_up(ui::Point, int) override
    {
        return ui::EventResult::DidNotHandle;
    }

    Result<void> draw(ui::Canvas& canvas) override
    {
        canvas.fill(m_color);
        return {};
    }

  private:
    ui::Color m_color;
    ui::Color m_first_color;
    ui::Color m_second_color;
};

Result<int> luna_main(int argc, char** argv)
{
    ui::App app;
    TRY(app.init(argc, argv));

    auto* window = TRY(ui::Window::create(ui::Rect { 200, 200, 400, 300 }));
    app.set_main_window(window);

    window->set_title("Main Window");
    window->set_background(ui::CYAN);

    ui::HorizontalLayout layout;
    window->set_main_widget(layout);

    ColorWidget green(ui::GREEN, ui::WHITE);
    layout.add_widget(green);
    ColorWidget blue(ui::BLUE, ui::GRAY);
    layout.add_widget(blue);

    ui::VerticalLayout sublayout;
    layout.add_widget(sublayout);

    ColorWidget red(ui::RED, ui::CYAN);
    sublayout.add_widget(red);
    ColorWidget white(ui::WHITE, ui::GREEN);
    sublayout.add_widget(white);

    window->draw();

    return app.run();
}