use std::time::Duration;

use baseview::{Event, Window, WindowHandler, WindowScalePolicy};


#[derive(Debug, Clone)]
enum Message {
    Hello
}


struct OpenWindowExample;


impl WindowHandler for OpenWindowExample {
    type Message = Message;

    fn on_frame(&mut self) {}

    fn on_event(&mut self, _window: &mut Window, event: Event) {
        match event {
            Event::Mouse(e) => println!("Mouse event: {:?}", e),
            Event::Keyboard(e) => println!("Keyboard event: {:?}", e),
            Event::Window(e) => println!("Window event: {:?}", e),
        }
    }

    fn on_message(&mut self, _window: &mut Window, message: Self::Message) {
        println!("Message: {:?}", message);
    }
}


fn main() {
    let window_open_options = baseview::WindowOpenOptions {
        title: "baseview".into(),
        size: baseview::Size::new(512.0, 512.0),
        scale: WindowScalePolicy::SystemScaleFactor,
        parent: baseview::Parent::None,
    };

    let (mut handle, opt_app_runner) = Window::open(
        window_open_options,
        |_| OpenWindowExample
    );

    ::std::thread::spawn(move || {
        loop {
            ::std::thread::sleep(Duration::from_secs(5));

            if let Err(_) = handle.try_send_message(Message::Hello){
                println!("Failed sending message");
            }
        }
    });

    opt_app_runner.unwrap().app_run_blocking();
}