package day_02

import "core:fmt"
import "core:log"
import "core:os"
import "core:strconv"
import "core:strings"

Input :: struct {
	ranges: [][2]int,
}

Result1 :: int
Result2 :: int

// --- Input --- //
print_input :: proc(input: Input) {
	log.infof("%v", input)
}

parse_input_file :: proc(filepath: string) -> Input {
	input: Input

	raw_data, ok := os.read_entire_file_from_filename(filepath)
	if !ok {
		panic("oh no, could not read file")
	}
	defer delete(raw_data)

	line := strings.trim_space(string(raw_data))
	ranges := strings.split(line, ",")
	defer delete(ranges)

	input.ranges = make([][2]int, len(ranges))
	for range, i in ranges {
		values := strings.split(range, "-")
		defer delete(values)
		a := strconv.parse_int(values[0]) or_else 0
		b := strconv.parse_int(values[1]) or_else 0
		input.ranges[i] = {a, b}
	}

	return input
}

free_input :: proc(input: ^Input) {
	delete(input.ranges)
}
// --- Input --- //


// --- Helpers --- //
// --- Helpers --- //


// --- Task 1 --- //
run_task1 :: proc(input: Input) -> Result1 {
	result: Result1

	for range in input.ranges {
		for i in range[0] ..= range[1] {
			val := fmt.tprintf("%d", i)
			if len(val) % 2 != 0 {
				continue
			}

			lh := val[:len(val) / 2]
			rh := val[len(val) / 2:]
			if lh == rh {
				result += i
			}
		}
	}

	return result
}

print_result1 :: proc(result: Result1) {
	log.infof("Task 1: %d", result)
}
// --- Task 1 --- //


// --- Task 2 --- //
run_task2 :: proc(input: Input) -> Result2 {
	result: Result2

	for range in input.ranges {
		log.debugf("%v", range)
		for i in range[0] ..= range[1] {
			val := fmt.tprintf("%d", i)

			half := len(val) / 2
			skip: for j in 1 ..= half {
				if len(val) % j != 0 {
					continue
				}
				for t in 1 ..= j {
					if len(val) % t != 0 {
						continue
					}
					seq := val[0:t]
					expected := len(val) / t
					count := strings.count(val, seq)
					if count == expected {
						log.debugf("found %d", i)
						result += i
						break skip
					}
				}
			}
		}
	}

	return result
}

print_result2 :: proc(result: Result2) {
	log.infof("Task 2: %d", result)
}
// --- Task 2 --- //

run :: proc() {
	input := parse_input_file("input/day_02.txt")
	defer free_input(&input)

	result1 := run_task1(input)
	print_result1(result1)

	result2 := run_task2(input)
	print_result2(result2)
}