Imports System.IO
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Data.SQLite

Public Class Service1
#Region "+++++ Variablen +++++"
    Public Shared _windream As New clsWindream_allgemein
    Public Shared threadRunner As BackgroundWorker
    Public Shared WDLaufwerk As String

    Public Shared _PROFIL_ID As Integer
    Dim _INTERVALL As Integer
    'Variablen für Dateiimporter
    
#End Region
#Region "+++++ Start Stop Events +++++"
    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
        ' ausführen, damit der Dienst gestartet werden kann.
        ' Code zum Starten des Dienstes hier einfügen. 
        Init()

    End Sub
    Sub Init()
        Try
            ClassLogger.Init(My.Application.Info.DirectoryPath & "\Log", "logService_")
            ClassLogger.Add(" ", False)
            ClassLogger.Add("## WindreamResultHandler Init-Phase - " & Now & " ## ", False)

            If My.Settings.SQliteConnection = String.Empty Then
                ClassLogger.Add("Achtung: Es wurde noch kein Datenbank-ConnectionString hinterlegt.", True)
                Exit Sub
            Else
                If clsSQLITE.Init = False Then
                    ClassLogger.Add("Achtung: Es konnte keine Verbindung zur Datenbank '" & My.Settings.SQliteConnection & "' hergestellt werden!", True)
                    Exit Sub
                Else
                    '### Thread für Durchlauf generieren
                    Service1.threadRunner = New BackgroundWorker()
                    Service1.threadRunner.WorkerReportsProgress = True
                    Service1.threadRunner.WorkerSupportsCancellation = True
                    AddHandler threadRunner.DoWork, AddressOf RUN_THREAD
                    AddHandler threadRunner.RunWorkerCompleted, AddressOf Thread_Completed

                    '### Den Timer generieren
                    Dim Timer_Durchlauf As New System.Timers.Timer()
                    'Das Event hinterlegen welches bei "Tick" ausgelöst wird
                    AddHandler Timer_Durchlauf.Elapsed, AddressOf Thread_Run
                    ' Set the Interval
                    Timer_Durchlauf.Interval = clsSQLITE.konf_intervall * 60000
                    ClassLogger.Add("- Timer - Intervall: " & clsSQLITE.konf_intervall & " Minuten", False)
                    Timer_Durchlauf.Enabled = True
                    ClassLogger.Add("- Timer gestartet", False)
                    ' Und den Durchlauf das erste Mal starten
                    threadRunner.RunWorkerAsync()
                End If
            End If
        Catch ex As Exception
            ClassLogger.Add(ex.Message, True, "Service Init")
        End Try
    End Sub
    Public Shared Sub Thread_Run()
        If Not threadRunner.IsBusy Then
            threadRunner.RunWorkerAsync()
        End If
    End Sub
    Protected Overrides Sub OnStop()
        ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
        ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
        ClassLogger.Add("", False)
        ClassLogger.Add("## WindreamResultHandler wurde gestoppt - " & Now & " ## ", False)
        ClassLogger.Add("", False)
    End Sub
    Public Shared Sub RUN_THREAD(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        Try
            ClassLogger.Init(My.Application.Info.DirectoryPath & "\Log", "logService_")
            ClassLogger.Add("", False)
            ClassLogger.Add("## Start Durchlauf WindreamResultHandler - " & Now & " ## ", False)
            ClassLogger.Add("", False)
            'windream initialisieren
            If _windream.Init() = True Then
                'Zur sicherheit die DB nochmal initialiseren
                If clsSQLITE.Init() = True Then
                    Dim DT As DataTable = clsSQLITE.Return_Datatable("SELECT GUID FROM TBPROFIL WHERE AKTIV = 1 order by REIHENFOLGE")
                    For Each DR As DataRow In DT.Rows
                        _PROFIL_ID = CInt(DR.Item("GUID"))
                        'Und nun das Profil durchlaufen
                        If clsProfil.Init(_PROFIL_ID) = True Then
                            clsProfil.Profil_Durchlauf()
                        End If
                    Next
                    clsSQLITE.Execute_non_Query("UPDATE TBKONFIGURATION SET LAST_TICK = DATETIME ('now' , 'localtime') WHERE GUID = 1")
                End If
            End If

        Catch ex As Exception
            ClassLogger.Add(ex.Message, True, "RUN_THREAD")
        End Try

    End Sub
#End Region
#Region "*** BackgroundWorker DI und NI beenden und Abbrechen ***"
    Private Shared Sub Thread_Completed(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) 'Handles threadDateiimport.RunWorkerCompleted
        ' This event fires when the DoWork event completes

        Try
            Dim result As String = ""

            If e.Cancelled Then
                ClassLogger.Add("## Der Dateiimport wurde durch den Anwender abgebrochen", False)
            ElseIf e.Error IsNot Nothing Then
                ClassLogger.Add("Fehler bei Durchlauf. Der Vorgang wird abgebrochen.", True, "Thread_Completed")
                ClassLogger.Add(e.Error.Message, True, "Thread_Completed")
            End If

            'If DI_Verzeichnisloeschen Then
            '    Try
            '        My.Computer.FileSystem.DeleteDirectory(DI_Quellordner, FileIO.DeleteDirectoryOption.ThrowIfDirectoryNonEmpty)
            '    Catch ex As Exception
            '        ClassLogger.Add("ACHTUNG: Der Vorgang wurde abgeschlossen. Das Quellverzeichnis konnte jedoch nicht gelöscht werden, da sich in dem Ordner noch Dateien/Verzeichnisse befinden.", False)
            '    End Try
            'End If
        Catch ex As Exception
            ClassLogger.Add(ex.Message, True, "Thread_Completed")
        End Try
    End Sub
    Public Shared Function Thread_Abbrechen()
        Try
            If Service1.threadRunner.IsBusy Then
                Service1.threadRunner.CancelAsync()
            End If
            Return True
        Catch ex As Exception
            ClassLogger.Add(ex.Message, True, "Thread_Abbrechen")
            Return False
        End Try
    End Function
#End Region
End Class
