package main

import (
	"bufio"
	"log"
	"os"
	"sort"
)

type Seat struct {
	row int
	col int
}

func main() {
	if err := realMain(); err != nil {
		log.Println(err)
	}
}

func realMain() error {
	data, err := parseInput()
	if err != nil {
		return err
	}

	tickets := parseTickets(data)

	var max int
	ids := make([]int, len(tickets))
	for i, tck := range tickets {
		ids[i] = tck.row*8 + tck.col
		if ids[i] > max {
			max = ids[i]
		}
	}
	log.Println(max)

	sort.Ints(ids)

	for i, seat := range ids {
		if seat != i+99 {
			log.Println("MISSING:", seat-1)
			break
		}
	}

	return nil
}

func parseTickets(data []string) []Seat {
	tickets := make([]Seat, len(data))

	for tn, d := range data {
		// calculate row
		min, max := 0, 127
		for i := 0; i < 7; i++ {
			switch d[i] {
			case 'B':
				min += (max-min)/2 + 1
			case 'F':
				max -= (max-min)/2 + 1
			}
			// log.Println(min, max)
		}
		tickets[tn].row = min

		// calculate col
		min, max = 0, 7
		for i := 7; i < 10; i++ {
			switch d[i] {
			case 'R':
				min += (max-min)/2 + 1
			case 'L':
				max -= (max-min)/2 + 1
			}
			// log.Println(min, max)
		}
		tickets[tn].col = min
	}

	return tickets
}

func parseInput() ([]string, error) {
	fd, err := os.Open("input.txt")
	if err != nil {
		return nil, err
	}
	defer fd.Close()

	var ret []string

	buf := bufio.NewScanner(fd)
	for buf.Scan() {
		ret = append(ret, buf.Text())
	}

	return ret, nil
}