Write-LogMessage.psm1

Enum errorLevel
{
  INFO
  SUCCESS
  WARNING
  ERROR
  DEBUG
}
$maxErrorLevelLength = ([System.Enum]::GetNames('errorLevel') | Measure-Object -Maximum -Property Length).Maximum

$colorTable = @{
  INFO = "Cyan"
  SUCCESS = "Green"
  WARNING = "Yellow"
  ERROR = "Red"
  DEBUG = "Gray"
}

Function Write-LogMessage ([string]$logMessage, [errorLevel]$errorLevel = "INFO", [string]$logFilePath, [string]$stack = $null) {
  $timeStamp = Get-Date -Format yyyyMMddTHHmmssfffZ
  
  $writeString = [string]::Format("{0} :: {1} :: {2} {3}", $timeStamp, $errorLevel.ToString().PadRight($maxErrorLevelLength), $logMessage, $stack)
  Write-Host $writeString -ForegroundColor $colorTable["$errorLevel"]
  if ($logFilePath) {
    Try {
      [io.file]::OpenWrite($logFilePath).Close()
      $writeString | Out-File $logFilePath
    } Catch {
      $errorWriteString = [string]::Format("{0} :: {1} :: {2}", $timeStamp, "ERROR".PadRight($maxErrorLevelLength), "Cannot write to specified logFilePath: $logFilePath")
      Write-Host $errorWriteString -ForegroundColor "Red"
    }
  }
}
Export-ModuleMember -Function 'Write-LogMessage'