# Drucklog_Export.ps1
# Nyomtatási napló beolvasása Event Log-ból, feldolgozása és mentése SQLite adatbázisba duplikációk nélkül
# Fontos modul SQLite feldolgozäshoz
# Install-Module -Name SQLite -Scope CurrentUser
# Import-Module SQLite

# --- Beállítások ---
$logName = "Microsoft-Windows-PrintService/Operational"
$dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT01.db"
# $dbPath = "$env:USERPROFILE\Desktop\drucklog_APS-PRINT02.db"

# --- SQLite kapcsolat ---
# Add-Type -Path "C:\Tools\SQLite\System.Data.SQLite.dll"
$connectionString = "Data Source=$dbPath;Version=3;"
$connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
$connection.Open()

# --- Tábla létrehozása, ha nem létezik ---
$createTableCmd = $connection.CreateCommand()
$createTableCmd.CommandText = @"
CREATE TABLE IF NOT EXISTS drucklog (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    event_id INTEGER UNIQUE,
    datum TEXT,
    tag TEXT,
    woche TEXT,
    benutzer TEXT,
    computer TEXT,
    dokument TEXT,
    drucker TEXT,
    seiten INTEGER
);
"@
$createTableCmd.ExecuteNonQuery()

# --- Események lekérdezése ---
$events = Get-WinEvent -LogName $logName -ErrorAction SilentlyContinue | Where-Object { $_.Id -eq 307 }

# --- Adatok feldolgozása ---
$logList = foreach ($event in $events) {
    $msg = $event.Message

    if ($msg -match "im Besitz von (.+?) auf (.+?) wurde auf (.+?) über Port") {
        $benutzer = $matches[1]
        $computer = $matches[2]
        $drucker = $matches[3]
    }
    else {
        continue
    }

    $dokument = if ($msg -match "Dokument (.+?), Dokument drucken") { $matches[1] } else { "Unbekannt" }
    $seiten = if ($msg -match "Gedruckte Seiten: (\d+)") { [int]$matches[1] } else { 0 }

    $calendar = [System.Globalization.CultureInfo]::CurrentCulture.Calendar
    $weekRule = [System.Globalization.CalendarWeekRule]::FirstFourDayWeek
    $firstDay = [System.DayOfWeek]::Monday
    $woche = $calendar.GetWeekOfYear($event.TimeCreated, $weekRule, $firstDay)

    [PSCustomObject]@{
        Id       = $event.RecordId
        Datum    = $event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")
        Tag      = $event.TimeCreated.ToString("yyyy-MM-dd")
        Woche    = $woche
        Benutzer = $benutzer
        Computer = $computer
        Dokument = $dokument
        Drucker  = $drucker
        Seiten   = $seiten
    }
}

# --- Adatok mentése adatbázisba, duplikáció nélkül ---
foreach ($row in $logList) {
    $checkCmd = $connection.CreateCommand()
    $checkCmd.CommandText = "SELECT COUNT(*) FROM drucklog WHERE event_id = @id"
    $checkCmd.Parameters.AddWithValue("@id", $row.Id)
    $exists = $checkCmd.ExecuteScalar()

    if ($exists -eq 0) {
        $insertCmd = $connection.CreateCommand()
        $insertCmd.CommandText = "INSERT INTO drucklog (event_id, datum, tag, woche, benutzer, computer, dokument, drucker, seiten)
                                  VALUES (@id, @datum, @tag, @woche, @benutzer, @computer, @dokument, @drucker, @seiten)"
        $insertCmd.Parameters.AddWithValue("@id", $row.Id)
        $insertCmd.Parameters.AddWithValue("@datum", $row.Datum)
        $insertCmd.Parameters.AddWithValue("@tag", $row.Tag)
        $insertCmd.Parameters.AddWithValue("@woche", $row.Woche)
        $insertCmd.Parameters.AddWithValue("@benutzer", $row.Benutzer)
        $insertCmd.Parameters.AddWithValue("@computer", $row.Computer)
        $insertCmd.Parameters.AddWithValue("@dokument", $row.Dokument)
        $insertCmd.Parameters.AddWithValue("@drucker", $row.Drucker)
        $insertCmd.Parameters.AddWithValue("@seiten", $row.Seiten)
        $insertCmd.ExecuteNonQuery()
    }
}

$connection.Close()
Write-Host "Sikeresen frissítve: $($logList.Count) esemény feldolgozva."
