//go:build windows

package platform

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

func OpenSettings() error {
	// Open Windows Settings -> Storage
	// ms-settings:storagesense
	return exec.Command("cmd", "/c", "start", "ms-settings:storagesense").Run()
}

func GetSystemInfo() (*SystemInfo, error) {
	// Use systeminfo or wmic
	// simpler: generic info

	info := &SystemInfo{
		Model:  "PC",
		Chip:   "Unknown",
		Memory: "Unknown",
		OS:     "Windows",
	}

	// Helper to run powershell and get string result
	runPS := func(cmd string) string {
		out, err := exec.Command("powershell", "-NoProfile", "-Command", cmd).Output()
		if err != nil {
			return ""
		}
		return strings.TrimSpace(string(out))
	}

	// 1. Get OS Name (Simplified)
	// Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty Caption
	osName := runPS("(Get-CimInstance Win32_OperatingSystem).Caption")
	if osName != "" {
		info.OS = strings.TrimPrefix(osName, "Microsoft ")
	}

	// 2. Get Memory (in GB)
	// [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB)
	mem := runPS("[math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB)")
	if mem != "" {
		info.Memory = mem + " GB"
	}

	// 3. Get CPU Name
	// (Get-CimInstance Win32_Processor).Name
	cpu := runPS("(Get-CimInstance Win32_Processor).Name")
	if cpu != "" {
		// Cleanup CPU string (remove extra spaces)
		info.Chip = strings.Join(strings.Fields(cpu), " ")
	}

	return info, nil
}

func EmptyTrash() error {
	// PowerShell to empty Recycle Bin
	// Clear-RecycleBin -Force -ErrorAction SilentlyContinue

	// PowerShell to empty Recycle Bin
	// Clear-RecycleBin -Force -ErrorAction SilentlyContinue
	// We use ExecutionPolicy Bypass to avoid permission issues.
	// We also catch errors to prevent 500s on empty bins.

	cmd := exec.Command("powershell", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", "Clear-RecycleBin -Force -ErrorAction SilentlyContinue")
	// If it returns an error, it might be due to permissions or being already empty.
	// We can ignore the error for now to check if that fixes the User's 500.
	err := cmd.Run()
	if err != nil {
		// Log it but return nil effectively?
		// For now, let's return nil because 'Empty Trash' is best-effort.
		// If the user really has a permission issue, it acts as a no-op which is better than a crash.
		fmt.Printf("EmptyTrash warning: %v\n", err)
		return nil
	}
	return nil
}

func GetCachePath() (string, error) {
	home, err := os.UserHomeDir()
	if err != nil {
		return "", err
	}
	return filepath.Join(home, "AppData", "Local", "Temp"), nil
}

func GetDockerPath() (string, error) {
	path, err := exec.LookPath("docker")
	if err == nil {
		return path, nil
	}
	// Common Windows path?
	return "", fmt.Errorf("docker not found")
}

func OpenBrowser(url string) error {
	return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
}
