extern crate mini_gl_fb;

use mini_gl_fb::{glutin, GlutinBreakout};

use glutin::GlContext;

use std::cmp::{min, max};

fn main() {
    let mut fb = mini_gl_fb::gotta_go_fast("Hello world!", 800.0, 600.0);
    let mut buffer = vec![[128u8, 0, 0, 255]; 800 * 600];
    fb.update_buffer(&buffer);

    let GlutinBreakout {
        mut events_loop,
        gl_window,
        mut fb,
    } = fb.glutin_breakout();

    let mut running = true;
    let mut mouse_x = 0;
    let mut mouse_y = 0;
    let mut mouse_down = false;
    while running {
        events_loop.poll_events(|event| {
            use glutin::{Event, ElementState, VirtualKeyCode};
            use glutin::WindowEvent::*;

            match event {
                Event::WindowEvent { event: CloseRequested, .. } => {
                    running = false;
                }
                Event::WindowEvent { event: KeyboardInput { input, .. }, .. } => {
                    if let Some(k) = input.virtual_keycode {
                        if k == VirtualKeyCode::Escape && input.state == ElementState::Released {
                            running = false;
                        }
                    }
                }
                Event::WindowEvent { event: Resized(logical_size), .. } => {
                    let dpi_factor = gl_window.get_hidpi_factor();
                    gl_window.resize(logical_size.to_physical(dpi_factor));
                }
                Event::WindowEvent { event: CursorMoved { position, .. }, .. } => {
                    let dpi_factor = gl_window.get_hidpi_factor();
                    let (x, y) = position.to_physical(dpi_factor).into();
                    mouse_x = min(max(x, 0), 800 - 1);
                    mouse_y = min(max(y, 0), 600 - 1);
                    if mouse_down {
                        buffer[(mouse_x + mouse_y * 800) as usize] = [64, 128, 255, 255];
                        fb.update_buffer(&buffer);
                    }
                }
                Event::WindowEvent { event: MouseInput { state, .. }, .. } => {
                    if state == ElementState::Pressed {
                        mouse_down = true;
                    } else {
                        mouse_down = false;
                    }
                }
                _ => {}
            }
        });

        fb.redraw();
        gl_window.swap_buffers().unwrap();
    }
}