package main

import (
	_ "embed"
	"fmt"
	"os"
	"os/exec"
	"path"

	"github.com/antonmedv/fx/internal/engine"
)

//go:embed npm/index.js
var src []byte

func reduce(fns []string) {
	if _, ok := os.LookupEnv("FX_JS"); ok {
		engine.Reduce(fns)
		return
	}

	var deno bool
	bin, err := exec.LookPath("node")
	if err != nil {
		bin, err = exec.LookPath("deno")
		if err != nil {
			engine.Reduce(fns)
			return
		}
		deno = true
	}

	script := path.Join(os.TempDir(), fmt.Sprintf("fx-%v.js", version))
	_, err = os.Stat(script)
	if os.IsNotExist(err) {
		err := os.WriteFile(script, src, 0644)
		if err != nil {
			panic(err)
		}
	}

	env := os.Environ()
	var args []string

	if deno {
		args = []string{"run", "-A", script}
		env = append(env, "V8_FLAGS=--max-old-space-size=16384")
	} else {
		args = []string{script}
		env = append(env, "NODE_OPTIONS=--max-old-space-size=16384")
	}

	args = append(args, fns...)

	cmd := exec.Command(bin, args...)
	cmd.Env = env
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err = cmd.Run()

	switch err := err.(type) {
	case nil:
		os.Exit(0)
	case *exec.ExitError:
		os.Exit(err.ExitCode())
	default:
		panic(err)
	}
}
