Public Class ClassBWProfileExport

    Private Shared _profiles() As ClassBWProfilExport
    Public Shared xmlConfigFile As String

    Public Shared Sub Init()
        xmlConfigFile = My.Application.Info.DirectoryPath & "\" & My.Settings.conFile_Reporting
        ClassBWProfileExport.LoadFromXmlFile()
    End Sub
    Public Shared Function IsXmlAccessable()
        Dim xml As New Xml.XmlDocument

        Try
            ' XML-Datei laden und speichern um Zugriff zu testen
            xml.Load(xmlConfigFile)
            xml.Save(xmlConfigFile)

            Return True

        Catch ex As Exception
            Try
                Dim fw As System.IO.StreamWriter = New System.IO.StreamWriter(xmlConfigFile)

                fw.WriteLine("<?xml version=""1.0"" encoding=""ISO-8859-1"" standalone=""yes""?>")
                fw.WriteLine("<Settings>")
                fw.WriteLine("<Profile>")
                fw.WriteLine("</Profile>")
                fw.WriteLine("</Settings>")

                fw.Close()
                Return True
            Catch e2 As Exception
                Return False
            End Try

        End Try
    End Function
    Public Shared Sub LoadFromXmlFile()
        Dim i As Integer = 0
        Dim xml As Xml.XmlDocument

        ClassBWProfileExport._profiles = Nothing

        If xmlConfigFile Is Nothing Then
            Exit Sub
        End If


        If Not xmlConfigFile = "" Then

            If IsXmlAccessable() Then
                xml = New Xml.XmlDocument()
                xml.Load(xmlConfigFile)

                ' Anzahl der Profilelemente in der XML-Datei zählen
                Dim anzProfile = xml.SelectNodes("Settings/Profile/Profil").Count

                ' wenn mindestens ein Profilelement eingetragen ist
                If anzProfile > 0 Then
                    ' alle Profile laden
                    Dim xmlNodes As Xml.XmlNodeList = xml.SelectNodes("Settings/Profile/Profil")

                    ' alle Profile der XML-Datei durchlaufen
                    For Each xmlProfil As Xml.XmlNode In xmlNodes

                        ' prüfen ob ein Profilname angegeben wurde
                        If xmlProfil.Attributes("profilname") IsNot Nothing Then

                            ' ein Element an Items anhängen
                            ReDim Preserve ClassBWProfileExport._profiles(i)

                            ClassBWProfileExport._profiles(i) = New ClassBWProfilExport()
                            ' das Profilobjekt erstellen
                            ClassBWProfileExport._profiles(i) = New ClassBWProfilExport( _
                                                                                      xmlProfil.Attributes("profilname").Value, _
                                                                                      xmlProfil.Attributes("sqlanweisung").Value, _
                                                                                      xmlProfil.Attributes("days").Value, _
                                                                                      xmlProfil.Attributes("format").Value, _
                                                                                      xmlProfil.Attributes("path").Value, _
                                                                                      xmlProfil.Attributes("email").Value, _
                                                                                      xmlProfil.Attributes("emailto").Value, _
                                                                                      xmlProfil.Attributes("emailBetreff").Value, _
                                                                                      xmlProfil.Attributes("emailBody").Value, _
                                                                                      xmlProfil.Attributes("emailfrom").Value, _
                                                                                      xmlProfil.Attributes("emailabsender").Value, _
                                                                                      xmlProfil.Attributes("emailsmtp").Value, _
                                                                                      xmlProfil.Attributes("emailuser").Value, _
                                                                                      xmlProfil.Attributes("emailPW").Value, _
                                                                                      xmlProfil.Attributes("emailbest").Value, _
                                                                                      xmlProfil.Attributes("lastExport").Value)
                            ' Zähler für Profile erhöhen
                            i += 1
                        End If

                    Next
                End If
            End If
        End If
    End Sub

    ' erstellt ein neues Profil
    Public Shared Sub Add(ByVal profilname As String, ByVal SQLAnweisung As String, _
              ByVal days As String, ByVal Format As String, ByVal Path As String, ByVal email As Boolean, ByVal emailto As String, ByVal emailBetreff As String, ByVal emailBody As String, _
              ByVal emailfrom As String, ByVal emailAbsender As String, ByVal emailsmtp As String, ByVal emailuser As String, ByVal emailPW As String, ByVal emailbest As String)

        Try
            If Not ClassBWProfileExport.Exists(profilname) Then
                Dim xml As New Xml.XmlDocument
                Dim xmlProfil As Xml.XmlElement

                If ClassBWProfileExport.IsXmlAccessable() Then

                    ' XML-Datei laden
                    xml.Load(xmlConfigFile)

                    Try
                        ' versuchen die XML-Beschreibung zu schreiben
                        xml.InsertBefore(xml.CreateXmlDeclaration("1.0", "ISO-8859-1", "yes"), xml.ChildNodes(0))
                    Catch ex As Exception
                        ' wenn dies nicht funktioniert, ist die Beschreibung schon vorhanden
                    End Try

                    ' wenn die Hauptknoten noch nicht eingetragen wurden, sollen diese angelegt werden
                    If xml.DocumentElement Is Nothing Then xml.AppendChild(xml.CreateElement("Settings"))
                    If xml.SelectSingleNode("Settings/Profile") Is Nothing Then xml.SelectSingleNode("Settings").AppendChild(xml.CreateElement("Profile"))


                    ' dann ein neues Profil anlegen
                    xmlProfil = xml.CreateElement("Profil")

                    ' dem Profil die Attribute zuweisen
                    xmlProfil.SetAttribute("profilname", profilname)
                    xmlProfil.SetAttribute("days", days)
                    xmlProfil.SetAttribute("format", Format)
                    xmlProfil.SetAttribute("path", Path)
                    xmlProfil.SetAttribute("email", email)
                    xmlProfil.SetAttribute("emailto", emailto)
                    xmlProfil.SetAttribute("emailBetreff", emailBetreff)
                    xmlProfil.SetAttribute("emailBody", emailBody)
                    xmlProfil.SetAttribute("emailfrom", emailfrom)
                    xmlProfil.SetAttribute("emailabsender", emailAbsender)
                    xmlProfil.SetAttribute("emailsmtp", emailsmtp)
                    xmlProfil.SetAttribute("emailuser", emailuser)
                    xmlProfil.SetAttribute("emailPW", emailPW)
                    xmlProfil.SetAttribute("emailbest", emailbest)
                    xmlProfil.SetAttribute("lastExport", "01.01.1990")

                    xmlProfil.SetAttribute("sqlanweisung", SQLAnweisung)
                    ' und in den Hauptknoten 'Profile' einhängen
                    xml.SelectSingleNode("Settings/Profile").AppendChild(xmlProfil)

                    ' XML-Datei speichern
                    xml.Save(xmlConfigFile)

                    ' die Liste der Profile im Objekt vergrößern
                    ReDim Preserve ClassBWProfileExport._profiles(ClassBWProfileExport.Count)
                    '       ByVal profilname As String, _
                    'ByVal dbArt As String, ByVal dataSource As String, ByVal userId As String, _
                    ' ByVal password As String, ByVal initialCatalog As String, ByVal SQLAnweisung As String, ByVal DLIntervall As Boolean, ByVal Intervall As String, ByVal time As String

                    ' das Profilobjekt erstellen
                    ClassBWProfileExport._profiles(ClassBWProfileExport.Count - 1) = New ClassBWProfilExport(profilname, _
                                                                                                                SQLAnweisung, _
                                                                                                                days, _
                                                                                                                Format, _
                                                                                                                Path, _
                                                                                                                email, _
                                                                                                                        emailto, _
                                                                                                                        emailBetreff, _
                                                                                                                        emailBody, _
                                                                                                                        emailfrom, _
                                                                                                                        emailAbsender, _
                                                                                                                        emailsmtp, _
                                                                                                                        emailuser, _
                                                                                                                        emailPW, _
                                                                                                                        emailbest, "")
                    MsgBox("Das Profil '" & profilname & "' wurde erfolgreich angelegt!", MsgBoxStyle.Information, "Erfolgsmeldung:")

                End If
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler beim Anlegen eines Profils")
        End Try

    End Sub


    Public Shared Function DeleteProfil(ByVal profilname As String) As Boolean

        Try
            If ClassBWProfileExport.Exists(profilname) Then

                ' XML-Objekt initialisieren
                Dim xml As New Xml.XmlDocument

                If ClassBWProfileExport.IsXmlAccessable() Then

                    ' XML-Datei laden
                    xml.Load(xmlConfigFile)


                    ' ***** Zuerst einmal das Profil heraus löschen ***** '

                    ' XML-Element auswählen
                    Dim node As Xml.XmlElement = xml.SelectSingleNode("Settings/Profile/Profil[@profilname='" & profilname & "']")

                    If node IsNot Nothing Then
                        ' Element löschen
                        node.ParentNode.RemoveChild(node)

                        ' XML-Datei speichern
                        xml.Save(xmlConfigFile)
                    End If


                    If ClassBWProfileExport.Exists(profilname) Then
                        ' temporäres Array erzeugen
                        Dim tempItems() As ClassBWProfilExport = ClassBWProfileExport._profiles
                        ClassBWProfileExport._profiles = Nothing
                        Dim i As Integer = 0


                        ' alle Verknüpfungen durchlaufen
                        For Each item As ClassBWProfilExport In tempItems

                            ' wenn es sich nicht um das gelöschte handelt
                            If Not item.OriginalProfilname = profilname Then

                                ' Größe anpassen
                                ReDim Preserve ClassBWProfileExport._profiles(i)

                                ' die Verknüpfung in das Items-Array übertragen
                                ClassBWProfileExport._profiles(i) = item

                                ' Counter hochzählen
                                i += 1
                            End If
                        Next

                        Return True
                    Else
                        Return False
                    End If
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler beim Löschen eines Profils")
            Return False
        End Try
    End Function


    Public Shared Function Exists(ByVal profilname As String)

        If ClassBWProfileExport.Count > 0 Then
            For Each profil As ClassBWProfilExport In ClassBWProfileExport._profiles
                If profil.OriginalProfilname = profilname Then
                    Return True
                End If
            Next
        End If

        Return False

    End Function

    ' gibt ein einzelnes Profil-Objekt zurück
    Public Shared Function getProfilByName(ByVal profilname As String) As ClassBWProfilExport

        ' alle Profile durchlaufen
        For Each profil As ClassBWProfilExport In _profiles

            ' wenn der aktuelle Profilname mit dem gesuchten Profilnamen übereinstimmt
            If profil.Profilname = profilname Then

                ' das Profil zurückgeben
                Return profil
            End If
        Next

        ' sonst nichts zurückgeben
        Return Nothing

    End Function
    Public Shared ReadOnly Property Profile() As ClassBWProfilExport()
        Get
            Return ClassBWProfileExport._profiles
        End Get
    End Property
    Public Shared ReadOnly Property Count() As Integer
        Get
            ' Anzahl der Profile zurückgeben
            If ClassBWProfileExport._profiles IsNot Nothing Then
                Return ClassBWProfileExport._profiles.Length
            Else
                Return 0
            End If
        End Get
    End Property


End Class
