package main

import (
	"fmt"
	"time"

	intcode "git.bullercodeworks.com/brian/adventofcode/2019/intcode-processor"
	helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
)

func main() {
	pt := helpers.GetArgNumber(1)
	prog := intcode.ReadIntCodeFile("input")
	if pt == "1" {
		part1(prog)
	} else {
		part2(prog)
	}
}

func part1(prog []int) {
	p := intcode.NewProgram(prog)
	//p.EnableDebug()
	var lastOut int
	go func() {
		for {
			if !p.NeedsOutput() && !p.NeedsInput() {
				time.Sleep(1)
			} else if p.NeedsOutput() {
				lastOut = getOutput(p)
				fmt.Print(string(byte(lastOut)))
			} else if p.NeedsInput() {
				instructions := "NOT A J\nNOT C T\nOR T J\nAND D J\nWALK\n"
				//instructions := "NOT A J\nWALK\n"
				for _, v := range []byte(instructions) {
					fmt.Print(string(v))
					p.Input(int(v))
				}
			}
		}
		/*
			fmt.Println(getOutput(p))
			return
		*/
	}()
	p.Run()
	fmt.Println("Damage:", lastOut)
}

func part2(prog []int) {
	p := intcode.NewProgram(prog)
	//p.EnableDebug()
	var lastOut int
	go func() {
		for {
			if !p.NeedsOutput() && !p.NeedsInput() {
				time.Sleep(1)
			} else if p.NeedsOutput() {
				lastOut = getOutput(p)
				fmt.Print(string(byte(lastOut)))
			} else if p.NeedsInput() {
				instructions := "NOT A J\nNOT B T\nOR T J\nNOT C T\nOR T J\nAND D J\nAND E T\nOR H T\nAND T J\nRUN\n"
				for _, v := range []byte(instructions) {
					fmt.Print(string(v))
					p.Input(int(v))
				}
			}
		}
		/*
			fmt.Println(getOutput(p))
			return
		*/
	}()
	p.Run()
	fmt.Println("Damage:", lastOut)
}

func getOutput(p *intcode.Program) int {
	for !p.NeedsOutput() {
		time.Sleep(1)
	}
	return p.Output()
}
