package main

import (
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"
	"runtime"
	"strings"
	"syscall"
)

func GetExePath(exeName string) string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		fmt.Fprintf(os.Stderr, "获取当前目录失败: %v\n", err)
		os.Exit(1)
	}

	if runtime.GOOS == "windows" {
		exeName = exeName + ".exe"
	}

	return filepath.Join(dir, exeName)
}

func ExecuteWithArgs(exeName string, args []string) (int, error) {
	exePath := GetExePath(exeName)

	cmd := exec.Command(exePath, args...)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Stdin = os.Stdin

	err := cmd.Run()

	exitCode := 0
	if err != nil {
		if exitError, ok := err.(*exec.ExitError); ok {
			if status, ok := exitError.Sys().(syscall.WaitStatus); ok {
				exitCode = status.ExitStatus()
			} else {
				if status, ok := exitError.Sys().(uint32); ok {
					exitCode = int(status)
				} else {
					exitCode = 1
				}
			}
		}
	}

	return exitCode, err
}

var passesPattern = regexp.MustCompile(`^-passes=default<O(\d)>$`)

func OverrideArgs(exeName string) (int, error) {
	argsToUse := os.Args[1:]

	filename := argsToUse[0]
	if strings.HasSuffix(filename, "cjbind.clang.bc") {
		for i := range len(argsToUse) {
			if argsToUse[i] == "--only-verify-out" {
				argsToUse = append(argsToUse[:i], argsToUse[i+1:]...)
				break
			}
		}

		for i := range len(argsToUse) {
			m := passesPattern.FindStringSubmatch(argsToUse[i])
			if m != nil {
				level := m[1]
				envKey := "CJBIND_OPT_PASSES_O" + level
				passes := os.Getenv(envKey)
				if passes == "" {
					fmt.Fprintf(os.Stderr, "错误: %s 环境变量未设置\n", envKey)
					os.Exit(1)
				}
				argsToUse[i] = "-passes=" + passes
				break
			}
		}

		fmt.Println("重写为:", argsToUse)
	}

	return ExecuteWithArgs(exeName, argsToUse)
}

func main() {
	exitCode, err := OverrideArgs("opt.old")
	if err != nil {
		fmt.Fprintf(os.Stderr, "执行失败: %v\n", err)
	}

	os.Exit(exitCode)
}