package inotify

import (
	"fmt"
	"io/ioutil"
	"strconv"
	"strings"

	"golang.org/x/sys/unix"
)

const events = unix.IN_ALL_EVENTS
const MaximumWatchersFile = "/proc/sys/fs/inotify/max_user_watches"

type watcher struct {
	wd  int
	dir string
}

func newWatcher(fd int, dir string) (*watcher, error) {
	wd, errno := unix.InotifyAddWatch(fd, dir, events)
	if wd == -1 {
		return nil, fmt.Errorf("adding watcher on %s: %d", dir, errno)
	}
	return &watcher{
		wd:  wd,
		dir: dir,
	}, nil
}

func getLimit() (int, error) {
	b, err := ioutil.ReadFile(MaximumWatchersFile)
	if err != nil {
		return 0, fmt.Errorf("reading from %s: %v", MaximumWatchersFile, err)
	}

	s := strings.TrimSpace(string(b))
	m, err := strconv.Atoi(s)
	if err != nil {
		return 0, fmt.Errorf("converting to integer: %v", err)
	}

	return m, nil
}
