package util

import (
	"bufio"
	"bytes"
	"io/ioutil"
	"os"
	"strconv"
	"strings"
)

// ReadInput isn't here to make friends. It is highly specific to this domain.
// It assumes the first argument on the command-line is a file with input. It
// returns an array of strings containing the lines of that file.
func ReadInput() []string {
	file, err := os.Open(os.Args[1])
	if err != nil {
		panic(err)
	}

	lines := []string{}
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}

	return lines
}

// ReadInputBytes is like ReadInput, but returns a byte array.
func ReadInputBytes() []byte {
	rawData, err := ioutil.ReadFile(os.Args[1])

	if err != nil {
		panic(err)
	}

	return bytes.TrimRight(rawData, "\n")
}

// ReadInputInts is like ReadInput, but returns an array of ints. (space-separated in the input)
func ReadInputInts() []int {
	rawData, err := ioutil.ReadFile(os.Args[1])

	if err != nil {
		panic(err)
	}

	strData := strings.Split(strings.TrimSpace(string(rawData)), " ")
	data := []int{}
	for _, newIntStr := range strData {
		newInt, err := strconv.Atoi(newIntStr)

		if err != nil {
			panic(err)
		}

		data = append(data, newInt)
	}

	return data
}