package script

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"
)

// WriteDebugScript 生成debug.sh调试脚本到工作目录
// 通过环境变量 DEBUG_SCRIPT 控制是否生成 (值为 true 或 1 时生成)
// 返回生成的文件路径，如果未生成则返回空字符串
func (s *ExecuteScriptRequest) WriteDebugScript(scriptPath string, args []string) (string, error) {
	if !s.isDebugScriptEnabled() {
		return "", nil
	}

	var sb strings.Builder

	sb.WriteString("#!/bin/bash\n")
	sb.WriteString("# ========== 调试脚本 (自动生成) ==========\n")
	sb.WriteString("# 警告: 此脚本可能包含敏感信息，请勿提交到版本控制系统\n")
	fmt.Fprintf(&sb, "# 生成时间: %s\n", time.Now().Format("2006-01-02 15:04:05"))
	fmt.Fprintf(&sb, "# 工作目录: %s\n", s.workDir)
	fmt.Fprintf(&sb, "# 脚本路径: %s\n", scriptPath)
	if len(args) > 0 {
		fmt.Fprintf(&sb, "# 脚本参数: %v\n", args)
	}
	sb.WriteString("# ==========================================\n\n")

	sb.WriteString("set -e\n\n")

	// 设置环境变量
	if len(s.envVars) > 0 {
		sb.WriteString("# 设置环境变量\n")
		// 按key排序以保证输出一致性
		keys := make([]string, 0, len(s.envVars))
		for k := range s.envVars {
			keys = append(keys, k)
		}
		// 简单排序
		for i := 0; i < len(keys); i++ {
			for j := i + 1; j < len(keys); j++ {
				if keys[i] > keys[j] {
					keys[i], keys[j] = keys[j], keys[i]
				}
			}
		}
		for _, key := range keys {
			value := s.envVars[key]
			// 转义值中的特殊字符
			escapedValue := strings.ReplaceAll(value, "'", "'\"'\"'")
			fmt.Fprintf(&sb, "export %s='%s'\n", key, escapedValue)
		}
		sb.WriteString("\n")
	}

	// 执行脚本命令
	sb.WriteString("# 执行脚本\n")
	sb.WriteString("exec ")
	sb.WriteString(scriptPath)
	for _, arg := range args {
		sb.WriteString(" ")
		// 转义参数中的特殊字符
		escapedArg := strings.ReplaceAll(arg, "'", "'\"'\"'")
		fmt.Fprintf(&sb, " '%s'", escapedArg)
	}
	sb.WriteString("\n")

	// 写入文件
	debugScriptPath := filepath.Join(s.workDir, "debug.sh")
	if err := os.WriteFile(debugScriptPath, []byte(sb.String()), 0755); err != nil {
		return "", fmt.Errorf("failed to write debug script: %v", err)
	}

	return debugScriptPath, nil
}
