<#
.SYNOPSIS
    Liest Windows Task Scheduler Aufgaben vom Vortag aus.
    Aus dem Aufgaben-Namen (Format: HOSTNAME_User) wird der Hostname extrahiert
    und in Citrix geprueft, ob die Maschine Registered ist (eingeschaltet + registriert).
    Ergebnisse werden in ein CSV-Log geschrieben.
.DESCRIPTION
    1. Holt alle Task Scheduler Aufgaben vom Vortag (Execution Time).
    2. Extrahiert den Hostnamen aus dem Aufgaben-Namen (erster Teil vor '_').
    3. Queryt Citrix Broker, ob die Maschine Registered und PowerState On ist.
    4. Schreibt Ergebnisse in ein CSV-Log und ein Text-Log.
.EXAMPLE
    .\Get-YesterdayCitrixRegistration.ps1
.NOTES
    Datei:    Get-YesterdayCitrixRegistration.ps1
    Autor:    alin
    Umgebung: Windows mit Task Scheduler + Citrix VDA
    Ort:      Hermes/ (gemäss Gitea-Konvention)
#>

[CmdletBinding()]
param(
    [string]$LogPath = "C:\Logs\CitrixRegistration",
    [string]$CitrixSiteServer = "citrix-site-server",
    [int]$DaysBack = 1
)

# --- Logging ---
$LogFile = Join-Path $LogPath "CitrixRegistration_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
$CsvFile = Join-Path $LogPath "CitrixRegistration_$(Get-Date -Format 'yyyyMMdd').csv"

function Write-Log {
    param([string]$Message, [string]$Level = "INFO")
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $entry = "[$timestamp] [$Level] $Message"
    Write-Host $entry
    Add-Content -Path $LogFile -Value $entry -Encoding UTF8
}

# --- Citrix Broker Modul laden ---
try {
    Import-Module Citrix.Broker.Admin.V2 -ErrorAction Stop
    Write-Log "Citrix Broker-Modul geladen."
} catch {
    Write-Log "Citrix Broker-Modul konnte nicht geladen werden: $_" "ERROR"
    exit 1
}

# --- Vortag berechnen ---
$Yesterday = (Get-Date).AddDays(-$DaysBack).Date
$Tomorrow = $Yesterday.AddDays(1)
Write-Log "Pruefe Aufgaben vom Vortag ($Yesterday)"

# --- Task Scheduler Aufgaben vom Vortag holen ---
# Alle Aufgaben abfragen und nach letzter Ausfuehrung filtern
$AllTasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' }
$YesterdayTasks = @()

foreach ($Task in $AllTasks) {
    try {
        $TaskInfo = $Task | Get-ScheduledTaskInfo -ErrorAction Stop
        # Letzte Ausfuehrung pruefen
        if ($TaskInfo.LastRunTime -ge $Yesterday -and $TaskInfo.LastRunTime -lt $Tomorrow) {
            $YesterdayTasks += [PSCustomObject]@{
                TaskName  = $Task.TaskName
                TaskPath  = $Task.TaskPath
                LastRun   = $TaskInfo.LastRunTime
                State     = $Task.State
            }
        }
    } catch {
        # Aufgaben ohne History (nie gelaufen) ueberspringen
    }
}

if (@($YesterdayTasks).Count -eq 0) {
    Write-Log "Keine Aufgaben vom Vortag ($Yesterday) gefunden." "WARNING"
    exit 0
}

Write-Log "$($YesterdayTasks.Count) Aufgabe(n) vom Vortag gefunden."

# --- Hostnames aus Aufgaben-Namen extrahieren ---
$Results = @()

foreach ($Task in $YesterdayTasks) {
    $taskName = $Task.TaskName

    # Hostname-Extraktion: Format "HOSTNAME_User" -> erster Teil vor dem ersten '_'
    $hostname = ($taskName -split '_')[0]

    if (-not $hostname -or $hostname -eq $taskName) {
        Write-Log "Konnte keinen Hostnamen aus Aufgaben-Namen '$taskName' extrahieren." "WARN"
        continue
    }

    Write-Log "Pruefe Maschine: $hostname (Aufgabe: $taskName)"

    # --- Citrix Registrierungsstatus pruefen ---
    $citrixStatus = @{
        TaskName        = $taskName
        Hostname        = $hostname
        LastRun         = $Task.LastRun.ToString('yyyy-MM-dd HH:mm:ss')
        CheckTime       = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
        IsRegistered    = $false
        IsPoweredOn     = $false
        PowerState      = 'Unknown'
        RegistrationState = 'Unknown'
        SessionState    = 'Unknown'
    }

    try {
        $brokerMachine = Get-BrokerMachine -MachineName $hostname -ErrorAction Stop

        if ($brokerMachine) {
            $citrixStatus.IsRegistered = $true
            $citrixStatus.RegistrationState = 'Registered'
            Write-Log "  -> REGISTRIERT: Ja"
        } else {
            Write-Log "  -> REGISTRIERT: Nein (Maschine nicht in Citrix gefunden)" "WARN"
            $citrixStatus.RegistrationState = 'NotRegistered'
        }

        # PowerState pruefen
        $powerState = $brokerMachine.PowerState
        $citrixStatus.PowerState = $powerState
        $citrixStatus.IsPoweredOn = ($powerState -eq 'On')
        Write-Log "  -> PowerState: $powerState"

        # SessionState pruefen (zusaetzliche Info)
        if ($brokerMachine.SessionState) {
            $citrixStatus.SessionState = $brokerMachine.SessionState
            Write-Log "  -> SessionState: $($brokerMachine.SessionState)"
        }

    } catch {
        Write-Log "  -> FEHLER bei Citrix-Abfrage fuer $hostname : $_" "ERROR"
        $citrixStatus.RegistrationState = 'Error'
    }

    $Results += [PSCustomObject]$citrixStatus
}

# --- CSV schreiben ---
if ($Results.Count -gt 0) {
    $Results | Export-Csv -Path $CsvFile -NoTypeInformation -Encoding UTF8 -Delimiter ';'
    Write-Log "CSV-Log geschrieben: $CsvFile ($($Results.Count) Eintraege)"
} else {
    Write-Log "Keine Ergebnisse zum Schreiben." "WARNING"
}

# --- Zusammenfassung ---
$registered     = ($Results | Where-Object { $_.IsRegistered -eq $true }).Count
$notRegistered  = ($Results | Where-Object { $_.IsRegistered -eq $false -and $_.RegistrationState -ne 'Error' }).Count
$errors         = ($Results | Where-Object { $_.RegistrationState -eq 'Error' }).Count
$poweredOn      = ($Results | Where-Object { $_.IsPoweredOn -eq $true }).Count

Write-Log "=== ZUSAMMENFASSUNG ==="
Write-Log " Gesamt geprueft:        $(@($Results).Count)"
Write-Log " Registriert + PoweredOn: $poweredOn"
Write-Log " Registriert + Aus:       $($registered - $poweredOn)"
Write-Log " Nicht registriert:       $notRegistered"
Write-Log " Fehler:                  $errors"
Write-Log "Log-Datei: $LogFile"
Write-Log "CSV-Datei: $CsvFile"