package main

import (
	"AoC2020/helper"
	"fmt"
	"os"
	"sort"
)

func main() {
	args := os.Args[1:]
	input, err := helper.GetInput(args[0])
	if err != nil {
		fmt.Println(err)
	}
	numbers, err := helper.MapToNumber(input)
	if err != nil {
		fmt.Println(err)
	}
	part2(numbers)
}

func part2(numbers []int)  {
	sort.Ints(numbers)
	numbers = prependInt(numbers,0)
	numbers = append(numbers,numbers[len(numbers)-1]+3)
	fmt.Printf("%v \n",numbers)
	possibilities := make([][3]int, len(numbers))
	possibilities[len(numbers)-1] = [3]int{0,0,1}
	for i:= len(numbers)-1; i >= 0; i-- {
		diff := 0
		j := 1
		for diff <= 3 && i+j<len(numbers){
			diff = numbers[i+j] - numbers[i]
			switch diff {
			case 1:
				possibilities[i][0] = sum(possibilities[i+j])
			case 2:
				possibilities[i][1] = sum(possibilities[i+j])
			case 3:
				possibilities[i][2] = sum(possibilities[i+j])
			}
			j++
		}
	}
	fmt.Printf("%v \n",possibilities)
	fmt.Printf("%d \n",sum(possibilities[0]))
}

func part1(numbers []int)  {
	sort.Ints(numbers)
	diffCounter := make([]int, 3)
	numbers = prependInt(numbers,0)
	numbers = append(numbers,numbers[len(numbers)-1]+3)
	fmt.Printf("%v \n",numbers)
	for i:= 0; i < len(numbers)-1; i++ {
		diffCounter[numbers[i+1] - numbers[i]-1]++
	}
	fmt.Printf("%v \n",diffCounter)
	fmt.Print(diffCounter[0] * diffCounter[2])
}

func prependInt(x []int, y int) []int {
	x = append(x, 0)
	copy(x[1:], x)
	x[0] = y
	return x
}

func sum(array [3]int) int {
	result := 0
	for _, v := range array {
		result += v
	}
	return result
}

