package main

import (
	"fmt"

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

func main() {
	inp := h.StdinToString()
	fmt.Println("# Part 1")
	fmt.Printf("First Start of Packet @ %d\n", findFirstStartOfPacket(inp))
	fmt.Println("")
	fmt.Println("# Part 2")
	fmt.Printf("First Start of Message @ %d\n", findFirstStartOfMessage(inp))
}

func findFirstStartOfPacket(inp string) int {
	return findFirstWithXUnique(inp, 4)
}

func findFirstStartOfMessage(inp string) int {
	return findFirstWithXUnique(inp, 14)
}

func findFirstWithXUnique(inp string, x int) int {
	for i := range inp {
		if i < x {
			continue
		}
		if findUniqueCountBefore(inp, i) >= x {
			return i + 1
		}
	}
	return -1
}

func findUniqueCountBefore(inp string, pos int) int {
	if len(inp) < pos {
		return -1
	}
	counts := make(map[byte]int)
	for i := pos; i >= 0; i-- {
		if _, ok := counts[inp[i]]; !ok {
			counts[inp[i]]++
		} else {
			return len(counts)
		}
	}
	return pos
}