#include "editor.h"
#include "widgets/button.h"
#include "widgets/group.h"
#include "widgets/menubar.h"
#include "tools/bpmcalculator.h"

#include <iostream>

Editor::Editor(sf::RenderWindow& game_window, Callbacks&& callbacks, std::unique_ptr<Music>&& music, const FontHolder& font_holder) :
    _game_window(game_window),
    _music(std::move(music)),
    _bpm_calculator(std::make_unique<BPMCalculator>(_music))
{
    (void)callbacks;
    const float window_width = game_window.getSize().x;
    //const float window_height = game_window.getSize().y;

    _menu_bar = std::make_shared<MenuBar>(font_holder.get(Fonts::Id::GUI));

    auto bpm_button = std::make_shared<PushButton>("Play song :)", font_holder.get(Fonts::Id::GUI));
    bpm_button->setCallback([&]()
                            {
                                _bpm_calculator->startListening(0);
                            });

    auto test_menu_2 = std::make_shared<MenuDrop>();
    test_menu_2->setRect(sf::FloatRect{0, 0, 200, 27 * 5});

    auto test_cascade_button = std::make_shared<CascadeMenuButton>("Show submenu", font_holder.get(Fonts::Id::GUI));

    auto quit_button = std::make_shared<PushButton>("Quit", font_holder.get(Fonts::Id::GUI));
    quit_button->setCallback(callbacks.onLeaveEditorState);

    auto test_menu = std::make_shared<MenuDrop>();
    test_menu->setRect(sf::FloatRect{0, 0, 200, 27 * 3});

    _menu_bar->setRect(sf::FloatRect(0, 0, window_width, 27));
    _menu_bar->addSubMenu("test", test_menu);

    test_cascade_button->setSubmenu(test_menu_2);

    test_menu->addPushButton(bpm_button);
    test_menu->addCascadeButton(test_cascade_button);
    test_menu->addPushButton(quit_button);

    test_cascade_button->resetRect(test_menu_2);

    _music->openFromFile("Uta-test.flac");
    _music->setVolume(5);
}

void Editor::input(const sf::Event& event)
{
    _menu_bar->input(event);

    if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space)
    {
        _bpm_calculator->click();
        std::cout << _bpm_calculator->getCurrentApproximation() << '\n';
    }
}

void Editor::update()
{
    _menu_bar->update();
}

void Editor::draw() const
{
    _game_window.draw(*_menu_bar);
}

void Editor::enter()
{
    _menu_bar->setVisibility();
}

void Editor::leave()
{
    _menu_bar->setVisibility(false);
}