@echo off
rem ============================================================================
rem  MDG - ASADA Server: starten UND verbinden mit einem Doppelklick.
rem
rem  Diese Datei ist zweiteilig: oben der Batch-Kopf (ASCII, von cmd.exe gelesen),
rem  ab der Marke unten der eigentliche PowerShell-Teil. Der Kopf laedt die Datei
rem  erneut, schneidet alles vor der Marke ab und fuehrt den Rest aus.
rem  WICHTIG: immer als UTF-8 OHNE BOM speichern (sonst stolpert cmd.exe).
rem ============================================================================
powershell -NoProfile -ExecutionPolicy Bypass -Command "$m='#:'+'PSBEGIN'; $c=[IO.File]::ReadAllText('%~f0',[Text.Encoding]::UTF8); iex $c.Substring($c.IndexOf($m))"
exit /b %errorlevel%

#:PSBEGIN
# ---------------------------------------------------------------------------
#  ASADA Server: Status abfragen -> ggf. starten -> warten -> Remotedesktop.
#  Holt apiBase / rdpHost / rdpUser / startKey zur Laufzeit von der Statusseite,
#  damit eine verteilte Kopie nicht veraltet (genau das war der Fehler 0x204:
#  eine alte .rdp-Datei zeigte noch auf den abgeschalteten Vorgaengerserver).
#  Die Werte unten sind nur der Rueckfall, falls die Seite nicht erreichbar ist.
# ---------------------------------------------------------------------------
$ErrorActionPreference = 'Stop'
try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {}

$PageBase = 'https://wonderful-field-03d0d7a03.7.azurestaticapps.net'
$ApiBase  = 'https://func-mdg-asadatec.azurewebsites.net/api'
$RdpHost  = '20.218.251.64'
$RdpUser  = 'mdguser'
$StartKey = $null
$WaitMax  = 420    # Sekunden, die maximal auf den Start gewartet wird

try { $global:Host.UI.RawUI.WindowTitle = 'MDG ASADA Server' } catch {}

function Schritt($text) { Write-Host ''; Write-Host "  $text" -ForegroundColor Cyan }
function Info($text)    { Write-Host "  $text" }
function Fehler($text)  { Write-Host ''; Write-Host "  $text" -ForegroundColor Red }

function Ende($code) {
    Write-Host ''
    Write-Host '  Zum Schliessen dieses Fensters die Eingabetaste druecken.' -ForegroundColor DarkGray
    try { [void](Read-Host) } catch {}
    exit $code
}

function Get-ServerStatus {
    try { return (Invoke-RestMethod -Uri "$ApiBase/status" -TimeoutSec 25).state }
    catch { return 'unknown' }
}

Write-Host ''
Write-Host '  MDG - ASADA Server' -ForegroundColor Green
Write-Host '  ------------------'

# --- 1) Aktuelle Zugangsdaten von der Statusseite holen ---------------------
Schritt 'Konfiguration wird geladen...'
try {
    $cfg = Invoke-RestMethod -Uri "$PageBase/config.json?t=$(Get-Random)" -TimeoutSec 20
    if ($cfg.apiBase)  { $ApiBase  = $cfg.apiBase }
    if ($cfg.rdpHost)  { $RdpHost  = $cfg.rdpHost }
    if ($cfg.rdpUser)  { $RdpUser  = $cfg.rdpUser }
    if ($cfg.startKey) { $StartKey = $cfg.startKey }
    Info "Server: $RdpHost"
} catch {
    Info 'Statusseite nicht erreichbar - es werden die gespeicherten Werte benutzt.'
}

# --- 2) Status pruefen und bei Bedarf starten -------------------------------
Schritt 'Status wird geprueft...'
$state = Get-ServerStatus

if ($state -eq 'unknown') {
    Fehler 'Der Server ist gerade nicht erreichbar (Azure antwortet nicht).'
    Info 'Bitte in ein paar Minuten noch einmal versuchen.'
    Info 'Wenn es weiter nicht geht: bitte bei Nils melden.'
    Ende 1
}

if ($state -eq 'ready') {
    Info 'Der Server laeuft bereits.'
} else {
    if (-not $StartKey) {
        Fehler 'Der Server ist aus und der Startschluessel fehlt.'
        Info "Bitte die Seite $PageBase im Browser oeffnen und dort starten."
        Ende 1
    }
    Info 'Der Server ist aus - Startbefehl wird gesendet...'
    try {
        Invoke-RestMethod -Uri "$ApiBase/start" -Method Post -TimeoutSec 40 `
            -Headers @{ 'x-functions-key' = $StartKey } | Out-Null
    } catch {
        Fehler 'Der Startbefehl konnte nicht gesendet werden.'
        Info $_.Exception.Message
        Ende 1
    }
}

# --- 3) Warten, bis 3389 wirklich antwortet ---------------------------------
if ($state -ne 'ready') {
    Schritt 'Der Server startet. Das dauert 1 bis 2 Minuten - bitte warten.'
    $uhr = [Diagnostics.Stopwatch]::StartNew()
    while ($state -ne 'ready' -and $uhr.Elapsed.TotalSeconds -lt $WaitMax) {
        $sek = [int]$uhr.Elapsed.TotalSeconds
        $pct = [Math]::Min(99, [int](100 * $sek / $WaitMax))
        $txt = if ($state -eq 'offline') { 'Server wird eingeschaltet' } else { 'Windows faehrt hoch' }
        Write-Progress -Activity 'ASADA Server wird gestartet' -Status "$txt ... ($sek s)" -PercentComplete $pct
        Start-Sleep -Seconds 5
        $state = Get-ServerStatus
    }
    Write-Progress -Activity 'ASADA Server wird gestartet' -Completed

    if ($state -ne 'ready') {
        Fehler 'Der Server ist auch nach mehreren Minuten nicht bereit.'
        Info "Letzter Status: $state"
        Info 'Bitte spaeter noch einmal versuchen oder bei Nils melden.'
        Ende 1
    }
    Info 'Der Server ist bereit.'
}

# --- 4) Verbindungsdatei schreiben und Remotedesktop oeffnen ----------------
Schritt 'Remotedesktop wird geoeffnet...'
$rdpDatei = Join-Path $env:TEMP 'MDG-ASADA-Server.rdp'
$zeilen = @(
    "full address:s:${RdpHost}:3389"
    "username:s:$RdpUser"
    'prompt for credentials:i:1'
    'administrative session:i:0'
    'screen mode id:i:2'
    'redirectclipboard:i:1'
    'audiomode:i:2'
    'authentication level:i:0'
)
Set-Content -LiteralPath $rdpDatei -Value $zeilen -Encoding ASCII

try {
    Start-Process 'mstsc.exe' -ArgumentList "`"$rdpDatei`""
} catch {
    # Falls mstsc.exe fehlt: ueber die Dateizuordnung oeffnen (z. B. Windows App).
    Start-Process $rdpDatei
}

Info "Benutzername: $RdpUser"
Info 'Passwort: wie per E-Mail erhalten.'
Write-Host ''
Write-Host '  Fertig. Dieses Fenster kann geschlossen werden.' -ForegroundColor Green
Start-Sleep -Seconds 8
exit 0
