<#
  fws-return.ps1 — arme le "boot suivant" du firmware (one-shot) vers une cible.

  Cote FWS, l'equivalent est « efibootmgr --bootnext ». Cote Windows, on utilise
  « bcdedit /set {fwbootmgr} bootsequence <id> » : la sequence de boot UNE FOIS
  du firmware (consommee au prochain demarrage puis oubliee), pendant exact de
  BootNext.

  IMPORTANT (robustesse locale) : on NE parse PAS les libelles traduits de
  « bcdedit /enum firmware » (sur un Windows francais « identifier » devient
  « identificateur », « Windows Boot Manager » -> « Gestionnaire d'amorçage
  Windows »). On resout :
    - Windows : par l'alias NON localise {bootmgr} (aucun parsing) ;
    - FWS     : par le CHEMIN EFI (\EFI\FWS\ ou \EFI\GRUB\ ou grubx64.efi), qui
                n'est pas traduit, en associant le GUID (motif stable) du bloc.
  Si FWS est introuvable, on DESARME la one-shot (deletevalue) pour retomber
  proprement sur BootOrder[0]=FWS plutot que de laisser une bascule erronee.

  Doit tourner EN ADMIN. Usage : fws-return.ps1 -Target FWS | -Target Windows
#>
param(
    [ValidateSet('FWS','Windows')]
    [string]$Target = 'FWS'
)
$ErrorActionPreference = 'Stop'

function Set-BootSequence([string]$id) {
    & bcdedit /set '{fwbootmgr}' bootsequence $id | Out-Null
    if ($LASTEXITCODE -ne 0) { throw "bcdedit bootsequence $id a echoue (code $LASTEXITCODE)." }
}
function Clear-BootSequence {
    & bcdedit /deletevalue '{fwbootmgr}' bootsequence 2>$null | Out-Null
}

if ($Target -eq 'Windows') {
    # Alias non localise -> aucun parsing, aucune dependance a la langue.
    Set-BootSequence '{bootmgr}'
    Write-Host "Boot suivant arme vers Windows ({bootmgr})."
    return
}

# --- Target = FWS : resoudre le GUID de l'entree firmware pointant vers FWS ---
# /v force l'affichage des GUID complets. On matche le CHEMIN (non localise),
# pas la description (localisee).
$fw = & bcdedit /enum firmware /v 2>$null
if (-not $fw) { throw "bcdedit /enum firmware n'a rien renvoye (droits admin ?)." }

$reId = '\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}|\{[a-z]+\}'
$rePath = '(?i)\\EFI\\(FWS|GRUB)\\|grubx64\.efi'

$curId = $null; $fwsId = $null
foreach ($line in $fw) {
    $m = [regex]::Match($line, $reId)
    if ($m.Success) { $curId = $m.Value; continue }
    if ($line -match $rePath -and $curId) { $fwsId = $curId; break }
}

if (-not $fwsId) {
    # Rien trouve par le chemin : on ne devine PAS. On desarme toute one-shot
    # pour retomber sur BootOrder[0]=FWS (filet permanent cote FWS).
    Clear-BootSequence
    throw "Entree firmware FWS introuvable (chemin \EFI\FWS ou \EFI\GRUB). One-shot desarmee -> BootOrder assure le retour vers FWS."
}

Set-BootSequence $fwsId
Write-Host "Boot suivant arme vers FWS = $fwsId"
