# Function to query the registry
function Get-RegistryValue {
	param (
		[string]$path,
		[string]$value
	)

	try {
		$result = Get-ItemProperty -Path $path -ErrorAction Stop
		return $result.$value
	} catch {
		return $null
	}
}

Write-Host "Searching for Steam installation..."

# Get Steam installation path from registry
$steam_dir = Get-RegistryValue "HKLM:\SOFTWARE\Valve\Steam" "InstallPath"

if (-not $steam_dir) {
	$steam_dir = Get-RegistryValue "HKLM:\SOFTWARE\WOW6432Node\Valve\Steam" "InstallPath"
}

# Fallback to searching for Steam.exe on all drives
if (-not $steam_dir) {
	Write-Host "No registry key found. Searching for Steam executable on all drives..."
	$drives = Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Name -ge 'C' }

	foreach ($drive in $drives) {
		$steam_exe = Get-ChildItem -Path "$($drive.Name):\" -Recurse -Include "Steam.exe" -ErrorAction SilentlyContinue | Select-Object -First 1

		if ($steam_exe) {
			$steam_dir = Split-Path $steam_exe.FullName -Parent
			break
		}
	}
}

if (-not $steam_dir) {
	Write-Host "Steam installation path not found"
	Read-Host "Press Enter to exit"
	exit
}

Write-Host "Steam installation path: $steam_dir"

# Initialize Garry's Mod directory as null
$gmod_dir = $null

# Check for Garry's Mod installation in the primary Steam library
$gmod_check_path = Join-Path $steam_dir "steamapps\appmanifest_4000.acf"
if (Test-Path $gmod_check_path) {
	$gmod_dir = Join-Path $steam_dir "steamapps\common\GarrysMod"
}

# Check for Garry's Mod in additional Steam library folders if not found in the primary
if (-not $gmod_dir) {
	$library_folders_path = Join-Path $steam_dir "steamapps\libraryfolders.vdf"

	if (Test-Path $library_folders_path) {
		$library_folders = (Get-Content $library_folders_path) -join "`n"
		$library_paths = $library_folders -split '(?=\s*"\d+"\s*{)' # Split by each library entry
		
		foreach ($library in $library_paths) {
			if ($library -match '"path"\s*"\s*(.+)\s*"') {
				$library_path = $matches[1]
			}

			if ($library -match '"4000"') {
				$gmod_dir = Join-Path $library_path "steamapps\common\GarrysMod"
				break
			}
		}
	}
}

if (-not $gmod_dir) {
	Write-Host "GMod installation path not found"
	Read-Host "Press Enter to exit"
	exit
}

Write-Host "GMod installation path: $gmod_dir"

# Confirm Garry's Mod installation path
$GMODPath = Join-Path $gmod_dir "garrysmod"
$AddonsPath = Join-Path $GMODPath "addons"
$_text = "Do you want to install in this path? It will completely wipe the previous Beatrun install if you had one!`n$GMODPath (y/n)"
$GMODConfirmation = Read-Host $_text

if ($GMODConfirmation -eq "y") {
	$TempPath = Join-Path $GMODPath "temp"
	$ZIPPath = Join-Path $TempPath "beatrun.zip"
	$FolderPath = Join-Path $TempPath "beatrun"
	$FolderMainPath = Join-Path $TempPath "beatrun-main"
	New-Item -ItemType Directory -Path $TempPath -Force | Out-Null
	Write-Host "Downloading the archive..."
	(New-Object Net.WebClient).DownloadFile("https://github.com/JonnyBro/beatrun/archive/refs/heads/main.zip", $ZIPPath)
	Write-Host "Downloaded! Unpacking..."
	Expand-Archive $ZIPPath $TempPath -Force
	Write-Host "Unpacked successfully!"
	Rename-Item $FolderMainPath $FolderPath
	Remove-Item $ZIPPath
	$confirmation = Read-Host "Do you want to install modules? (Discord + Steam Presence) (y/n)"
	if ($confirmation -eq "y") {
		$ModulesPath = Join-Path $FolderPath "lua\*"
		$NewModulesPath = Join-Path $GMODPath "lua"
		Copy-Item -Path $ModulesPath -Destination $NewModulesPath -Force -Recurse
	}
	$AddonPath = Join-Path $FolderPath "beatrun"
	$NewAddonPath = Join-Path $AddonsPath "beatrun"
	if (Test-Path $NewAddonPath) {
		Remove-Item $NewAddonPath -Force -Recurse
	}
	Move-Item -Path $AddonPath -Destination $NewAddonPath
	Remove-Item $TempPath -Force -Recurse
	Write-Host "Beatrun Installed!"
}