package utils

import (
	"encoding/json"
	"fmt"
	"os"
	"runtime"
	"strings"
	"time"
)

// VersionInfo 版本信息结构
type VersionInfo struct {
	Version     string    `json:"version"`
	BuildTime   time.Time `json:"build_time"`
	GitCommit   string    `json:"git_commit"`
	GitBranch   string    `json:"git_branch"`
	GoVersion   string    `json:"go_version"`
	NodeVersion string    `json:"node_version"`
	Platform    string    `json:"platform"`
	Arch        string    `json:"arch"`
}

// 编译时注入的版本信息
var (
	// 这些变量将在编译时通过 ldflags 注入
	Version   = "unknown" // 默认版本，编译时会被覆盖
	BuildTime = GetCurrentTimeString()
	GitCommit = "unknown"
	GitBranch = "unknown"
)

// getVersionFromFile 从VERSION文件读取版本号（备用方案）
func getVersionFromFile() string {
	data, err := os.ReadFile("VERSION")
	if err != nil {
		return "1.0.0" // 默认版本
	}
	return strings.TrimSpace(string(data))
}

// GetVersionInfo 获取版本信息
func GetVersionInfo() *VersionInfo {
	buildTime, _ := ParseTime(BuildTime)

	// 检查版本信息是否通过编译时注入
	version := Version
	gitCommit := GitCommit
	gitBranch := GitBranch

	// 如果编译时注入的版本是默认值，尝试从文件读取
	if version == "unknown" {
		version = getVersionFromFile()
	}

	// 如果Git信息是默认值，尝试从文件读取
	if gitCommit == "unknown" {
		gitCommit = "unknown"
	}
	if gitBranch == "unknown" {
		gitBranch = "unknown"
	}

	return &VersionInfo{
		Version:     version,
		BuildTime:   buildTime,
		GitCommit:   gitCommit,
		GitBranch:   gitBranch,
		GoVersion:   runtime.Version(),
		NodeVersion: getNodeVersion(),
		Platform:    runtime.GOOS,
		Arch:        runtime.GOARCH,
	}
}

// GetVersionString 获取版本字符串
func GetVersionString() string {
	info := GetVersionInfo()
	return fmt.Sprintf("v%s (%s)", info.Version, info.GitCommit)
}

// GetFullVersionInfo 获取完整版本信息
func GetFullVersionInfo() string {
	info := GetVersionInfo()
	return fmt.Sprintf(`版本信息:
  版本号: v%s
  构建时间: %s
  Git提交: %s
  Git分支: %s
  Go版本: %s
  Node版本: %s
  平台: %s/%s`,
		info.Version,
		FormatTime(info.BuildTime, TimeFormatDateTime),
		info.GitCommit,
		info.GitBranch,
		info.GoVersion,
		info.NodeVersion,
		info.Platform,
		info.Arch,
	)
}

// LoadVersionFromFile 从文件加载版本信息
func LoadVersionFromFile(filename string) (*VersionInfo, error) {
	data, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}

	var info VersionInfo
	err = json.Unmarshal(data, &info)
	if err != nil {
		return nil, err
	}

	return &info, nil
}

// SaveVersionToFile 保存版本信息到文件
func SaveVersionToFile(filename string, info *VersionInfo) error {
	data, err := json.MarshalIndent(info, "", "  ")
	if err != nil {
		return err
	}

	return os.WriteFile(filename, data, 0644)
}

// getNodeVersion 获取Node.js版本
func getNodeVersion() string {
	// 这里可以通过执行 node --version 来获取
	// 为了简化，返回一个默认值
	return "N/A"
}

// IsVersionNewer 比较版本号
func IsVersionNewer(version1, version2 string) bool {
	// 简单的版本比较，可以根据需要实现更复杂的逻辑
	return version1 > version2
}

// GetVersionComponents 获取版本号组件
func GetVersionComponents(version string) (major, minor, patch int, err error) {
	var majorStr, minorStr, patchStr string
	_, err = fmt.Sscanf(version, "%s.%s.%s", &majorStr, &minorStr, &patchStr)
	if err != nil {
		return 0, 0, 0, err
	}

	// 这里可以添加更复杂的版本号解析逻辑
	return 1, 0, 0, nil
}
