extern crate rand;
extern crate crossterm;

mod map;
mod algorithm;
mod messages;
mod variables;

use crossterm::Crossterm;
use crossterm::terminal::ClearType;
use crossterm::style::Color;
use crossterm::screen;

use self::variables::{Size, Position };
use self::messages::WELCOME_MESSAGE;

use std::iter::Iterator;
use std::{thread, time};

fn main()
{
    run();
}

/// run the program
pub fn run()
{
//    // create new Crossterm instance.
//    let mut crossterm = Crossterm::new();
//
//    print_welcome_screen(&crossterm);
//
//    start_algorithm(&mut crossterm);
//
//    print_end_screen(&crossterm);


}

fn start_algorithm(crossterm: &mut Crossterm)
{
    // we first want to switch to alternate screen. On the alternate screen we are going to run or firstdepthsearch algorithm
    let alternate_screen = screen::AlternateScreen::from(crossterm.context());

    // setup the map size and the position to start searching for a path.
    let map_size = Size::new(100,40);
    let start_pos = Position::new(10,10);

    // create and render the map. Or map border is going to have an █ look and inside the map is just a space.
    let mut map = map::Map::new(map_size, '█', ' ');
    map.render_map(crossterm);

    // create the algorithm and start the
    let mut algorithm = algorithm::FirstDepthSearch::new(map, start_pos, &crossterm);
    algorithm.start();
}

fn print_end_screen(crossterm: &Crossterm)
{

}

fn print_welcome_screen(crossterm: &Crossterm)
{
    // create the handle for the cursor and terminal.
    let mut cursor = crossterm.cursor();
    let mut terminal = crossterm.terminal();

    // clear the screen and print the welcome message.
    terminal.clear(ClearType::All);
    cursor.goto(0,0);
    terminal.write(WELCOME_MESSAGE.join("\n"));

    cursor.hide();
    cursor.goto(0,10);
    terminal.write(
        "The first depth search algorithm will start in:   Seconds"
    );

    // print some progress example.
    for i in (1..5).rev() {
        // print the current counter at the line of `Seconds to Go: {counter}`
        cursor
            .goto(48, 10)
            .print(terminal.paint(format!("{}", i)).with(Color::Red).on(Color::Blue));

        // 1 second delay
        thread::sleep(time::Duration::from_secs(1));
    }
}