Public Class ClassLoggerSW

    Private Shared DateiSpeicherort As String = Nothing
    Private Shared DateiPrefix As String = ""
    Private Shared Datei As IO.File = Nothing
    Private Shared Dateiname As String = ""
    Private Shared StreamWriter As IO.StreamWriter = Nothing
    Private Shared _Helper As New ClassHelper
    Private Shared HasInformedAboutError As Boolean = False

    ' eine Art Konstruktor
    Public Shared Sub Init(ByVal speicherort As String, Optional ByVal prefix As String = "", Optional ByVal appendFile As Boolean = True)

        ' initialisiert den Speicherort
        ClassLoggerSW.SetSpeicherort(speicherort)

        ' wenn ein Prfix gesetzt wurde
        If Not prefix = "" Then

            ' initialisiert das Prefix
            ClassLoggerSW.SetPrefix(prefix)
        End If

        ClassLoggerSW.Dateiname = ClassLoggerSW.DateiSpeicherort & "\" & ClassLoggerSW.DateiPrefix & System.DateTime.Now.ToString("yyyy_MM_dd") & ".txt"
        If _Helper.FileExists(ClassLoggerSW.DateiSpeicherort & "\" & ClassLoggerSW.DateiPrefix & System.DateTime.Now.ToString("yyyy_MM_dd") & ".txt") = False Then
            My.Computer.FileSystem.WriteAllText(ClassLoggerSW.Dateiname, String.Empty, False)
        End If

        If Not appendFile Then
            ' der Versuch die Datei zu löschen
            'Try
            '    My.Computer.FileSystem.DeleteFile(ClassNILogger.Dateiname, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.DeletePermanently)
            'Catch ex As Exception
            '    ' bei Fehler besteht kein Schreibrecht auf die Datei oder Datei existiert nicht
            '    ' ALSO: alles Okay soweit
            'End Try


        End If
        ' testen ob sich die Datei öffnen und beschreiben lässt
        ClassLoggerSW.CheckIsLogWritable()

    End Sub

    ' legt den Speicherort fest
    Public Shared Sub SetSpeicherort(ByVal speicherort As String)
        Dim _dir As New IO.DirectoryInfo(My.Application.Info.DirectoryPath & "\Log")
        If speicherort = "" Then
            If _dir.Exists = False Then
                IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath & "\Log")
            End If
            ClassLoggerSW.DateiSpeicherort = My.Application.Info.DirectoryPath & "\Log\"
        Else
            ClassLoggerSW.DateiSpeicherort = speicherort
        End If
    End Sub

    ' legt das Prefix für den Dateinamen fest
    Public Shared Sub SetPrefix(ByVal prefix As String)
        ClassLoggerSW.DateiPrefix = prefix
    End Sub

    Public Shared Sub Add(ByVal information As String, Optional ByVal mit_prefix As Boolean = True)
        If ClassLoggerSW.OpenFile Then
            Try
                If mit_prefix Then
                    ClassLoggerSW.StreamWriter.WriteLine("Nachricht (" & System.DateTime.Now & "): " & information)
                Else
                    ClassLoggerSW.StreamWriter.WriteLine(information)
                End If
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
        End If
    End Sub

    Public Shared Sub Add(ByVal ClassFunction As String, ByVal information As String)
        If ClassLoggerSW.OpenFile Then
            Try
                ClassLoggerSW.StreamWriter.WriteLine("Exception (" & System.DateTime.Now & "): " & ClassFunction & " => " & information)
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
        End If
    End Sub

    Public Shared Sub Add(ByVal ex As Exception)
        If ClassLoggerSW.OpenFile Then
            Try
                ClassLoggerSW.StreamWriter.WriteLine("Exception (" & System.DateTime.Now & "): " & ex.Message & " [" & ex.Source & "]")
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
        End If
    End Sub

    'Public Shared Sub Add(ByVal ex As Oracle.DataAccess.Client.OracleException)
    '    If ClassLoggerSW.OpenFile Then
    '        Try
    '            ClassLoggerSW.StreamWriter.WriteLine("OracleException (" & System.DateTime.Now & "): " & ex.Message & " [" & ex.Source & "][" & ex.ErrorCode & "]")
    '            ClassLoggerSW.CloseFile()
    '        Catch e As Exception
    '            ClassLoggerSW.ShowErrorMessage()
    '        End Try
    '    Else
    '        ClassLoggerSW.ShowErrorMessage()
    '    End If
    'End Sub

    Public Shared Sub Add(ByVal ClassFunction As String, ByVal ex As Exception)
        If ClassLoggerSW.OpenFile Then
            Try
                ClassLoggerSW.StreamWriter.WriteLine("Exception (" & System.DateTime.Now & "): " & ex.Message & " [" & ex.Source & "] => " & ClassFunction)
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
        End If
    End Sub

    'Public Shared Sub Add(ByVal ClassFunction As String, ByVal ex As Oracle.DataAccess.Client.OracleException)
    '    If ClassLoggerSW.OpenFile Then
    '        Try
    '            ClassLoggerSW.StreamWriter.WriteLine("OracleException (" & System.DateTime.Now & "): " & ex.Message & " [" & ex.Source & "][" & ex.ErrorCode & "] => " & ClassFunction)
    '            ClassLoggerSW.CloseFile()
    '        Catch e As Exception
    '            ClassLoggerSW.ShowErrorMessage()
    '        End Try
    '    Else
    '        ClassLoggerSW.ShowErrorMessage()
    '    End If
    'End Sub

    Public Shared Sub Add(ByVal ClassFunction As String, ByVal information As String, ByVal ex As Exception)

        If ClassLoggerSW.OpenFile Then
            Try
                ClassLoggerSW.StreamWriter.WriteLine("Exception (" & System.DateTime.Now & "): " & ex.Message & " [" & ex.Source & "] => " & ClassFunction & " => " & information)
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
        End If

    End Sub

    ' öffnet eine Datei zum Schreiben
    Private Shared Function OpenFile()

        Try

            ' wenn ein Speicherort festgelegt wurde
            If Not ClassLoggerSW.DateiSpeicherort = Nothing Then

                ' den Dateienamen definieren
                Dim dateiname As String = ClassLoggerSW.Dateiname

                ' Datei anlegen wenn noch nicht vorhanden
                My.Computer.FileSystem.WriteAllText(dateiname, String.Empty, True)

                ' die Datei zum Schreiben öffnen
                ClassLoggerSW.StreamWriter = New IO.StreamWriter(dateiname, True, System.Text.Encoding.UTF8)
            End If

            ' wenn die Datei erfolgreich geöffnet wurde
            If ClassLoggerSW.StreamWriter IsNot Nothing Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function

    ' öffnet eine Datei zum Schreiben
    Private Shared Function OpenFile(ByVal DateiSpeicherort As String, ByVal DateiPrefix As String)

        Try

            ' wenn ein Speicherort festgelegt wurde
            If Not DateiSpeicherort = Nothing And ClassLoggerSW.CheckIsLogWritable() Then

                ' den Dateienamen definieren
                Dim dateiname As String = ClassLoggerSW.Dateiname
                ' Datei anlegen wenn noch nicht vorhanden
                My.Computer.FileSystem.WriteAllText(dateiname, String.Empty, True)

                ' die Datei zum Schreiben öffnen
                ClassLoggerSW.StreamWriter = New IO.StreamWriter(dateiname, True, System.Text.Encoding.UTF8)
            End If

            ' wenn die Datei erfolgreich geöffnet wurde
            If ClassLoggerSW.StreamWriter IsNot Nothing Then
                Return True
            Else
                Return False
            End If

        Catch ex As Exception
            Return False
        End Try

    End Function


    ' schliesst die geöffnete Datei
    Private Shared Sub CloseFile()

        ' wenn eine Datei geöffnet ist
        If ClassLoggerSW.StreamWriter IsNot Nothing Then
            ' die Datei schliessen
            ClassLoggerSW.StreamWriter.Close()
            ClassLoggerSW.StreamWriter = Nothing
        End If
    End Sub


    Public Shared Function CheckIsLogWritable()

        If ClassLoggerSW.OpenFile Then
            Try
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
                Return False
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
            Return False
        End If

        Return True
    End Function


    Public Shared Function CheckIsLogWritable(ByVal vDateiSpeicherort As String, ByVal vDateiPrefix As String)

        If ClassLoggerSW.OpenFile(vDateiSpeicherort, vDateiPrefix) Then
            Try
                ClassLoggerSW.CloseFile()
            Catch e As Exception
                ClassLoggerSW.ShowErrorMessage()
                Return False
            End Try
        Else
            ClassLoggerSW.ShowErrorMessage()
            Return False
        End If

        Return True
    End Function
    Private Shared Sub ShowErrorMessage()
        If Not ClassLoggerSW.HasInformedAboutError Then
            ' MsgBox("Beim Öffnen der Logdatei ist ein Fehler aufgetreten. Bitte stellen Sie sicher das Sie sowohl über entsprechende Schreibrechte im Verzeichnis, als auch über ausreichend Speicherplatz zum Speichern der Logdatei verfügen." & vbNewLine & vbNewLine & "Es wird keine Logdatei angelegt oder beschrieben." & vbNewLine & vbNewLine & "Im folgenden werden Sie über Fehler, den Log betreffend nicht weiter informiert, um den Ablauf der Nachindexierung nicht zu stören.", MsgBoxStyle.Information, "Fehler beim Öffnen der Logdatei")
            ClassLoggerSW.HasInformedAboutError = True
        End If
    End Sub


End Class
