package main

import (
	"fmt"
	"strings"

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

func main() {
	fmt.Println("# Day 8")
	inp := h.StdinToStringSlice()
	FixProg(inp)
}

func RunProg(inp []string) {
	var acc int
	var ptr int
	hist := make(map[int]int)
	for ptr < len(inp) {
		if _, ok := hist[ptr]; ok {
			fmt.Printf("Instruction %d repeated. Acc: %d\n", ptr, acc)
			return
		}
		hist[ptr] = acc
		pts := strings.Split(inp[ptr], " ")
		switch pts[0] {
		case "acc":
			acc = acc + h.Atoi(pts[1])
			ptr++
		case "jmp":
			ptr = ptr + h.Atoi(pts[1])
		case "nop":
			ptr++
		}
	}
}

func FixProg(inp []string) {
	p := NewProgram(inp)
	chchch := p.CountOpCodes(NOP, JMP)
	for ch := 1; ch <= chchch; ch++ {
		np := p.Copy()
		chOp := np.FindNthOp(ch, NOP, JMP)
		if chOp >= 0 {
			if np.Instructions[chOp].OpCode == NOP {
				np.Instructions[chOp].OpCode = JMP
			} else if np.Instructions[chOp].OpCode == JMP {
				np.Instructions[chOp].OpCode = NOP
			}
			res := np.Run()
			if res == 0 {
				fmt.Println("Accumulator:", np.Accumulator)
				return
			}
		}
		fmt.Println("Changing", ch, "didn't fix it")
	}
	fmt.Println("Failed to fix program")
}
