mod solutions;
mod utils;

use std::error::Error;

use solutions::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let days: Vec<Box<dyn Solution + Sync>> = vec![
        Box::new(day01::Day01 {}),
        Box::new(day02::Day02 {}),
        Box::new(day03::Day03 {}),
        Box::new(day04::Day04 {}),
        Box::new(day05::Day05 {}),
        Box::new(day06::Day06 {}),
    ];

    let mut t = vec![];

    // Run through and generate solutions
    for day in days.leak().iter().rev() {
        let task = tokio::spawn(async { day.run().unwrap() });
        t.push(task);
    }

    let mut days = vec![];
    for thread in t {
        days.push(thread.await?);
    }

    for day in days {
        println!("========= Day {} ==========", day.day);
        println!("Part1 Result: {}", day.part1);
        println!("Part2 Result: {}", day.part2);
        println!("========= {}ms =========", day.time.as_millis());
    }

    Ok(())
}