package template

import (
	"bytes"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"text/template"

	"sunhpc/internal/config"
	"sunhpc/internal/log"
)

// RenderAndExecute 从模板目录加载模板，渲染后生成临时脚本并执行
// tmplName: 模板文件名（位于 /etc/sunhpc/tmpl.d/）
// data: 模板变量
func RenderAndExecute(tmplName string, data interface{}) error {
	tmplPath := filepath.Join(config.TmplDir, tmplName)
	if _, err := os.Stat(tmplPath); err != nil {
		return fmt.Errorf("模板文件不存在: %s", tmplPath)
	}

	content, err := os.ReadFile(tmplPath)
	if err != nil {
		return err
	}

	t, err := template.New(tmplName).Parse(string(content))
	if err != nil {
		return err
	}

	var buf bytes.Buffer
	if err := t.Execute(&buf, data); err != nil {
		return err
	}

	// 生成临时脚本
	tmpFile, err := os.CreateTemp("/tmp", "sunhpc-*.sh")
	if err != nil {
		return err
	}
	defer os.Remove(tmpFile.Name())

	if _, err := tmpFile.Write(buf.Bytes()); err != nil {
		tmpFile.Close()
		return err
	}
	tmpFile.Close()

	if err := os.Chmod(tmpFile.Name(), 0755); err != nil {
		return err
	}

	log.Infof("执行模板脚本: %s", tmpFile.Name())
	cmd := exec.Command("/bin/bash", tmpFile.Name())
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	return cmd.Run()
}
