$ErrorActionPreference = "Stop"
$projectRoot = Split-Path -Parent $PSScriptRoot
$applicationDir = Join-Path $projectRoot "application"
$runtimeTemp = Join-Path $projectRoot ".tools\runtime-temp-$PID"
$wslDistro = if ($env:MAPTOOLS_WSL_DISTRO) { $env:MAPTOOLS_WSL_DISTRO } else { "kali-linux" }
$wslUser = "codex-dev"
if ($env:MAPTOOLS_WSL_USER -and $env:MAPTOOLS_WSL_USER -ne $wslUser) {
    throw "MAPTOOLS_WSL_USER darf ausschließlich '$wslUser' sein."
}
if ($env:MAPTOOLS_WSL_BUILD_USER -and $env:MAPTOOLS_WSL_BUILD_USER -ne $wslUser) {
    throw "MAPTOOLS_WSL_BUILD_USER darf ausschließlich '$wslUser' sein."
}

function Convert-ToWslPath([string]$WindowsPath) {
    $fullPath = [System.IO.Path]::GetFullPath($WindowsPath)
    $drive = $fullPath.Substring(0, 1).ToLowerInvariant()
    return "/mnt/$drive/" + $fullPath.Substring(3).Replace('\', '/')
}

$versionLine = Get-Content (Join-Path $applicationDir "gradle.properties") |
    Where-Object { $_ -match '^maptoolsVersion=' } |
    Select-Object -First 1
if (-not $versionLine) { throw "maptoolsVersion fehlt in application/gradle.properties." }
$version = ($versionLine -split '=', 2)[1].Trim()

& wsl.exe -d $wslDistro -u $wslUser -- bash -lc "test -d /mnt/d && id -u >/dev/null"
if ($LASTEXITCODE -ne 0) {
    throw "Linux-Build blockiert: WSL-Distribution '$wslDistro' oder Benutzer '$wslUser' ist nicht erreichbar. Führe den Release außerhalb einer isolierten Windows-Sandbox aus oder verwende scripts/package-linux.sh auf einem Linux-x64-Buildhost."
}

$wslProjectRoot = Convert-ToWslPath $projectRoot
$wslLinuxRoot = "$wslProjectRoot/Linux"
& wsl.exe -d $wslDistro -u $wslUser -- bash -lc "test -d '$wslLinuxRoot' && test -r '$wslLinuxRoot' && test -w '$wslLinuxRoot' && test -x '$wslLinuxRoot'"
if ($LASTEXITCODE -ne 0) {
    throw "Linux-Build blockiert: Benutzer '$wslUser' besitzt nicht alle benötigten Lese-, Schreib- und Verzeichnisrechte auf '$wslLinuxRoot'. Rechte nicht umgehen; Benutzer vorher fragen."
}

New-Item -ItemType Directory -Force -Path $runtimeTemp | Out-Null
$previousTemp = $env:TEMP
$previousTmp = $env:TMP
$env:TEMP = $runtimeTemp
$env:TMP = $runtimeTemp

try {
    Write-Host "[1/4] Windows- und Quellpaket $version"
    & (Join-Path $PSScriptRoot "package-windows.ps1")
    if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

    Write-Host "[2/4] Linux-Paket $version"
    $wslLinuxScript = Convert-ToWslPath (Join-Path $PSScriptRoot "package-linux.sh")
    & wsl.exe -d $wslDistro -u $wslUser -- bash $wslLinuxScript
    if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

    Write-Host "[3/4] Abhängigkeiten, Werkzeugkette, SBOM und CVEs"
    & (Join-Path $PSScriptRoot "security\audit-release.ps1") -Version $version
    if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

    Write-Host "[4/4] Manifest und Prüfsummen"
    & (Join-Path $PSScriptRoot "security\finalize-release.ps1") -Version $version
    if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
} finally {
    $env:TEMP = $previousTemp
    $env:TMP = $previousTmp
    if (Test-Path -LiteralPath $runtimeTemp) {
        $cleanupSucceeded = $false
        foreach ($cleanupAttempt in 1..15) {
            try {
                Remove-Item -LiteralPath $runtimeTemp -Recurse -Force -ErrorAction Stop
                $cleanupSucceeded = $true
                break
            } catch {
                if ($cleanupAttempt -eq 15) { throw }
                Start-Sleep -Seconds 1
            }
        }
        if (-not $cleanupSucceeded) {
            throw "Projektlokales Release-Tempverzeichnis konnte nicht entfernt werden: $runtimeTemp"
        }
    }
}

Write-Host "Vollständiger Release $version erfolgreich erstellt."
