package day09

import (
	"strconv"
	"strings"
)

func Part1(input string) int {
	lines := strings.Split(input, "\r\n")
	total := 0
	for _, line := range lines {
		var intSeq []int
		seq := strings.Split(line, " ")
		for _, i := range seq {
			num, _ := strconv.Atoi(i)
			intSeq = append(intSeq, num)
		}
		total += extrapolate1(intSeq)
	}
	return total
}

func Part2(input string) int {
	lines := strings.Split(input, "\r\n")
	total := 0
	for _, line := range lines {
		var intSeq []int
		seq := strings.Split(line, " ")
		for _, i := range seq {
			num, _ := strconv.Atoi(i)
			intSeq = append(intSeq, num)
		}
		total += extrapolate2(intSeq)
	}
	return total
}

func extrapolate1(array []int) int {
	allZeros := true
	for _, x := range array {
		if x != 0 {
			allZeros = false
			break
		}
	}

	if allZeros {
		return 0
	}

	deltas := make([]int, len(array)-1)
	for i := 0; i < len(array)-1; i++ {
		deltas[i] = array[i+1] - array[i]
	}

	diff := extrapolate1(deltas)
	return array[len(array)-1] + diff
}

func extrapolate2(array []int) int {
	allZeros := true
	for _, x := range array {
		if x != 0 {
			allZeros = false
			break
		}
	}

	if allZeros {
		return 0
	}

	deltas := make([]int, len(array)-1)
	for i := 0; i < len(array)-1; i++ {
		deltas[i] = array[i+1] - array[i]
	}

	diff := extrapolate2(deltas)
	return array[0] - diff
}
