Imports System.IO
Imports IntraSell_DLL

Module ModuleOnlineSicherung

    Dim handlerAdded As Boolean = False
    Dim _button As Button

    Sub BenoetigtSicherung(ByRef button As Button)

        _button = button
        Dim zuletzt_gesichert = VarValue_Default(LETZTE_SICHERUNG_AM, Now)
        If zuletzt_gesichert < Now.AddDays(-7) Then
            button.Text = String.Format(Messages.ModuleOnlineSicherung_jetzt_sichern, VarValue(LETZTE_SICHERUNG_AM))
            button.ForeColor = Color.Red
        ElseIf zuletzt_gesichert > Now.AddDays(-3) Then
            button.Enabled = False
            button.Visible = False
        Else
            button.ForeColor = Color.Green
        End If
        If Not handlerAdded Then
            AddHandler button.Click, AddressOf OnlineSicherung
            handlerAdded = True
        End If
    End Sub

    Function OfflineSicherungTäglichErstellen()
        If CurrentDB.State = ConnectionState.Open Then
            Dim letzeSicherung = CDate(VarValue_Default(LETZTE_SICHERUNG_TÄGLICH_AM, Now))
            If letzeSicherung < Now.AddDays(-1) Then
                Dim backupFolder = VarValue_Default(LETZTE_SICHERUNG_PFAD, "C:\\IntraSell_Backup")

                If Not IO.Directory.Exists(backupFolder) Then
                    IO.Directory.CreateDirectory(backupFolder)
                End If
                Dim fileMitSicherung = OfflineSicherung()
                File.Copy(fileMitSicherung, Path.Combine(backupFolder, fileMitSicherung))
                SetVarValue(LETZTE_SICHERUNG_TÄGLICH_AM, Now)
            End If
            Return True
        Else
            Return False
        End If
    End Function

    ''' <summary>
    ''' Offline Sicherung erstellen
    ''' </summary>
    Sub OfflineSicherungErstellen()
        Try

            Dim fbd = New FolderBrowserDialog()
            Dim result = fbd.ShowDialog()

            If result = DialogResult.OK Then
                If Not String.IsNullOrWhiteSpace(fbd.SelectedPath) Then
                    Dim fileMitSicherung = OfflineSicherung()
                    File.Copy(fileMitSicherung, Path.Combine(fbd.SelectedPath, fileMitSicherung))
                    MsgBox("Sicherung erfolgreich angelegt!", vbInformation)
                End If
            End If

        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Sub OfflineSicherungWiederherstellen()
        Try
            KassaVerwaltung(Main)
            ShowUserMessage("Benutzen Sie die Teste Wiederherstellen!", "Wiederherstellen", vbInformation, Silent:=False)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    ''' <summary>
    ''' Offline Sicherung
    ''' </summary>
    ''' <returns></returns>
    Function OfflineSicherung() As String
        Dim achtung = New Achtung
        Try
            achtung.Show()
            achtung.ShowMessage("Bitte Warten", "Die IntraSell Daten werden gesichert...bitte abwarten.")

            DBDump()
            Dim startPath = ClassSettings.GetDataPath  '"c:\intrasell_net"
            Dim zipPath = CleanForFilename(VarValue_Default(Variablen.FIRMA, "Ihre Firma")) & "_c_intrasell_net_" & Format(Now, "yyMMddhh24mi") & ".gzip"
            Registrierkassa.Zip.CreateFromDirectory(startPath, zipPath)
            Return zipPath
        Catch ex As Exception
            HandleAppError(ex)
        Finally
            achtung.Close()
        End Try
        Return Nothing
    End Function



    ''' <summary>
    ''' Online Sicherung
    ''' </summary>
    Sub OnlineSicherung()
        Try
            If _button IsNot Nothing Then _button.Enabled = False

            Dim zipPath = OfflineSicherung()

            If File.Exists(zipPath) Then
                My.Computer.Network.UploadFile(sourceFileName:=zipPath, address:="ftp://www.griton.net/" & zipPath,
                                               userName:="Rally", password:="Mashterka!", connectionTimeout:=5000, showUI:=True)
                SetVarValue(LETZTE_SICHERUNG_AM, Now)
            Else
                Dim msg = String.Format(Messages.ModuleOnlineSicherung_Dateifehler, zipPath)
                Throw New Exception(msg)
            End If
            MsgBox(Messages.ModuleOnlineSicherung_fertig, MsgBoxStyle.Information, Messages.ModuleOnlineSicherung_fertig_Titel)
        Catch ex As Exception
            HandleAppError(ex)
        Finally
            If _button IsNot Nothing Then
                _button.Enabled = True
                _button.Text = "Sicherung erstellt am " & Date.Today
                _button.ForeColor = Color.Green
            End If
        End Try
        'logger.Info("Starte Sicherung")
        'Speicher.Sichern(filename)
    End Sub

    Private Sub DBDump()
        WriteLog("Start DBDump")
        Dim startPath = ClassSettings.GetDataPath  '"c:\intrasell_net\"
        Dim mysqldump = VarValue_Default("mysqldump.exe", "c:\MySQL Server 5.1\bin\mysqldump.exe")
        Dim mysqldump_args = VarValue_Default("mysqldump.exe_args", "%database% -uroot -pa1060")

        If Not IO.File.Exists(mysqldump) Then
            WriteLog("Keine DB Sicherung möglich! Wahrscheinlich IntraSell Installation mit OnlineDatenbank!")
            Return
        End If

        Registrierkassa.DbDump.Dump(startPath & "kassa.sql", mysqldump, mysqldump_args.Replace("%database%", "kassa"))
        If Not File.Exists(startPath & "kassa.sql") Then
            Dim msg = String.Format(Messages.ModuleOnlineSicherung_fehlgeschlagen, "Kassa", "Datei kassa.sql fehlt")
            MsgBox(msg, vbCritical)
        End If

        Registrierkassa.DbDump.Dump(startPath & "intrasell_daten_2.sql", mysqldump, mysqldump_args.Replace("%database%", "intrasell_daten_2"))
        If Not File.Exists(startPath & "intrasell_daten_2.sql") Then
            Dim msg = String.Format(Messages.ModuleOnlineSicherung_fehlgeschlagen, "IntraSell", "Datei intrasell_daten_2.sql fehlt")
            MsgBox(msg, vbCritical)
        End If
        WriteLog("End DB Dump")
    End Sub
End Module
