# winpe-status-push.ps1 - Posts "WinPE: PESetup / WIM apply" status to the
# PXE webapp /imaging/status endpoint so the imaging dashboard reflects
# this bay BEFORE Run-ShopfloorSetup.ps1 takes over post-PPKG.
#
# Runs in WinPE's stripped PowerShell - cannot rely on Get-NetAdapter,
# Get-CimInstance, or the NetTCPIP module (none are present in stock
# WinPE). Uses wmic for both serial and MAC.
#
# Best-effort: never blocks imaging. All steps log to
# X:\Windows\Temp\winpe-status-push.log; failures are swallowed.

param(
    [string]$PxeServer = '10.9.100.1',
    [int]$Port = 9009,
    [int]$TimeoutSec = 5,
    [string]$PCType = $env:PCTYPE
)

$logFile = 'X:\Windows\Temp\winpe-status-push.log'
function Log {
    param([string]$msg)
    try { "$(Get-Date -Format s) $msg" | Out-File -FilePath $logFile -Append -Encoding utf8 } catch { }
}

Log "=== winpe-status-push start ==="
Log "server=${PxeServer}:${Port}  pctype=$PCType"

# Serial via wmic. Always available in WinPE 10+.
$serial = ''
try {
    $line = (& wmic bios get serialnumber /value 2>$null | Where-Object { $_ -match '=' } | Select-Object -First 1)
    if ($line) { $serial = ($line -split '=', 2)[1].Trim() }
} catch { Log "serial wmic exception: $_" }
Log "serial=$serial"

# MAC via wmic NIC enumeration. NetEnabled filter restricts to up adapters.
$mac = ''
try {
    $macLines = & wmic nic where 'NetEnabled=TRUE' get MacAddress /value 2>$null |
                Where-Object { $_ -match 'MacAddress=' }
    if ($macLines) {
        $first = ($macLines | Select-Object -First 1)
        $mac = (($first -split '=', 2)[1]).Trim() -replace '-', ':'
    }
} catch { Log "mac wmic exception: $_" }
Log "mac=$mac"

if (-not $serial) {
    Log "no serial captured - aborting POST"
    exit 0
}

# Compose JSON. ConvertTo-Json works in WinPE.
$payload = @{
    serial        = $serial
    pctype        = $PCType
    current_stage = 'WinPE: PESetup / WIM apply'
    stage_index   = 1
    stage_total   = 8
    status        = 'in_progress'
}
if ($mac) { $payload.mac = $mac }
$body = $payload | ConvertTo-Json -Compress
$uri  = "http://${PxeServer}:${Port}/imaging/status"
Log "POST $uri  body=$body"

try {
    $resp = Invoke-WebRequest -Uri $uri -Method POST -Body $body `
        -ContentType 'application/json' -UseBasicParsing -TimeoutSec $TimeoutSec -ErrorAction Stop
    Log "OK http=$($resp.StatusCode)"
} catch {
    Log "ERR $($_.Exception.Message)"
}

exit 0
