package main

import (
	"errors"
	"fmt"
	"os"
	"path/filepath"
	"strconv"
	"strings"
)

func atois(s ...string) ([]int, error) {
	ints := make([]int, len(s))
	for i, s := range s {
		value, err := strconv.Atoi(s)
		if err != nil {
			return nil, fmt.Errorf("couldn't convert '%s' to a number; error: %v", s, err)
		}
		ints[i] = value
	}
	return ints, nil
}

func scanDir(dir string) ([]string, error) {
	var files []string
	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if path == dir || info.IsDir() {
			return nil
		}
		files = append(files, path)
		return nil
	})
	if err != nil {
		return nil, err
	}
	return files, nil
}

type point struct {
	x, y int
}

func parsePoint(s string) (point, error) {
	components := strings.Split(s, ",")
	if len(components) != 2 {
		return point{}, errors.New("expected two components separated by a comma")
	}
	ints, err := atois(components...)
	if err != nil {
		return point{}, err
	}
	return point{x: ints[0], y: ints[1]}, nil
}

type rect struct {
	min, max point
}

func parseRect(s string) (rect, error) {
	components := strings.Split(s, ",")
	if len(components) != 4 {
		return rect{}, errors.New("expected four components separated by a comma")
	}
	ints, err := atois(components...)
	if err != nil {
		return rect{}, err
	}
	return rect{min: point{x: ints[0], y: ints[1]}, max: point{x: ints[2], y: ints[3]}}, nil
}