package system

import (
	"bufio"
	"fmt"
	"os"
	"os/exec"
	"strings"
	"time"
)

// ConfigureSysctl 设置内核参数
// 参数: params - 键值对映射，如 {"net.ipv4.ip_forward": "1"}
// 返回: error - 第一个失败的错误
func ConfigureSysctl(params map[string]string) error {
	if len(params) == 0 {
		return nil
	}

	// 首先应用临时配置
	for k, v := range params {
		cmd := exec.Command("sysctl", "-w", fmt.Sprintf("%s=%s", k, v))
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		if err := cmd.Run(); err != nil {
			return fmt.Errorf("设置 sysctl %s=%s 失败: %v", k, v, err)
		}
	}

	// 持久化配置到 /etc/sysctl.conf 或 /etc/sysctl.d/
	return appendToSysctlConf(params)
}

// appendToSysctlConf 将参数写入持久化配置文件
func appendToSysctlConf(params map[string]string) error {
	const sysctlFile = "/etc/sysctl.d/99-sunhpc.conf"

	// 读取现有配置
	existing := make(map[string]bool)
	if data, err := os.ReadFile(sysctlFile); err == nil {
		scanner := bufio.NewScanner(strings.NewReader(string(data)))
		for scanner.Scan() {
			line := strings.TrimSpace(scanner.Text())
			if line == "" || strings.HasPrefix(line, "#") {
				continue
			}
			parts := strings.SplitN(line, "=", 2)
			if len(parts) == 2 {
				existing[strings.TrimSpace(parts[0])] = true
			}
		}
	}

	// 构建新内容
	var content strings.Builder
	content.WriteString("# SunHPC 系统优化配置\n")
	content.WriteString("# 生成时间: " + time.Now().Format(time.RFC3339) + "\n\n")

	for k, v := range params {
		// 跳过已存在的配置（避免重复）
		if existing[k] {
			continue
		}
		content.WriteString(fmt.Sprintf("%s = %s\n", k, v))
	}

	// 如果有新配置才写入
	if content.Len() > 100 {
		if err := os.WriteFile(sysctlFile, []byte(content.String()), 0644); err != nil {
			return err
		}
		// 应用持久化配置
		return exec.Command("sysctl", "--system").Run()
	}

	return nil
}

// GetSysctl 获取当前内核参数值
func GetSysctl(key string) (string, error) {
	cmd := exec.Command("sysctl", "-n", key)
	output, err := cmd.Output()
	if err != nil {
		return "", err
	}
	return strings.TrimSpace(string(output)), nil
}
