package main

import (
	"AoC2020/helper"
	"fmt"
	"os"
	"sort"
)

func main() {
	args := os.Args[1:]
	input, err := helper.GetInput(args[0])
	if err != nil {
		fmt.Println(err)
	}
	ids := getIds(input)
	fmt.Println(day5(ids))
	fmt.Println(day5Part2(ids))
}

func day5(ids []int) int {
	var max int
	for _, id := range ids {
		if id > max {
			max = id
		}
	}
	return max
}

func day5Part2(ids []int) int {
	sort.Ints(ids)
	for i := 1; i < len(ids) -1; i++ {
		id := ids[i]
		if id - ids[i-1] > 1 {
			return id - 1
		}
	}
	return 0
}

func getIds(boardingPasses []string) []int {
	var ids []int
	for _, boardingPass := range boardingPasses {
		row, column := getSeat(boardingPass)
		ids = append(ids, getId(row, column))
	}
	return ids
}

func getSeat(boardingPass string) (int, int) {
	rowP1 := 0
	rowP2 := 127
	for _, char := range boardingPass[:7] {
		if char == 'F' {
			rowP2 = rowP2 - (rowP2-rowP1)/2 - 1
		}
		if char == 'B' {
			rowP1 = rowP1 + (rowP2-rowP1)/2 + 1
		}
	}
	columnP1 := 0
	columnP2 := 7
	for _, char := range boardingPass[7:] {
		if char == 'L' {
			columnP2 = columnP2 - (columnP2-columnP1)/2 - 1
		}
		if char == 'R' {
			columnP1 = columnP1 + (columnP2-columnP1)/2 + 1
		}
	}
	return rowP1, columnP1
}

func getId(row int, column int) int {
	return row*8 + column
}
