import matrix
import shared
from dataclasses import dataclass
from functools import reduce  # Valid in Python 2.6+, required in Python 3
import operator


@dataclass
class Game:
    duration: int
    highscore: int


# @shared.profile
def part1(rows):
    times = [int(r) for r in rows[0].split(":")[1].split(" ") if r]
    distances = [int(r) for r in rows[1].split(":")[1].split(" ") if r]
    ways = []
    for game in [Game(*g) for g in zip(times, distances)]:
        ways.append(calculate(game))
    print(reduce(operator.mul, ways, 1))


# @shared.profile
def part2(rows):
    # join ints
    times = [int("".join([r for r in rows[0].split(":")[1].split(" ") if r]))]
    distances = [int("".join([r for r in rows[1].split(":")[1].split(" ") if r]))]

    ways = []
    for game in [Game(*g) for g in zip(times, distances)]:
        ways.append(calculate(game))
    print(reduce(operator.mul, ways, 1))


def search(game, _range):
    for held in _range:
        remaining = game.duration - held
        score = held * remaining
        if score > game.highscore:
            return held


def calculate(game):
    starting_win = search(game, range(game.duration + 1))
    ending_win = search(game, reversed(range(game.duration + 1)))
    print(game, starting_win, ending_win)
    return ending_win + 1 - starting_win


def main():
    rows = [row for row in shared.load_rows(6)]
    with shared.elapsed_timer() as elapsed:
        part1(rows)
        print("🕒", elapsed())

    rows = [row for row in shared.load_rows(6, True)]
    with shared.elapsed_timer() as elapsed:
        part2(rows)
        print("🕒", elapsed())


if __name__ == "__main__":
    main()
