extern crate rand;

use std::io;
use std::vec::Vec;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    let mut tries_counter : u32 = 0; 
    let mut attempt_history = Vec::<(u32, String)>::new();

    println!("The secret number is: {}", secret_number);

    loop {

        // Get the value from inside the Ok, else print the error
        let guess = match get_input() {
            Ok(num) => num,
            Err(e) => {
                println!("{}", e);
                continue;
            }
        };


        println!("You guessed: {}", guess);

        tries_counter += 1;

        attempt_history.push((tries_counter, format!("{}", guess)));

        match guess.cmp(&secret_number) {
            Ordering::Less    => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal   => {
                println!("You win!");
                println!("Total number of attempts: {}", tries_counter);
                println!("First print:");
                for x in attempt_history.iter() {
                    println!("{:?}", x);
                }
                println!("\nSecond print:");
                for x in attempt_history.iter() {
                    println!("{:?}", x);
                }
                break;
            }
        }

        println!("Attempts so far: {}\n ", tries_counter);

    }
}


fn get_input() -> Result<u32, String> {

    let mut text_input = String::new();

    println!("Please input your guess.");

    /*
     Instead of using the expect,
     save and return potential error
     */
        let input = io::stdin()
        .read_line(&mut text_input);
    
    match input {
        Ok(_) => (),
        Err(e) => return Err(format!("{}", e)),
    }

    match text_input.trim().parse::<u32>() {
        Ok(num) => return Ok(num),
        Err(e) => {
            return Err(format!("in parsing u32, {}", e));
        }
    };
}