Public/Invoke-BridgeStatusComparison.ps1

function Invoke-BridgeStatusComparison {
    <#
    .SYNOPSIS
    Συγκρίνει δύο λίστες καταστάσεων γεφυρών και ενεργοποιεί ειδοποιήσεις.

    .DESCRIPTION
    Η Invoke-BridgeStatusComparison συγκρίνει την προηγούμενη και την τρέχουσα
    κατάσταση γεφυρών και καλεί ειδικούς handlers για αλλαγές (άνοιγμα/κλείσιμο).

    .PARAMETER PreviousState
    Η προηγούμενη λίστα καταστάσεων.

    .PARAMETER CurrentState
    Η τρέχουσα λίστα καταστάσεων.

    .PARAMETER ApiKey
    Το API Key για OCR αν απαιτηθεί.

    .PARAMETER PoUserKey
    Το User Key για Pushover ειδοποίηση.

    .PARAMETER PoApiKey
    Το API Token για Pushover ειδοποίηση.

    .OUTPUTS
    None.

    .EXAMPLE
    Invoke-BridgeStatusComparison -PreviousState $prev -CurrentState $curr -ApiKey 'abc' -PoUserKey 'user' -PoApiKey 'token'

    .NOTES
    Καταγράφει αλλαγές και ενεργοποιεί κατάλληλες ειδοποιήσεις.
    #>


    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][object[]]$PreviousState,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][object[]]$CurrentState,
        [Parameter(Mandatory)][string]$ApiKey,
        [Parameter(Mandatory)][string]$PoUserKey,
        [Parameter(Mandatory)][string]$PoApiKey
    )
    Set-StrictMode -Version Latest
    try {
        $compareSplat = @{
            ReferenceObject  = $PreviousState
            DifferenceObject = $CurrentState
            Property         = 'gefyraName', 'gefyraStatus'
            IncludeEqual     = $true
        }
        $diff = Compare-Object @compareSplat
        if (-not $diff) {
            $writeBridgeStageSplat = @{
                Level   = 'Verbose'
                Stage   = 'Ανάλυση'
                Message = '✅ Καμία αλλαγή στις γέφυρες.'
            }
            Write-BridgeStage @writeBridgeStageSplat
            return $false
        }

        $handlerMap = @{
            'Κλειστή για συντήρηση|=>' = 'Closed'
            'Κλειστή για συντήρηση|<=' = 'Closed'
            'Κλειστή με πρόγραμμα|=>'  = 'Closed'
            'Κλειστή με πρόγραμμα|<='  = 'Closed'
            'Μόνιμα κλειστή|=>'        = 'Closed'
            'Μόνιμα κλειστή|<='        = 'Closed'
            'Ανοιχτή|=>'               = 'Opened'
            'Ανοιχτή|<='               = 'Opened'
        }

        foreach ($change in $diff) {
            $writeBridgeStageSplat = @{
                Level   = 'Verbose'
                Stage   = 'Ανάλυση'
                Message = "🌉 $($change.gefyraName) ➜ $($change.gefyraStatus) ($($change.SideIndicator))"
            }
            Write-BridgeStage @writeBridgeStageSplat

            if ($change.SideIndicator -eq '==') {
                $writeBridgeStageSplat = @{
                    Level   = 'Verbose'
                    Stage   = 'Ανάλυση'
                    Message = "Καμία ουσιαστική αλλαγή στην $($change.gefyraName)."
                }
                Write-BridgeStage @writeBridgeStageSplat
                continue
            }

            $key = "$($change.gefyraStatus)|$($change.SideIndicator)"
            if ($handlerMap.ContainsKey($key)) {
                $type = $handlerMap[$key]
                # ΔΙΟΡΘΩΣΗ: Βρες το αντικείμενο που άλλαξε από το σωστό state ανάλογα με το SideIndicator
                if ($change.SideIndicator -eq '=>') {
                    # Νέα κατάσταση - ψάχνε στο CurrentState
                    $changedBridgeState = @($CurrentState | Where-Object { $_.GefyraName -eq $change.GefyraName })
                } else {
                    # Παλιά κατάσταση (<=) - ψάχνε στο PreviousState αλλά στείλε τη νέα από CurrentState
                    $bridgeInCurrent = @($CurrentState | Where-Object { $_.GefyraName -eq $change.GefyraName })
                    if ($bridgeInCurrent.Count -gt 0) {
                        $changedBridgeState = $bridgeInCurrent
                    } else {
                        # Fallback: χρήση PreviousState αν δεν υπάρχει στο Current
                        $changedBridgeState = @($PreviousState | Where-Object { $_.GefyraName -eq $change.GefyraName })
                    }
                }
                if ($changedBridgeState.Count -gt 0) {
                    $sendBridgeNotificationSplat = @{
                        Type      = $type
                        State     = $changedBridgeState
                        ApiKey    = $ApiKey
                        PoUserKey = $PoUserKey
                        PoApiKey  = $PoApiKey
                    }
                    Send-BridgeNotification @sendBridgeNotificationSplat
                }
                continue
            } else {
                $writeBridgeStageSplat = @{
                    Stage   = 'Σφάλμα'
                    Message = "❓ Άγνωστο combo: $key"
                    Level   = 'Warning'
                }
                Write-BridgeStage @writeBridgeStageSplat
            }
        }
        return $true
    } catch {
        $writeBridgeStageSplat = @{
            Level   = 'Warning'
            Stage   = 'Σφάλμα'
            Message = "❌ $($_.Exception.Message)"
        }
        Write-BridgeStage @writeBridgeStageSplat
        throw
    }
}