//go:build !js
// +build !js

package native

import (
	"fmt"
	"os/exec"
	"path/filepath"
	"runtime"

	"git.kirsle.net/SketchyMaze/doodle/pkg/log"
)

// OpenURL opens a web browser to the given URL.
//
// On Linux this will look for xdg-open or try a few common browser names.
// On Windows this uses the “start“ command.
// On MacOS this uses the “open“ command.
func OpenURL(url string) {
	if runtime.GOOS == "windows" {
		go windowsOpenURL(url)
	} else if runtime.GOOS == "linux" {
		go linuxOpenURL(url)
	} else if runtime.GOOS == "darwin" {
		go macOpenURL(url)
	} else {
		log.Error("OpenURL: don't know how to open URLs")
	}
}

// OpenLocalURL opens a web browser to a local HTML path.
// It converts a relative path like "guidebook/index.html" to its absolute
// filesystem location.
func OpenLocalURL(path string) {
	abs, _ := filepath.Abs(path)
	url := fmt.Sprintf("file:///%s", abs)
	fmt.Printf("Open Local URL: %s\n", url)
	OpenURL(url)
}

func windowsOpenURL(url string) {
	_, err := exec.Command("start", url).Output()
	if err != nil {
		log.Error("native.windowsOpenURL(%s): %s", url, err)
	}
}

func macOpenURL(url string) {
	_, err := exec.Command("open", url).Output()
	if err != nil {
		log.Error("native.macOpenURL(%s): %s", url, err)
	}
}

func linuxOpenURL(url string) {
	// Commands to look for.
	var commands = []string{
		"xdg-open",
		"firefox",
		"google-chrome",
		"chromium-browser",
	}

	for _, command := range commands {
		log.Debug("OpenURL(linux): try %s %s", command, url)
		_, err := exec.Command(command, url).Output()
		if err == nil {
			return
		}
	}

	log.Error(
		"native.linuxOpenURL(%s): could not find browser executable, tried %+v",
		url, commands,
	)
}
