mod common;

use std::env;

use common::{PuzzleInputs, Report};


fn main() {
    let input_file = env::args().nth(1).unwrap();

    let input = PuzzleInputs::parse(input_file);

    let mut num_safe = 0;

    for report in &input.reports {
        if let Status::Safe = is_report_safe(report) {
            num_safe += 1;
        }
    }

    println!("{num_safe}");
}


#[derive(Debug)]
enum Status {
    Safe,
    Unsafe,
}


fn is_report_safe(report: &Report) -> Status {
    let mut order: i32 = 0;

    for window in report.levels.windows(2) {
        let a = window[0];
        let b = window[1];

        let diff = b.abs_diff(a);

        if diff < 1 || diff > 3 {
            return Status::Unsafe;
        }

        if b > a {
            order += 1;
        } else {
            order -= 1;
        }
    }


    if (order.abs() + 1) != (report.levels.len() as i32) {
        return Status::Unsafe;
    }

    Status::Safe
}