#include "cascademenubutton.h"
#include "menudrop.h"

CascadeMenuButton::CascadeMenuButton(const std::string& text, const std::shared_ptr<kku::CoreFactory>& factory, unsigned int font_size) :
    Button(text, factory, font_size)
{
    _color_idle = kku::Color{230, 230, 230, 255};
    _color_hover = kku::Color{84, 158, 253, 255};

    _button_content = factory->getRectangle();
    _button_content->setColor(_color_idle);
}

void CascadeMenuButton::input(const kku::SystemEvent& event)
{
    if (!_submenu)
        return;

    switch (event.type)
    {
    default:
        break;

    case kku::SystemEvent::Type::MouseMove:
    {
        const auto position = std::get<kku::SystemEvent::Mouse>(event.data).position;
        if (isUnderMouse(position))
        {
            _button_content->setColor(_color_hover);
            _submenu->lock();
            _submenu->setVisibility(true);
        }
        else
        {
            _submenu->unlock();
            if (!_submenu->isVisible())
            {
                _button_content->setColor(_color_idle);
            }
        }
        break;
    }

    }
}

void CascadeMenuButton::setRect(const kku::Area<float>& rect)
{
    Button::setRect(rect);
    resetRect();
}

void CascadeMenuButton::setSubmenu(const std::shared_ptr<MenuDrop>& submenu)
{
    _submenu = submenu;
    resetRect();
}

const std::shared_ptr<MenuDrop> CascadeMenuButton::submenu() const
{
    return _submenu;
}

void CascadeMenuButton::resetRect()
{
    if (_submenu)
    {
        _submenu->setPosition(kku::Point{_button_content->getPosition().x + _button_content->getRect().width,
                                         _button_content->getPosition().y});
    }
}

void CascadeMenuButton::setFillColors(kku::Color&& idle_color, kku::Color&& hover_color)
{
    _color_idle = idle_color;
    _color_hover = hover_color;
}
