package main

import (
	"bufio"
	"log"
	"os"
	"strconv"
	"strings"
)

type Move struct {
	dir    string
	length int
}

func main() {
	if err := myMain(); err != nil {
		log.Println(err)
	}
}

func myMain() error {
	// parse input.txt
	data, err := parseInput()
	if err != nil {
		return err
	}

	log.Println("Part1:", SolveFirst(data))

	log.Println("Part2:", SolveSecond(data))

	return nil
}

func SolveFirst(data []Move) int {
	var depth, fwd int
	for _, d := range data {
		switch d.dir {
		case "forward":
			fwd += d.length
		case "down":
			depth += d.length
		case "up":
			depth -= d.length
		default:
			panic("no way!")
		}
	}

	return depth * fwd
}

func SolveSecond(data []Move) int {
	var depth, fwd, aim int
	for _, d := range data {
		switch d.dir {
		case "forward":
			fwd += d.length
			depth += d.length * aim
		case "down":
			aim += d.length
		case "up":
			aim -= d.length
		default:
			panic("no way!")
		}
	}

	return depth * fwd
}

func parseInput() ([]Move, error) {
	fd, err := os.Open("input.txt")
	if err != nil {
		return nil, err
	}
	defer fd.Close()

	buf := bufio.NewScanner(fd)
	var ret []Move
	for buf.Scan() {
		tmp := strings.Split(buf.Text(), " ")
		l, err := strconv.Atoi(tmp[1])
		if err != nil {
			return nil, err
		}
		ret = append(ret, Move{tmp[0], l})
	}

	return ret, nil
}