Classes/LogManager.ps1

class LogManager {
    [string]$LogFile

    LogManager([string]$Path) {
        $this.LogFile = $Path
    }

    # Overload 1: only message
    [void]Log([string]$Message) {
        $this.Log($Message, "INFO", $false)
    }

    # Overload 2: message + level
    [void]Log([string]$Message, [string]$Level) {
        $this.Log($Message, $Level, $false)
    }

    [void]Log([string]$Message, [string]$Level, [bool]$NotToFile) {
        # Timestamp
        $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

        # Format log line
        $logLine = "[$timestamp]`t[$Level]`t$Message"

        # Choose color based on level
        $color = $null
        switch ($Level) {
            "INFO"  { $color = "White" }
            "WARN"  { $color = "Yellow" }
            "ERROR" { $color = "Red" }
            "DEBUG" { $color = "Cyan" }
            default { $color = "White" }
        }

        # Write to console with color
        Write-Host $logLine -ForegroundColor $color

        # Write to file unless -NotToFile was used
        if (-not $NotToFile) {
            # Ensure directory exists
            $logDir = Split-Path $this.LogFile
            if (-not (Test-Path $logDir)) {
                New-Item -Path $logDir -ItemType Directory -Force | Out-Null
            }
            Add-Content -Path $this.LogFile -Value $logLine
        }
    }
}