//go:build windows

package aghos

import (
	"io/fs"
	"os"
	"os/signal"
	"path/filepath"
	"syscall"

	"github.com/AdguardTeam/golibs/log"
	"golang.org/x/sys/windows"
)

func rootDirFS() (fsys fs.FS) {
	// TODO(a.garipov): Use a better way if golang/go#44279 is ever resolved.
	sysDir, err := windows.GetSystemDirectory()
	if err != nil {
		log.Error("aghos: getting root filesystem: %s; using C:", err)

		// Assume that C: is the safe default.
		return os.DirFS("C:")
	}

	return os.DirFS(filepath.VolumeName(sysDir))
}

func setRlimit(val uint64) (err error) {
	return Unsupported("setrlimit")
}

func haveAdminRights() (bool, error) {
	var token windows.Token
	h := windows.CurrentProcess()
	err := windows.OpenProcessToken(h, windows.TOKEN_QUERY, &token)
	if err != nil {
		return false, err
	}

	info := make([]byte, 4)
	var returnedLen uint32
	err = windows.GetTokenInformation(token, windows.TokenElevation, &info[0], uint32(len(info)), &returnedLen)
	token.Close()
	if err != nil {
		return false, err
	}
	if info[0] == 0 {
		return false, nil
	}
	return true, nil
}

func isOpenWrt() (ok bool) {
	return false
}

func notifyReconfigureSignal(c chan<- os.Signal) {
	signal.Notify(c, windows.SIGHUP)
}

func notifyShutdownSignal(c chan<- os.Signal) {
	// syscall.SIGTERM is processed automatically.  See go doc os/signal,
	// section Windows.
	signal.Notify(c, os.Interrupt)
}

func isReconfigureSignal(sig os.Signal) (ok bool) {
	return sig == windows.SIGHUP
}

func isShutdownSignal(sig os.Signal) (ok bool) {
	switch sig {
	case os.Interrupt, syscall.SIGTERM:
		return true
	default:
		return false
	}
}

func sendShutdownSignal(c chan<- os.Signal) {
	c <- os.Interrupt
}
