package main

import (
	"fmt"

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

// Target Area
var x1, y1, x2, y2 int

func main() {
	inp := h.StdinToString()
	fmt.Sscanf(inp, "target area: x=%d..%d, y=%d..%d", &x1, &x2, &y1, &y2)

	var maxy int
	r := make(map[h.Coordinate]bool)

	// Let's just see if -500 to 500 is enough >.<
	for x := 500 * -1; x < 500; x++ {
		for y := 500 * -1; y < 500; y++ {
			v := h.Coordinate{X: x, Y: y}
			if m, ok := testForHit(h.Coordinate{}, v); ok {
				if m > maxy {
					maxy = m
				}
				r[v] = true
			}
		}
	}
	fmt.Println("Maximum Peak:", maxy)
	fmt.Println("Valid Velocities:", len(r))
}

func testForHit(pos h.Coordinate, vel h.Coordinate) (int, bool) {
	var maxy int
	for {
		pos.X += vel.X
		pos.Y += vel.Y
		if pos.Y > maxy {
			maxy = pos.Y
		}
		if pos.X >= x1 && pos.X <= x2 && pos.Y >= y1 && pos.Y <= y2 {
			return maxy, true
		}
		if vel.X == 0 && vel.Y < y1 {
			return maxy, false
		}
		if vel.X > 0 {
			vel.X--
		}
		if vel.X < 0 {
			vel.X++
		}
		vel.Y--
	}
}

type xy struct {
	x int
	y int
}