package main

import (
	"errors"
	"fmt"

	h "git.bullercodeworks.com/brian/adventofcode/helpers"
)

func main() {
	fmt.Println("# Day 9")
	inp := h.StdinToIntSlice()
	rogue, err := FindRogueNumber(inp)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	answer, err := FindWeakness(rogue, inp)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("Answer:", answer)
}

func FindRogueNumber(inp []int) (int, error) {
	for k, v := range inp {
		if k >= 25 {
			if !ContainsPairFor(v, inp[k-25:k]) {
				return v, nil
			}
		}
	}
	return -1, errors.New("All numbers fit")
}

func ContainsPairFor(target int, inp []int) bool {
	for i := 0; i < len(inp)-1; i++ {
		for k := i + 1; k < len(inp); k++ {
			if inp[i]+inp[k] == target {
				return true
			}
		}
	}
	return false
}

func FindWeakness(target int, inp []int) (int, error) {
	for i := 0; i < len(inp)-1; i++ {
		for k := i + 1; k < len(inp); k++ {
			sum := GetSumForRange(inp[i:k])
			if sum == target {
				return FindSmallest(inp[i:k]) + FindLargest(inp[i:k]), nil
			} else if sum > target {
				break
			}
		}
	}
	return -1, errors.New("No weakness found")
}

func GetSumForRange(inp []int) int {
	var ret int
	for k := range inp {
		ret = ret + inp[k]
	}
	return ret
}

func FindSmallest(inp []int) int {
	ret := inp[0]
	for k := range inp {
		if inp[k] < ret {
			ret = inp[k]
		}
	}
	return ret
}

func FindLargest(inp []int) int {
	ret := inp[0]
	for k := range inp {
		if inp[k] > ret {
			ret = inp[k]
		}
	}
	return ret
}
