package main

import (
	"fmt"
	"os/exec"
	"runtime"
	"strings"
	"sync"

	"golang.org/x/sync/errgroup"
)

// verify that the following are installed on the host: docker colima npm
// TODO: check versions

func checkDocker() (string, error) {
	path, err := exec.LookPath("docker")
	if err != nil {
		if runtime.GOOS == "darwin" {
			return "", fmt.Errorf("cannot find `docker` binary; run: brew install docker colima && colima start")
		} else {
			return "", fmt.Errorf("cannot find `docker` binary; install docker (e.g., apt-get install docker.io)")
		}
	}
	cmd := exec.Command(path, "-v")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return "", fmt.Errorf("docker version check failed: %w\n%s\n", err, string(output))
	}
	return fmt.Sprintf("%s %s", path, strings.TrimSpace(string(output))), nil
}

func checkNPM() (string, error) {
	path, err := exec.LookPath("npm")
	if err != nil {
		return "", fmt.Errorf("cannot find `npm` binary; run: brew install npm")
	}
	cmd := exec.Command(path, "-version")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return "", fmt.Errorf("npm version check failed: %w\n%s\n", err, string(output))
	}
	return fmt.Sprintf("%s %s", path, strings.TrimSpace(string(output))), nil
}

type reqCheckFunc func() (string, error)

func hostReqsCheck(isUnsafe bool) ([]string, error) {
	var mu sync.Mutex
	ret := []string{}
	eg := errgroup.Group{}
	cfs := []reqCheckFunc{}

	// Only check for Docker if we're not in unsafe mode
	if !isUnsafe {
		cfs = append(cfs, checkDocker)
	}

	// Always check for NPM
	cfs = append(cfs, checkNPM)

	eg.SetLimit(len(cfs))
	for _, f := range cfs {
		eg.Go(func() error {
			msg, err := f()
			mu.Lock()
			defer mu.Unlock()
			if err == nil {
				ret = append(ret, msg)
			} else {
				ret = append(ret, err.Error())
			}
			return err
		})
	}
	return ret, eg.Wait()
}
