package main

import "core:fmt"
import "core:log"
import os "core:os/os2"
import "core:strconv"

import "./day_01"
import "./day_02"
import "./day_03"
import "./day_04"
import "./day_05"
import "./day_06"
import "./day_07"
import "./day_08"
import "./day_09"
import "./day_10"
import "./day_11"
import "./day_12"

days := []proc() {
	day_01.run,
	day_02.run,
	day_03.run,
	day_04.run,
	day_05.run,
	day_06.run,
	day_07.run,
	day_08.run,
	day_09.run,
	day_10.run,
	day_11.run,
	day_12.run,
}

main :: proc() {
	context.logger = log.create_console_logger(ident = "MAIN")
	defer log.destroy_console_logger(context.logger)

	day := 0
	level: log.Level = .Info
	if len(os.args) > 1 {
		for arg, i in os.args {
			switch arg {
			case "-debug":
				level = .Debug
			case "-day":
				if i + 1 >= len(os.args) {
					log.errorf("-day ")
					os.exit(-1)
				}
				day = strconv.parse_int(os.args[i + 1]) or_else 0
				if day < 1 || day > len(days) {
					log.errorf("-day invalid")
					os.exit(-1)
				}
			}
		}
	}

	if day > 0 {
		context.logger = log.create_console_logger(lowest = level, ident = fmt.tprintf("DAY %d", day))
		defer log.destroy_console_logger(context.logger)

		days[day - 1]()

		free_all(context.temp_allocator)
	} else {
		for run, i in days {
			context.logger = log.create_console_logger(lowest = level, ident = fmt.tprintf("DAY %d", i + 1))
			defer log.destroy_console_logger(context.logger)

			run()

			free_all(context.temp_allocator)
		}
	}
}