package main

import (
	"fmt"
	"sort"

	h "git.bullercodeworks.com/brian/adventofcode/helpers"
)

func main() {
	fix(h.StdinToStringSlice())
}

func fix(inp []string) {
	var clean []string
	var fixScores []int
	var score int
	for i := range inp {
		var opens []byte
		valid := true
		for _, b := range inp[i] {
			switch b {
			case '(':
				opens = append(opens, byte(b))
			case '[':
				opens = append(opens, byte(b))
			case '{':
				opens = append(opens, byte(b))
			case '<':
				opens = append(opens, byte(b))
			case ')':
				if opens[len(opens)-1] != '(' {
					valid = false
					score += 3
				} else {
					opens = opens[:len(opens)-1]
				}
			case ']':
				if opens[len(opens)-1] != '[' {
					valid = false
					score += 57
				} else {
					opens = opens[:len(opens)-1]
				}
			case '}':
				if opens[len(opens)-1] != '{' {
					valid = false
					score += 1197
				} else {
					opens = opens[:len(opens)-1]
				}
			case '>':
				if opens[len(opens)-1] != '<' {
					valid = false
					score += 25137
				} else {
					opens = opens[:len(opens)-1]
				}
			}
			if !valid {
				break
			}
		}
		if valid {
			var fixLineScore int
			for bi := len(opens) - 1; bi >= 0; bi-- {
				switch opens[bi] {
				case '(':
					inp[i] = inp[i] + string(')')
					fixLineScore = (fixLineScore * 5) + 1
				case '[':
					inp[i] = inp[i] + string(']')
					fixLineScore = (fixLineScore * 5) + 2
				case '{':
					inp[i] = inp[i] + string('}')
					fixLineScore = (fixLineScore * 5) + 3
				case '<':
					inp[i] = inp[i] + string('>')
					fixLineScore = (fixLineScore * 5) + 4
				}
			}
			clean = append(clean, inp[i])
			fixScores = append(fixScores, fixLineScore)
		}
	}
	sort.Ints(fixScores)
	acScore := fixScores[len(fixScores)/2]

	fmt.Println("# Part 1")
	fmt.Println("Syntax Checker Score:", score)
	fmt.Println()
	fmt.Println("# Part 2")
	fmt.Println("Autocomplete Score:", acScore)
}
