Private/ConvertFrom-BridgeOCRResult.ps1

function ConvertFrom-BridgeOCRResult {
    [CmdletBinding()]
    <#
    .SYNOPSIS
    Μετατρέπει το αποτέλεσμα OCR ανάλυσης σε αντικείμενα γέφυρας.

    .DESCRIPTION
    Η ConvertFrom-BridgeOCRResult λαμβάνει τα αποτελέσματα OCR και επιστρέφει αντικείμενα
    που περιγράφουν αν η γέφυρα είναι κλειστή, ανοιχτή ή άγνωστη.

    .PARAMETER OcrResult
    Το αντικείμενο αποτελεσμάτων από το OCR API.

    .OUTPUTS
    [pscustomobject[]] - Αντικείμενα κατάστασης γέφυρας.

    .EXAMPLE
    ConvertFrom-BridgeOCRResult -OcrResult $result

    .NOTES
    Χρησιμοποιείται για να αναλυθούν OCR responses και να εξαχθούν status.
    #>


    [OutputType([PSCustomObject])]
    param (
        [Parameter(Mandatory)][object]$ApiResponse,
        [Parameter(Mandatory)][string]$ImageUri
    )
    $writeBridgeLogSplat = @{
        Stage   = 'Ανάλυση'
        Message = "OCR ApiResponse: $($ApiResponse.responses[0].textAnnotations[0].description)"
    }
    Write-BridgeLog @writeBridgeLogSplat
    # Έλεγχος για κενό κείμενο OCR
    if (-not $ApiResponse.responses[0].textAnnotations[0].description) {
        $writeBridgeLogSplat = @{
            Stage   = 'Σφάλμα'
            Message = 'Δεν κατέστη δυνατή η ανάλυση του κειμένου.'
            Level   = 'Warning'
        }
        Write-BridgeLog @writeBridgeLogSplat
        throw [System.Management.Automation.ErrorRecord]::new(([System.Exception]::new('Δεν βρέθηκε κείμενο OCR στην απόκριση.')),'OCRTextNotFound',[System.Management.Automation.ErrorCategory]::InvalidData,$ApiResponse)
    }
    $rawText = $ApiResponse.responses[0].textAnnotations[0].description
    $Lines = $rawText
    $getBridgeNameFromUriSplat = @{
        ImageUri = $ImageUri
    }
    $bridgeName = Get-BridgeNameFromUri @getBridgeNameFromUriSplat
    $convertToBridgeTimeRangeSplat = @{
        Lines = $Lines
    }
    $timeRange = ConvertTo-BridgeTimeRange @convertToBridgeTimeRangeSplat
    $writeBridgeLogSplat = @{
        Stage   = 'Ανάλυση'
        Message = "OCR ➤ No text annotations found in response. $($timeRange)"
    }
    Write-BridgeLog @writeBridgeLogSplat
    if (-not $timeRange) {
        $writeBridgeLogSplat = @{
            Stage   = 'Σφάλμα'
            Message = 'Δεν κατέστη δυνατή η ανάλυση χρονικού διαστήματος.'
            Level   = 'Warning'
        }
        Write-BridgeLog @writeBridgeLogSplat
        return @()
    }

    $from = $timeRange.From
    $to = $timeRange.To
    $duration = $timeRange.ClosedFor
    $minutesLeft = [int]($to - (Get-Date)).TotalMinutes
    $formatBridgeClosedDurationSplat = @{
        Duration = $duration
    }
    $getBridgeStatusAdviceSplat = @{
        MinutesUntilOpen = $minutesLeft
    }
    $closedForText = ConvertTo-BridgeClosedDuration @formatBridgeClosedDurationSplat
    $advice = Get-BridgeStatusAdvice @getBridgeStatusAdviceSplat
    $advice2 = if ($from -gt (Get-Date)) {
        "Η γέφυρα θα κλείσει στις $($from.ToString('HH:mm')) για $closedForText."
    } else {
        "Η γέφυρα είναι ήδη κλειστή από τις $($from.ToString('HH:mm'))."
    }
    return [PSCustomObject]@{
        'Γέφυρα'      = $bridgeName
        'Από'         = $from.ToString('dd/MM/yyyy HH:mm')
        'Έως'         = $to.ToString('dd/MM/yyyy HH:mm')
        'Κλειστή για' = $closedForText
        'Aνοιγει σε'  = "$minutesLeft λεπτά"
        'Σημείωση 1'  = $advice
        'Σημείωση 2'  = $advice2
    }
}