package runner

import (
	"os"
	"os/exec"
	"path/filepath"
	"time"
)

// aeProcesses are the AE-related executables to force-kill before a fresh launch.
var aeProcesses = []string{
	"AfterFX.exe",            // the AE app
	"aerender.exe",           // the headless renderer
	"AfterFXLib.exe",         // AE render engine
	"dynamiclinkmanager.exe", // Dynamic Link
	"Adobe QT32 Server.exe",  // QuickTime/media server
}

// PrepareFreshAE guarantees a clean AE start before a scan/render: it force-kills
// any leftover AE process (a hung/zombie instance from a prior job would otherwise
// block or corrupt the new launch), waits for them to release file locks, then
// clears the crash/Safe-Mode markers. Call this right before launching afterfx/aerender.
func PrepareFreshAE() {
	if os.Getenv("APPDATA") == "" {
		return // non-Windows / dev
	}
	KillAEProcesses()
	time.Sleep(2 * time.Second) // let the OS reap processes + release locks
	ClearAECrashState()
}

// KillAEProcesses force-terminates every AE-related process tree (taskkill is a
// Windows built-in — no external dep). Errors (e.g. "process not found") are ignored.
func KillAEProcesses() {
	for _, name := range aeProcesses {
		_ = exec.Command("taskkill", "/F", "/T", "/IM", name).Run()
	}
}

// ClearAECrashState removes the markers After Effects uses to decide it crashed,
// so the blocking "Crash Repair Options" (Safe Mode) dialog never appears:
//  1. SCRPriorState.json in each AE prefs version dir (session crash-recovery state).
//  2. HKCU\Software\Adobe\After Effects\AppStates — a leftover per-session GUID
//     (after a kill/crash) trips Safe Mode. reg.exe is a Windows built-in.
// Targeted (vs. wiping all prefs) so the node keeps its AE preferences.
func ClearAECrashState() {
	appData := os.Getenv("APPDATA")
	if appData == "" {
		return
	}
	base := filepath.Join(appData, "Adobe", "After Effects")
	if entries, err := os.ReadDir(base); err == nil {
		for _, e := range entries {
			if e.IsDir() {
				_ = os.Remove(filepath.Join(base, e.Name(), "SCRPriorState.json"))
			}
		}
	}
	_ = exec.Command("reg", "delete", `HKCU\Software\Adobe\After Effects\AppStates`, "/f").Run()
}
