import { task } from '@alexaegis/advent-of-code-lib';
import packageJson from '../package.json' assert { type: 'json' };
import { interpret } from './interpret.function.js';

export const p1 = (input: string): number | undefined => {
	const guards = new Map<number, Map<number, number>>();
	let currentGuard = -1;
	let asleepAt: number | undefined;
	const events = interpret(input);
	for (const event of events) {
		if (event.guard) {
			currentGuard = event.guard;
			if (!guards.has(currentGuard)) {
				guards.set(currentGuard, new Map());
			}
			asleepAt = undefined;
		} else if (event.event === 'falls asleep') {
			asleepAt = event.minute;
		} else if (event.event === 'wakes up') {
			const sleepMap = guards.get(currentGuard);
			if (sleepMap !== undefined && asleepAt !== undefined) {
				for (let i = asleepAt; i < event.minute; i++) {
					const si = sleepMap.get(i);
					sleepMap.set(i, (si ?? 0) + 1);
				}
			}
			asleepAt = undefined;
		}
	}

	let mostSlept = -1;
	let mostSleptGuard = -1;
	[...guards].forEach(([guard, sleepMap]) => {
		if (sleepMap.size > 0) {
			const totalSleep: [number, number] = [...sleepMap].reduce(
				([prevMinute, prevSleep], [currMin, currSleep]): [number, number] => {
					return [prevMinute < currMin ? currMin : prevMinute, prevSleep + currSleep];
				},
			);
			if (totalSleep[1] > mostSlept) {
				mostSlept = totalSleep[1];
				mostSleptGuard = guard;
			}
		}
	});

	console.log(`Guard who slept the most: ${mostSleptGuard} with a total of: ${mostSlept}`);

	const mostSleptSleepMap = guards.get(mostSleptGuard);

	if (mostSleptSleepMap) {
		const mostSleptMinute: [number, number] = [...mostSleptSleepMap].reduce(
			([prevMinute, prevSleep], [currMin, currSleep]): [number, number] => {
				return [prevSleep < currSleep ? currMin : prevMinute, currSleep];
			},
		);

		console.log(
			`He slept the most at the ${mostSleptMinute[0]} minute mark, for ${mostSleptMinute[1]} times.`,
		);
		return mostSleptGuard * mostSleptMinute[0];
	} else {
		return undefined;
	}
};

await task(p1, packageJson.aoc); // 106710 ~6ms
