package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

// Task1 ...
func Task1(input []string) int {
	var x, y int
	dir := 0
	dx := map[int][2]int{
		0:   {1, 0},
		90:  {0, 1},
		180: {-1, 0},
		270: {0, -1},
	}

	for _, instr := range input {
		val, _ := strconv.Atoi(instr[1:])
		switch instr[0] {
		case 'N':
			y -= val
		case 'S':
			y += val
		case 'E':
			x += val
		case 'W':
			x -= val
		case 'L':
			dir -= val
			if dir < 0 {
				dir += 360
			}
		case 'R':
			dir += val
			if dir > 359 {
				dir -= 360
			}
		case 'F':
			d := dx[dir]
			x += val * d[0]
			y += val * d[1]
		}
	}

	return x + y
}

// Task2 ...
func Task2(input []string) int {
	var x, y int
	wx, wy := 10, -1

	for _, instr := range input {
		val, _ := strconv.Atoi(instr[1:])
		switch instr[0] {
		case 'N':
			wy -= val
		case 'S':
			wy += val
		case 'E':
			wx += val
		case 'W':
			wx -= val
		case 'L':
			switch val {
			case 90:
				wx, wy = wy, -wx
			case 180:
				wx, wy = -wx, -wy
			case 270:
				wx, wy = -wy, wx
			}
		case 'R':
			switch val {
			case 90:
				wx, wy = -wy, wx
			case 180:
				wx, wy = -wx, -wy
			case 270:
				wx, wy = wy, -wx
			}
		case 'F':
			x += val * wx
			y += val * wy
		}
	}

	return x + y
}

func main() {
	file, _ := os.Open("input.txt")
	scanner := bufio.NewScanner(file)

	input := make([]string, 0, 100)
	for scanner.Scan() {
		input = append(input, scanner.Text())
	}
	file.Close()

	result := Task1(input)
	fmt.Printf("Task 1: %d\n", result)

	result = Task2(input)
	fmt.Printf("Task 2: %d\n", result)
}