package utils

import (
	"os"
	"runtime"
	"strings"
)

// OSInfo 操作系统信息
type OSInfo struct {
	OS      string // 操作系统类型: windows, linux, darwin
	Arch    string // 架构: amd64, arm64, 386
	IsCGO   bool   // 是否支持 CGO
	DataDir string // 数据目录路径
}

var currentOS *OSInfo

// DetectOS 检测操作系统环境
func DetectOS() *OSInfo {
	if currentOS != nil {
		return currentOS
	}

	osType := runtime.GOOS
	arch := runtime.GOARCH
	
	// 检测 CGO 支持
	// 注意：CGO 支持在编译时确定，运行时无法准确检测
	// 这里通过检查环境变量或尝试使用 SQLite 来判断
	isCGO := true
	// 如果设置了 CGO_ENABLED=0，则不支持 CGO
	if cgoEnv := os.Getenv("CGO_ENABLED"); cgoEnv == "0" {
		isCGO = false
	}
	
	// 确定数据目录
	dataDir := "data"
	if osType == "windows" {
		// Windows 使用相对路径
		dataDir = "data"
	} else {
		// Linux/macOS 使用相对路径
		dataDir = "data"
	}

	currentOS = &OSInfo{
		OS:      normalizeOS(osType),
		Arch:    normalizeArch(arch),
		IsCGO:   isCGO,
		DataDir: dataDir,
	}

	return currentOS
}

// normalizeOS 标准化操作系统名称
func normalizeOS(os string) string {
	os = strings.ToLower(os)
	switch os {
	case "windows":
		return "windows"
	case "linux":
		return "linux"
	case "darwin":
		return "darwin"
	case "freebsd", "openbsd", "netbsd":
		return "unix"
	default:
		return "unknown"
	}
}

// normalizeArch 标准化架构名称
func normalizeArch(arch string) string {
	arch = strings.ToLower(arch)
	switch arch {
	case "amd64", "x86_64":
		return "amd64"
	case "386", "i386", "i686":
		return "386"
	case "arm64", "aarch64":
		return "arm64"
	case "arm":
		return "arm"
	default:
		return arch
	}
}

// GetOSInfo 获取操作系统信息
func GetOSInfo() *OSInfo {
	return DetectOS()
}

// IsWindows 判断是否为 Windows
func IsWindows() bool {
	return DetectOS().OS == "windows"
}

// IsLinux 判断是否为 Linux
func IsLinux() bool {
	return DetectOS().OS == "linux"
}

// IsDarwin 判断是否为 macOS
func IsDarwin() bool {
	return DetectOS().OS == "darwin"
}
