extern crate piston_window;
extern crate clap;
extern crate rand;
extern crate find_folder;

mod game;
mod field;

use piston_window::*;
use clap::{Arg, App};

fn main() {
    let matches = App::new("Minesweeper")
        .author("Alexander Kuvaev <alexander@kuvaev.me>")
        .version("0.1")
        .about("Simple minesweeper in Rust ")
        .arg(Arg::from_usage("--width [width] 'window width'"))
        .arg(Arg::from_usage("--height [height] 'window height'"))
        .get_matches();

    let mut width = 800;
    let mut height = 600;
    if let Some(w) = matches.value_of("width") {
        width = w.parse().unwrap_or(width);
    }
    if let Some(h) = matches.value_of("height") {
        height = h.parse().unwrap_or(height);
    }

    let window: PistonWindow =
        WindowSettings::new("Minesweeper", [width, height])
        .exit_on_esc(true)
        .build()
        .unwrap();

    let assets = find_folder::Search::ParentsThenKids(3, 3)
        .for_folder("assets").unwrap();
    let ref font = assets.join("FiraSans-Regular.ttf");
    let factory = window.factory.borrow().clone();
    let glyphs = Glyphs::new(font, factory).unwrap();

    let mut game = game::Game::new(glyphs);

    for e in window {
        game.render(&e);

        if let Some(mouse_rel) = e.mouse_cursor_args() {
            game.mouse_move(mouse_rel);
        }

        if let Some(button) = e.press_args() {
            game.proc_key(button, &e);
        }
    }
}