package day02

import (
	"math"
	"strconv"
	"strings"
)

func Part1(input string) int {
	total := 0
	lines := strings.Split(input, "\n")
	for _, line := range lines {
		var report []int
		nums := strings.Fields(line)
		for _, num := range nums {
			intnum, _ := strconv.Atoi(num)
			report = append(report, int(intnum))
		}
		if isSafe(report) {
			total++
		}
	}
	return total
}

func Part2(input string) int {
	total := 0
	lines := strings.Split(input, "\n")
	for _, line := range lines {
		var report []int
		nums := strings.Fields(line)
		for _, num := range nums {
			intnum, _ := strconv.Atoi(num)
			report = append(report, int(intnum))
		}
		if isSafeWithDampener(report) {
			total++
		}
	}
	return total
}

func isSafe(report []int) bool {
	increasing := report[1] > report[0]
	decreasing := report[1] < report[0]

	for i := 1; i < len(report); i++ {
		diff := report[i] - report[i-1]
		absDiff := int(math.Abs(float64(diff)))

		if absDiff < 1 || absDiff > 3 {
			return false
		}

		if (diff > 0 && !increasing) || (diff < 0 && !decreasing) {
			return false
		}
	}

	return true
}

func isSafeWithDampener(report []int) bool {
	if isSafe(report) {
		return true
	}

	for i := 0; i < len(report); i++ {
		modifiedReport := append(report[:i], report[i+1:]...)
		if isSafe(modifiedReport) {
			return true
		}
	}

	return false
}
