use core::ffi::c_void;

use flipperzero_sys as sys;

use crate::{app::App, scenes};

#[derive(Primitive)]
pub enum Views {
    Menu = 0,
    Popup = 1
}


pub unsafe fn view_dispatcher_init(app: &mut App) {
    sys::view_dispatcher_enable_queue(app.view_dispatcher);
    sys::view_dispatcher_set_event_callback_context(app.view_dispatcher, &*app as *const App as *mut c_void);

    sys::view_dispatcher_set_custom_event_callback(app.view_dispatcher, Some(scenes::custom_event_callback));
    sys::view_dispatcher_set_navigation_event_callback(app.view_dispatcher, Some(scenes::navigation_event_callback));

    sys::view_dispatcher_add_view(app.view_dispatcher, Views::Menu as u32, sys::menu_get_view(app.menu));
    sys::view_dispatcher_add_view(app.view_dispatcher, Views::Popup as u32, sys::popup_get_view(app.popup));
}

pub unsafe extern "C" fn app_exit(_context: *mut core::ffi::c_void) -> u32 {
    0xFFFFFFFF // Exit the view_dispatcher_run
}