package day08

import (
	"fmt"
	"math"
	"regexp"
	"strings"
)

type Direction struct {
	Destination string
	Left        string
	Right       string
}

func Part1(input string) int {
	lines := strings.Split(input, "\r\n")
	dir := make(map[string]Direction)
	for _, line := range lines {
		pattern := `[A-Z]+`
		re := regexp.MustCompile(pattern)
		matches := re.FindAllString(line, -1)
		dir[matches[0]] = Direction{matches[0], matches[1], matches[2]}
	}

	currentloc := "AAA"
	m := "LRLRRLLRRLRRRLRLRRRLLRRLLLLRRRLRRRLRRLRRLRRRLRRRLLRRLRLRRLRRRLLLRRLRRLLRLLRRRLRRRLLRLRRRLRLLRRLLLRLRRRLRRRLRRRLLRLRRRLLRRLRLRLLRRLRRRLRRLRLLRLRRRLRRLRLRLRRLRRRLRRRLRRRLRRLRRRLLRRLRRLLRRRLLRLRLRLRLLLRRLRLRRLRRLRRLRRLRRRLRRRLRLRRRLRLRRRLRRLRLLRLRRLRLRLLLRLLLRRRLRRLLLRLRRRR"
	moves := strings.Split(m, "")
	moveIndex := 0
	total := 0
	for {
		move := moves[moveIndex]
		if move == "R" {
			currentloc = dir[currentloc].Right
		} else {
			currentloc = dir[currentloc].Left
		}
		total++
		if currentloc == "ZZZ" {
			return total
		}
		moveIndex = int(math.Mod(float64(moveIndex+1), float64(len(moves))))
	}
	return -1
}

func Part2(input string) int {
	lines := strings.Split(input, "\r\n")
	dir := make(map[string]Direction)
	for _, line := range lines {
		pattern := `[A-Z1-9]+`
		re := regexp.MustCompile(pattern)
		matches := re.FindAllString(line, -1)
		dir[matches[0]] = Direction{matches[0], matches[1], matches[2]}
	}
	var startingLoc []string
	for _, loc := range dir {
		des := loc.Destination
		if des[2] == 'A' {
			startingLoc = append(startingLoc, des)
		}
	}

	m := "LRLRRLLRRLRRRLRLRRRLLRRLLLLRRRLRRRLRRLRRLRRRLRRRLLRRLRLRRLRRRLLLRRLRRLLRLLRRRLRRRLLRLRRRLRLLRRLLLRLRRRLRRRLRRRLLRLRRRLLRRLRLRLLRRLRRRLRRLRLLRLRRRLRRLRLRLRRLRRRLRRRLRRRLRRLRRRLLRRLRRLLRRRLLRLRLRLRLLLRRLRLRRLRRLRRLRRLRRRLRRRLRLRRRLRLRRRLRRLRLLRLRRLRLRLLLRLLLRRRLRRLLLRLRRRR"
	moves := strings.Split(m, "")
	moveIndex := 0
	startingLocIndex := 0
	currentloc := ""
	total := 0
	for {
		for _, loc := range startingLoc {
			currentloc = loc
			move := moves[moveIndex]
			if move == "R" {
				currentloc = dir[currentloc].Right
			} else {
				currentloc = dir[currentloc].Left
			}
			startingLoc[startingLocIndex] = currentloc
			startingLocIndex = int(math.Mod(float64(startingLocIndex+1), float64(len(startingLoc))))
		}
		total++
		endFlag := false
		for _, loc := range startingLoc {
			if loc[2] == 'Z' {
				endFlag = true
			} else {
				endFlag = false
				break
			}
		}
		if endFlag == true {
			return total
		}
		moveIndex = int(math.Mod(float64(moveIndex+1), float64(len(moves))))
		fmt.Println(total)
	}
	return -2
}
