package main

import (
	"fmt"
	"os"
	"os/exec"
)

const updateScriptURL = "https://gitea.perlbach24.de/scripte/archivmail/raw/branch/main/update.sh"
const updateScriptPath = "/opt/archivmail/update.sh"

// runUpdate fetches and executes update.sh, which pulls the latest version
// from git, rebuilds frontend + backend, and restarts the services.
// Usage: archivmail update
func runUpdate(args []string) {
	if os.Geteuid() != 0 {
		fmt.Fprintln(os.Stderr, "archivmail update: muss als root ausgeführt werden (sudo archivmail update)")
		os.Exit(1)
	}

	script := updateScriptPath
	if _, err := os.Stat(script); err != nil {
		var dlErr error
		script, dlErr = downloadUpdateScript()
		if dlErr != nil {
			fmt.Fprintf(os.Stderr, "archivmail update: %s nicht gefunden und Download fehlgeschlagen: %v\n", updateScriptPath, dlErr)
			os.Exit(1)
		}
		defer os.Remove(script)
	}

	cmd := exec.Command("bash", script)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Stdin = os.Stdin
	if err := cmd.Run(); err != nil {
		fmt.Fprintf(os.Stderr, "archivmail update: %v\n", err)
		os.Exit(1)
	}
}

func downloadUpdateScript() (string, error) {
	tmp, err := os.CreateTemp("", "archivmail-update-*.sh")
	if err != nil {
		return "", err
	}
	tmp.Close()

	cmd := exec.Command("curl", "-fsSL", updateScriptURL, "-o", tmp.Name())
	cmd.Stderr = os.Stderr
	if err := cmd.Run(); err != nil {
		os.Remove(tmp.Name())
		return "", err
	}
	return tmp.Name(), nil
}
