package main

import (
	"fmt"
	"strings"

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

func main() {
	inp := h.StdinToStringSlice()
	part1(inp)
	part2(inp)
}

func part1(inp []string) {
	fmt.Println("# Part 1")
	var ret int
	for _, pair := range inp {
		elves := strings.Split(pair, ",")
		e1S, e1E := getRange(elves[0])
		e2S, e2E := getRange(elves[1])
		if rangesFullyOverlap(e1S, e1E, e2S, e2E) {
			ret++
		}
	}
	fmt.Printf("Fully Overlapping Ranges: %d\n", ret)
}

func part2(inp []string) {
	fmt.Println("# Part 2")
	var ret int
	for _, pair := range inp {
		elves := strings.Split(pair, ",")
		e1S, e1E := getRange(elves[0])
		e2S, e2E := getRange(elves[1])
		if rangesOverlap(e1S, e1E, e2S, e2E) {
			ret++
		}
	}
	fmt.Printf("Overlapping Ranges: %d\n", ret)
}

func partXAllOverlaps(inp []string) {
	fmt.Println("# Part x")
	var overlaps int
	sections := make(map[int]int)
	for _, pair := range inp {
		elves := strings.Split(pair, ",")
		for elfIdx, elf := range elves {
			var overlapped bool
			i1, i2 := getRange(elf)
			for i := i1; i <= i2; i++ {
				if _, ok := sections[i]; ok {
					overlapped = true
				} else {
					sections[i] = elfIdx
				}
			}
			if overlapped {
				overlaps++
			}
		}
	}
	fmt.Printf("Overlapping Assignments: %d\n", overlaps)
}

func rangesFullyOverlap(e1start, e1end, e2start, e2end int) bool {
	return (e1start >= e2start && e1end <= e2end) ||
		(e2start >= e1start && e2end <= e1end)
}
func rangesOverlap(e1start, e1end, e2start, e2end int) bool {
	ret := (e1start >= e2start && e1start <= e2end) ||
		(e1end >= e2start && e1end <= e2end) ||
		(e2start >= e1start && e2start <= e1end) ||
		(e2end >= e1start && e2end <= e1end)
	return ret
}

func getRange(elf string) (int, int) {
	idxsS := strings.Split(elf, "-")
	return h.Atoi(idxsS[0]), h.Atoi(idxsS[1])
}