# Update-MachineNumber.ps1 - Shared helper for reading and updating the
# machine number in UDC and eDNC. Dot-source from any script that needs
# machine-number operations:
#
#   . "$PSScriptRoot\lib\Update-MachineNumber.ps1"   (from Shopfloor\ scripts)
#   . "$PSScriptRoot\..\Shopfloor\lib\Update-MachineNumber.ps1" (from Standard\ scripts)
#   . "$PSScriptRoot\Update-MachineNumber.ps1"       (from lib\ scripts)
#
# Exported functions:
#   Get-CurrentMachineNumber  - returns @{ Udc = $string_or_null; Ednc = $string_or_null }
#   Update-MachineNumber      - updates both, returns @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
#
# Both handle missing files/keys gracefully (app not installed = skip, not error).

$script:UdcSettingsPath = 'C:\ProgramData\UDC\udc_settings.json'
$script:UdcExePath      = 'C:\Program Files\UDC\UDC.exe'
$script:EdncRegPath     = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'

function Get-CurrentMachineNumber {
    <#
    .SYNOPSIS
        Reads the current machine number from UDC settings JSON and eDNC registry.
    .OUTPUTS
        Hashtable with keys Udc ($string or $null) and Ednc ($string or $null).
    #>
    $result = @{ Udc = $null; Ednc = $null }

    if (Test-Path $script:UdcSettingsPath) {
        try {
            $json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
            $result.Udc = $json.GeneralSettings.MachineNumber
        } catch {}
    }

    if (Test-Path $script:EdncRegPath) {
        try {
            $result.Ednc = (Get-ItemProperty -Path $script:EdncRegPath -Name MachineNo -ErrorAction Stop).MachineNo
        } catch {}
    }

    return $result
}

function Update-MachineNumber {
    <#
    .SYNOPSIS
        Updates UDC + eDNC machine number in one step. Stops UDC before writing,
        relaunches after.
    .PARAMETER NewNumber
        The new machine number (digits only - caller validates).
    .PARAMETER Site
        Site name passed to UDC.exe -site argument. Defaults to 'West Jefferson'.
    .OUTPUTS
        Hashtable: @{ UdcUpdated = $bool; EdncUpdated = $bool; Errors = @() }
    #>
    param(
        [Parameter(Mandatory)]
        [string]$NewNumber,

        [string]$Site = 'West Jefferson'
    )

    $out = @{ UdcUpdated = $false; EdncUpdated = $false; Errors = @(); RegImported = $null }

    # --- If UDC or eDNC is still at placeholder 9999, try to pull the
    #     per-machine .reg backup from the SFLD share and restore all
    #     the eFocas/PPDCS/Hssb config. The tech-typed $NewNumber is still
    #     written last (below), so the restore never clobbers it. ---
    $current = Get-CurrentMachineNumber
    $isPlaceholder = (($current.Udc -in @('9999', $null, '')) -or ($current.Ednc -in @('9999', $null, '')))

    if ($isPlaceholder -and $NewNumber -ne '9999') {
        $sharePath = $null
        $siteCfgPath = 'C:\Enrollment\site-config.json'
        if (Test-Path $siteCfgPath) {
            try {
                $cfg = Get-Content $siteCfgPath -Raw | ConvertFrom-Json
                $sharePath = $cfg.pcProfiles.'Standard-Machine'.ntlarsBackupSharePath
            } catch {}
        }

        if ($sharePath) {
            try {
                . (Join-Path $PSScriptRoot 'Restore-EDncReg.ps1')
                $mounted = Mount-SFLDShare -SharePath $sharePath -DriveLetter 'V:'
                if ($mounted) {
                    try {
                        $out.RegImported = Import-EDncRegBackup -SourceRoot 'V:\' -MachineNumber $NewNumber
                    } finally {
                        & net use V: /delete /y 2>$null | Out-Null
                    }
                } else {
                    Write-Host "  Update-MachineNumber: SFLD share unreachable - skipping restore."
                }
            } catch {
                $out.Errors += "ntlars restore failed: $_"
            }
        }
    }

    # --- Stop UDC before editing its JSON (avoid stale shutdown write) ---
    Get-Process UDC -ErrorAction SilentlyContinue | ForEach-Object {
        try { $_.Kill(); $_.WaitForExit(5000) | Out-Null } catch {}
    }
    Start-Sleep -Seconds 1

    # --- Update UDC settings JSON ---
    if (Test-Path $script:UdcSettingsPath) {
        try {
            $json = Get-Content $script:UdcSettingsPath -Raw | ConvertFrom-Json
            $json.GeneralSettings.MachineNumber = $NewNumber
            $json | ConvertTo-Json -Depth 99 | Set-Content -Path $script:UdcSettingsPath -Encoding UTF8
            $out.UdcUpdated = $true
        } catch {
            $out.Errors += "UDC update failed: $_"
        }
    }

    # --- Update eDNC registry ---
    if (Test-Path $script:EdncRegPath) {
        try {
            Set-ItemProperty -Path $script:EdncRegPath -Name MachineNo -Value $NewNumber -Type String -Force
            $out.EdncUpdated = $true
        } catch {
            $out.Errors += "eDNC update failed: $_"
        }
    }

    # --- Relaunch UDC with new args ---
    if ((Test-Path $script:UdcExePath) -and $out.UdcUpdated) {
        try {
            # UDC.exe arg signature: quoted site name (with space), then
            # dash-prefixed machine number. Example: UDC.exe "West Jefferson" -7605
            Start-Process -FilePath $script:UdcExePath -ArgumentList @("`"$Site`"", "-$NewNumber")
        } catch {
            $out.Errors += "UDC relaunch failed: $_"
        }
    }

    return $out
}
