#include "core/app_menubar.h"
#include "core/log_window.h"
#include <imgui.h>

namespace fn_ui {

bool app_menubar(const PanelToggle* panels, std::size_t count,
                 LayoutCallbacks* layouts_cb,
                 ViewMenuExtrasFn view_extras,
                 void* view_extras_user) {
    if (!ImGui::BeginMainMenuBar()) return false;

    bool changed = false;

    // Menu "View" — combinamos los toggles de paneles con los extras de
    // la app (si los hay) bajo el mismo BeginMenu para que el usuario los
    // vea juntos. Si no hay panels NI extras, omitimos el menu entero.
    bool has_panels = (panels && count > 0);
    if (has_panels || view_extras) {
        if (ImGui::BeginMenu("View")) {
            if (has_panels) {
                for (std::size_t i = 0; i < count; ++i) {
                    const PanelToggle& item = panels[i];
                    if (!item.open) continue;
                    if (ImGui::MenuItem(item.label, item.shortcut, item.open)) {
                        changed = true;
                    }
                }
            }
            if (view_extras) {
                if (has_panels) ImGui::Separator();
                changed |= view_extras(view_extras_user);
            }
            ImGui::EndMenu();
        }
    }

    // Menu "Layouts" — solo si hay callbacks
    if (layouts_cb) {
        changed |= layouts_menu_items("Layouts", *layouts_cb);
    }

    // Menu "Settings" — siempre. Submenus: Settings... / Logs... / About...
    // Las ventanas se renderizan al final del frame en fn::run_app.
    if (ImGui::BeginMenu("Settings")) {
        changed |= settings_window_menu_item("Settings...");
        changed |= log_window_menu_item("Logs...");
        ImGui::Separator();
        changed |= about_window_menu_item("About...");
        ImGui::EndMenu();
    }

    ImGui::EndMainMenuBar();
    return changed;
}

} // namespace fn_ui
