Private/Invoke-BridgeClosedNotification.ps1

function Invoke-BridgeClosedNotification {
    <#
    .SYNOPSIS
    Στέλνει ειδοποίηση ότι η γέφυρα έκλεισε.

    .DESCRIPTION
    Η Invoke-BridgeClosedNotification δημιουργεί και αποστέλλει ειδοποίηση
    όταν εντοπιστεί κλείσιμο της γέφυρας.

    .PARAMETER CurrentState
    Η λίστα καταστάσεων των γεφυρών.

    .PARAMETER ApiKey
    Το κλειδί API για την υπηρεσία Google OCR.

    .PARAMETER PoUserKey
    Το Pushover User Key του παραλήπτη.

    .PARAMETER PoApiKey
    Το Pushover API Token της εφαρμογής.

    .PARAMETER Configuration
    Το αντικείμενο διαμόρφωσης που περιέχει τις ρυθμίσεις.

    .PARAMETER NotificationProvider
    Προαιρετικό script block που λειτουργεί ως εναλλακτικός πάροχος ειδοποιήσεων.

    .OUTPUTS
    Κανένα (void).

    .EXAMPLE
    Invoke-BridgeClosedNotification -CurrentState $state -PoUserKey 'user123' -PoApiKey 'token123'

    .NOTES
    Στέλνει μόνο για γέφυρες με κατάσταση 'Κλειστή'.
    #>

    [CmdletBinding()]
    [OutputType([void])]
    param (
        [Parameter(Mandatory)][object[]]$CurrentState,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$ApiKey,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$PoUserKey,
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$PoApiKey,
        [Parameter()][PSCustomObject]$Configuration,
        [Parameter()][scriptblock]$NotificationProvider
    )
    if (-not $Configuration) {
        $Configuration = New-BridgeConfiguration
    }
    $null = $PoUserKey; $null = $PoApiKey; $null = $NotificationProvider

    $SendNotification = {
        param(
            [string]$Title,
            [string]$Message,
            [string]$Type
        )
        if ($NotificationProvider) {
            & $NotificationProvider -Title $Title -Message $Message -Type $Type
        } else {
            $pushoverSplat = @{
                PoUserKey = $PoUserKey
                PoApiKey  = $PoApiKey
                Title     = $Title
                Message   = $Message
            }
            Send-BridgePushover @pushoverSplat
        }
    }

    foreach ($entry in $CurrentState) {
        switch ($entry.gefyraStatus) {
            ($Configuration.Statuses.ClosedForMaintenance) {

                $logDetails = @(
                    "🛑 Κλειστή για συντήρηση: $($entry.gefyraName)",
                    "Χρονική στιγμή: $($entry.timestamp)",
                    "Εικόνα: $($entry.imageUrl)",
                    "Μέθοδος: Άμεση ειδοποίηση (χωρίς OCR)"
                ) -join "`n"
                $writeBridgeLogSplat = @{
                    Stage   = 'Ειδοποίηση'
                    Message = $logDetails
                    Level   = 'Debug'
                }
                Write-BridgeLog @writeBridgeLogSplat
                $title   = "🚧 Η γέφυρα της $($entry.gefyraName)ς είναι κλειστή για συντήρηση"
                $message = "Η γέφυρα $($entry.gefyraName)ς είναι κλειστή για συντήρηση. Επιλέξτε άλλη διαδρομή."
                & $SendNotification -Title $title -Message $message -Type 'Closed'
            }
            ($Configuration.Statuses.PermanentlyClosed) {

                $logDetails = @(
                    "🛑 Μόνιμα κλειστή: $($entry.gefyraName)",
                    "Χρονική στιγμή: $($entry.timestamp)",
                    "Εικόνα: $($entry.imageUrl)",
                    "Μέθοδος: Άμεση ειδοποίηση (χωρίς OCR)"
                ) -join "`n"
                $writeBridgeLogSplat = @{
                    Stage   = 'Ειδοποίηση'
                    Message = $logDetails
                    Level   = 'Debug'
                }
                Write-BridgeLog @writeBridgeLogSplat
                $title   = "🚧 Η γέφυρα της $($entry.gefyraName)ς είναι μόνιμα κλειστή"
                $message = "Η γέφυρα $($entry.gefyraName)ς είναι μόνιμα κλειστή. Επιλέξτε άλλη διαδρομή."
                & $SendNotification -Title $title -Message $message -Type 'Closed'
            }
            ($Configuration.Statuses.ClosedWithSchedule) {

                $logDetails = @(
                    "📸 Κλειστή με πρόγραμμα: $($entry.gefyraName)",
                    "Χρονική στιγμή: $($entry.timestamp)",
                    "📷 Εικόνα προς OCR: $($entry.imageUrl)",
                    "Μέθοδος: OCR + Ειδοποίηση"
                ) -join "`n"
                $writeBridgeLogSplat = @{
                    Stage   = 'Ειδοποίηση'
                    Message = $logDetails
                    Level   = 'Debug'
                }
                Write-BridgeLog @writeBridgeLogSplat
                $ocrSplat = @{
                    ApiKey      = $ApiKey
                    ImageUri    = $entry.imageUrl
                    Verbose     = $true
                    ErrorAction = 'Stop'
                }
                try {
                    $ocrResult = Invoke-BridgeOCRGoogleCloud @ocrSplat
                    if ($ocrResult) {
                        $title   = "🚧 Η γέφυρα της $($entry.gefyraName)ς έκλεισε"
                        $message = ($ocrResult | Out-String)
                        & $SendNotification -Title $title -Message $message -Type 'Closed'
                    } else {
                        $title   = "🚧 Η γέφυρα της $($entry.gefyraName)ς έκλεισε με πρόγραμμα"
                        $message = "Δεν κατέστη δυνατή η αυτόματη ανάγνωση του προγράμματος κλεισίματος. Δείτε την εικόνα εδώ: $($entry.imageUrl)"
                        & $SendNotification -Title $title -Message $message -Type 'Closed'
                    }
                } catch {
                    $writeBridgeLogSplat = @{
                        Stage   = 'Σφάλμα'
                        Message = "❌ Απέτυχε η OCR για $($entry.imageUrl): $($_.Exception.Message)"
                        Level   = 'Warning'
                    }
                    Write-BridgeLog @writeBridgeLogSplat
                    $title   = "🚧 Η γέφυρα της $($entry.gefyraName)ς έκλεισε με πρόγραμμα"
                    $message = "Απέτυχε η υπηρεσία OCR. Δείτε την εικόνα εδώ: $($entry.imageUrl)"
                    & $SendNotification -Title $title -Message $message -Type 'Closed'
                }
            }
            default {
                $writeBridgeLogSplat = @{
                    Stage   = 'Ειδοποίηση'
                    Message = "ℹ️ Αγνοείται ειδοποίηση για $($entry.gefyraName)ς με κατάσταση: $($entry.gefyraStatus)"
                    Level   = 'Debug'
                }
                Write-BridgeLog @writeBridgeLogSplat
            }
        }
    }
}