package windows

import (
	message "client/internal/msg"
	"fmt"
	"os/exec"
	"strconv"
	"strings"
)

// 获取 NVIDIA 显卡信息
func getNvidiaGPUInfo() (map[int]message.GPU, error) {
	// 使用 nvidia-smi 列出所有 GPU
	cmd := exec.Command("nvidia-smi", "--query-gpu=name,memory.total", "--format=csv,noheader,nounits")
	output, err := cmd.Output()
	if err != nil {
		return nil, fmt.Errorf("无法执行 nvidia-smi 命令: %v", err)
	}

	// 解析输出
	info := strings.TrimSpace(string(output))
	lines := strings.Split(info, "\n")

	gpus := make(map[int]message.GPU)

	for i, line := range lines {
		parts := strings.Split(strings.TrimSpace(line), ", ")
		if len(parts) < 2 {
			return nil, fmt.Errorf("nvidia-smi 输出格式错误")
		}

		// 解析显存容量
		mem, err := parseMemory(parts[1])
		if err != nil {
			return nil, fmt.Errorf("无法解析显存容量: %v", err)
		}

		// 将每个 GPU 的信息存储到 map 中
		gpus[i] = message.GPU{
			Brand: "NVIDIA",
			Model: parts[0],
			Mem:   mem,
		}
	}

	return gpus, nil
}

// 解析显存容量字符串并返回 float64 类型
func parseMemory(memStr string) (float64, error) {
	var mem float64
	_, err := fmt.Sscanf(memStr, "%f", &mem)
	if err != nil {
		return 0, fmt.Errorf("显存解析失败: %v", err)
	}
	return mem, nil
}

// 获取 AMD 显卡信息
func getAmdGPUInfo() (map[int]message.GPU, error) {
	// 使用 wmic 列出所有显卡信息
	cmd := exec.Command("wmic", "path", "Win32_VideoController", "get", "Name,AdapterRAM")
	output, err := cmd.Output()
	if err != nil {
		return nil, fmt.Errorf("无法执行 wmic 命令: %v", err)
	}

	// 解析输出
	info := strings.TrimSpace(string(output))
	lines := strings.Split(info, "\n")

	gpus := make(map[int]message.GPU)
	gpuIndex := 0

	for _, line := range lines[1:] { // 跳过标题行
		line = strings.TrimSpace(line)
		if line != "" {
			parts := strings.Fields(line)
			if len(parts) >= 2 {
				// 获取显存大小并转换为 MB
				memStr := parts[1]
				mem, err := parseMemoryFromBytes(memStr)
				if err != nil {
					mem = 0 // 如果显存无法解析，则设置为 0
				}

				// 用正确的品牌名填充
				gpus[gpuIndex] = message.GPU{
					Brand: "AMD",
					Model: parts[0],
					Mem:   mem,
				}
				gpuIndex++
			}
		}
	}

	if len(gpus) == 0 {
		return nil, fmt.Errorf("未找到显卡信息")
	}

	return gpus, nil
}

// 从字节转换显存为 MB
func parseMemoryFromBytes(memStr string) (float64, error) {
	// 将字节转换为 MB
	memBytes, err := strconv.Atoi(memStr)
	if err != nil {
		return 0, fmt.Errorf("字节转显存失败: %v", err)
	}

	// 显存从字节转为MB
	memMB := float64(memBytes) / (1024 * 1024)
	return memMB, nil
}

// 获取所有 GPU 信息
func GetGPUInfo() (map[int]message.GPU, error) {
	// 尝试获取 NVIDIA GPU 信息
	gpus, err := getNvidiaGPUInfo()
	if err == nil {
		return gpus, nil
	}

	// 尝试获取 AMD GPU 信息
	gpus, err = getAmdGPUInfo()
	if err == nil {
		return gpus, nil
	}

	return nil, fmt.Errorf("未找到任何显卡信息")
}

/*
{
	"coin-algo": {
		"lolminer": {
			"pool_name": "url"
		},
		"bzminer": {
			"pool_name": "url"
		},
		"rigel": {
			"pool_name": "url"
		}
	}
}
*/
