package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"sort"
)

func search(str string, min, max int) int {
	if max-min <= 2 {
		if str[0] == 'F' || str[0] == 'L' {
			return min
		}
		return max
	}

	step := int(math.Round(float64(max-min) / 2))
	switch str[0] {
	case 'F', 'L':
		max -= step
	case 'B', 'R':
		min += step
	}
	return search(str[1:], min, max)
}

// Seat ...
type Seat string

// GetRow ...
func (s Seat) GetRow() int {
	return search(string(s)[:7], 0, 127)
}

// GetColumn ...
func (s Seat) GetColumn() int {
	return search(string(s)[7:], 0, 7)
}

// GetID ...
func (s Seat) GetID() int {
	return (s.GetRow() * 8) + s.GetColumn()
}

/*func (s Seat) String() string {
	return "n/a"
}*/

// Task1 ...
func Task1(input []Seat) int {
	var result int
	for _, i := range input {
		if id := i.GetID(); id > result {
			result = id
		}
	}
	return result
}

// Task2 ...
func Task2(input []Seat) int {
	seatmap := make([]int, len(input))

	for i, in := range input {
		seatmap[i] = in.GetID()
	}
	sort.Ints(seatmap)
	for i := 0; i < len(seatmap)-2; i++ {
		if seatmap[i+1]-seatmap[i] != 1 {
			return seatmap[i] + 1
		}
	}

	return -1
}

func main() {
	var input []Seat
	file, _ := os.Open("input.txt")
	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		input = append(input, Seat(scanner.Text()))
	}
	file.Close()

	result := Task1(input)
	fmt.Printf("Task 1: %d\n", result)

	result = Task2(input)
	fmt.Printf("Task 2: %d\n", result)
}