const std = @import("std");

const lineLength = 4; // maximum line length (digits)
const decimalSize = u13; // every num in input is < 2^13
const maxItems = 2000; // number of items in input file

const path = "data/day01/input.txt";

pub fn second(allocator: ?std.mem.Allocator) anyerror!decimalSize {
    _ = allocator;

    const values = try parseValues();

    var inc: decimalSize = 0;
    for (values) |_, idx| {
        if (idx >= 3) {
            // as idx-2 and idx-1 are in a and b too, this can be simplified
            // const a = @intCast(u15, values[idx - 3]) + values[idx - 2] + values[idx - 1];
            // const b = @intCast(u15, values[idx - 2]) + values[idx - 1] + values[idx];
            const a = values[idx - 3];
            const b = values[idx];
            if (a < b) {
                inc += 1;
            }
        }
    }

    return inc;
}

fn parseValues() anyerror![maxItems]decimalSize {
    const file = @embedFile(path);
    var lines = std.mem.tokenize(u8, file, "\n");

    var values: [maxItems]decimalSize = undefined;

    var i: decimalSize = 0;
    while (lines.next()) |v| : (i += 1) {
        values[i] = try std.fmt.parseUnsigned(decimalSize, v, 10);
    }

    return values;
}

pub fn main() anyerror!void {
    var timer = try std.time.Timer.start();
    const ret = try second(null);
    const s = timer.read() / 1000;

    try std.testing.expectEqual(ret, @as(decimalSize, 1429));

    std.debug.print("Day 1b result: {d} \t\ttime: {d}us\n", .{ ret, s });
}

test "day01b" {
    try std.testing.expectEqual(@as(decimalSize, 1429), try second(std.testing.allocator));
}