package ebpftracer

import (
	"fmt"
	"os"
	"os/exec"
	"bytes"
	"strings"
)

func parseQuotedString(input string) (string, error) {
	// 找到第一个双引号的位置
	start := strings.Index(input, "\"")
	if start == -1 {
		return "", fmt.Errorf("no start quote found")
	}

	// 找到第二个双引号的位置
	end := strings.Index(input[start+1:], "\"")
	if end == -1 {
		return "", fmt.Errorf("no end quote found")
	}

	// 提取开始和结束引号之间的内容
	content := input[start+1 : start+1+end]
	return content, nil
}

// getExecutablePath 根据进程ID获取可执行文件的真实路径。
func getExecutablePath(pid uint32) (string, error) {
	// 构造文件路径
	link := fmt.Sprintf("/proc/%d/exe", pid)

	// 使用os.Readlink获取符号链接指向的路径
	execPath, err := os.Readlink(link)
	if err != nil {
		return "", err
	}
	return execPath, nil
}

func UsePIDToGetJDKVersion(pid uint32) string{
	execPath, err := getExecutablePath(pid)
	if err != nil {
		fmt.Println("Error:", err)
		return ""
	}
	// 构建Command对象
	cmd := exec.Command(execPath, "-version")

	// 创建缓冲区保存输出
	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = &stderr // java -version 实际是写入Stderr

	// 运行命令
	err = cmd.Run()
	if err != nil {
		fmt.Println("Command execution error:", err)
		fmt.Println("Error output:", stderr.String())
		return ""
	}

	// 打印输出信息
	version, err := parseQuotedString(stderr.String())
	if err != nil {
		fmt.Println("Error:", err)
		return ""
	}
	return version
	
}
