package main

import (
	"fmt"

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

func main() {
	inp := h.StdinToStringSlice()
	enhancement, inputImage := inp[0], h.StringSliceToCoordByteMap(inp[2:])
	fmt.Println("# Part 1")
	run(inputImage, enhancement, 2)
	fmt.Println()
	fmt.Println("# Part 2")
	run(inputImage, enhancement, 50)
}

func run(image h.CoordByteMap, enhancement string, iters int) {
	bg := byte('.')
	for i := 0; i < iters; i++ {
		image = enhance(image, enhancement, bg)
		if bg == '#' {
			bg = enhancement[511]
		} else {
			bg = enhancement[0]
		}
	}
	fmt.Println("Lit pixels:", image.Count('#'))
}

func enhance(image h.CoordByteMap, enhancement string, bg byte) h.CoordByteMap {
	pxToInt := func(c h.Coordinate) int {
		var num int
		for bldY := c.Y - 1; bldY <= c.Y+1; bldY++ {
			for bldX := c.X - 1; bldX <= c.X+1; bldX++ {
				num = num << 1
				v := image.Opt(h.Coordinate{X: bldX, Y: bldY}, bg)
				if v == '#' {
					num |= 1
				}
			}
		}
		return num
	}
	next := h.NewCoordByteMap()
	for y := image.TLY - 1; y <= image.BRY+1; y++ {
		for x := image.TLX - 1; x <= image.BRX+1; x++ {
			c := h.Coordinate{X: x, Y: y}
			nv := enhancement[pxToInt(c)]
			next.Put(c, nv)
		}
	}
	return next
}
