Option Explicit On

Imports System.IO
Imports System.Text.RegularExpressions
Imports DigitalData.Modules.Logging
Imports Independentsoft

Public Class ClassFilehandle
    Inherits Base.BaseClass

    Public Sub New(pLogConfig As LogConfig)
        MyBase.New(pLogConfig)
    End Sub

    ''' <summary>
    ''' Diese Funktion entfernt alle Zeichen aus dem übergebenen String
    ''' die in Dateinamen nicht erlaubt sind.
    ''' </summary>
    ''' <param name="Input">Der zu prüfende String</param>
    ''' <returns>String ohne nichterlaubte Zeichen</returns>
    Public Function InvalidCharacters(Input As String) As String
        Dim replacement = ""
        'Return System.Text.RegularExpressions.Regex.Replace(Input, "[\\/:*?""<>|\r\n]", "", System.Text.RegularExpressions.RegexOptions.Singleline)
        Dim regexSearch = New String(Path.GetInvalidFileNameChars()) & New String(Path.GetInvalidPathChars())
        Dim r = New Regex(String.Format("[{0}]", Regex.Escape(regexSearch)))
        Return r.Replace(Input, replacement)
    End Function
    Public Function CheckDuplicateFiles(Filepath As String, ModuleTitle As String)
        Dim oFileInfo As New FileInfo(Filepath)
        Dim oFilename As String = oFileInfo.Name
        Dim oFileExists As Date = ClassHelpers.FileExistsinDropTable(Filepath)

        If oFileExists.Equals(Date.MinValue) Then
            Return True
        Else
            Dim oResult As DialogResult
            Dim oDate As String = oFileExists.ToString("d")
            Dim oBoxTitle = $"GLOBIX - {ModuleTitle}"
            Dim oBoxOptions = MsgBoxStyle.Question Or MsgBoxStyle.YesNo

            If My.Application.User.Language = "de-DE" Then
                oResult = MsgBox($"Die Datei [{oFilename}] wurde bereits am [{oDate}] verarbeitet. Wollen Sie die gleiche Datei noch einmal verarbeiten?", oBoxOptions, oBoxTitle)
            Else
                oResult = MsgBox($"The file [{oFilename}] has already been processed at [{oDate}]. Do you want to process the same file again?", oBoxOptions, oBoxTitle)
            End If

            If oResult = DialogResult.Yes Then
                Return True
            End If
        End If

        Return False
    End Function

    Public Function Decide_FileHandle(filename As String, handletype As String) As Boolean
        Try
            If filename.EndsWith(".msg") Then
                My.Application.Globix.CurrMessageID = ""
                Dim _msg As New Msg.Message(filename)
                If _msg.Attachments.Count > 0 Then
                    Dim result As DialogResult

                    If My.Application.User.Language = "de-DE" Then
                        result = MessageBox.Show(New Form With {.TopMost = True}, "Achtung: Die Email enthält Anhänge!" & vbNewLine & "Wollen Sie die Anhänge separat indexieren und herauslösen?", "Nachfrage zur Indexierung:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                    Else
                        result = MessageBox.Show(New Form With {.TopMost = True}, "Attention: This Email contains Attachments!" & vbNewLine & "Do you want to extract the attachments and index them seperately?", "Question about Indexing:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                    End If

                    If result = MsgBoxResult.Yes Then
                        If handletype.StartsWith("|FW") Then
                            Return Email_Decay(filename, True)
                        Else
                            Return Email_Decay(filename)
                        End If
                    End If
                End If
            End If

            If filename.ToUpper.EndsWith(".LNK") Then
                If My.Application.User.Language = "de-DE" Then
                    MsgBox("Verknüpfungen können nicht abgelegt werden!", MsgBoxStyle.Critical, "Global Indexer")
                Else
                    MsgBox("Shortcuts cannot be droppped!", MsgBoxStyle.Critical, "Global Indexer")
                End If
                Return False
            End If

            Return Insert_GI_File(filename, handletype)
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Unexpected Error in Decide_FileHandle: " & ex.Message, MsgBoxStyle.Critical)
            Return False
        End Try
    End Function
    Private Function Email_Decay(msgname As String, Optional FW As Boolean = False) As Boolean
        Try
            Dim msgonly As String = "|MSGONLY|"
            Dim ATT_EXTR As String = "|ATTMNTEXTRACTED|"
            If FW = True Then
                msgonly = "|FW_MSGONLY|"
                ATT_EXTR = "|FW_ATTMNTEXTRACTED|"
            End If
            Dim erfolgreich As Boolean = False
            Dim msg As New Msg.Message(msgname)

            If Not msg.InternetMessageId Is Nothing Then
                My.Application.Globix.CurrMessageID = msg.InternetMessageId
            Else
                Logger.Info(">> Email_Decay: Es konnte keine Message-ID gelesen werden. Eine GUID wird erzeugt!")
                Dim sGUID As String
                sGUID = System.Guid.NewGuid.ToString()
                My.Application.Globix.CurrMessageID = sGUID
            End If

            'Nur die MSGDatei ablegen
            Dim tempfile As String = Path.Combine(Path.GetTempPath, Path.GetFileNameWithoutExtension(msgname) & "_excl_att.msg")

            If File.Exists(tempfile) Then
                File.Delete(tempfile)
            End If
            Dim _msgEXAtt As New Msg.Message(msgname)
            _msgEXAtt.Attachments.Clear()
            _msgEXAtt.Save(tempfile)
            'Datei in Array zum Templöschen speichern
            My.Application.Globix.TEMP_FILES.Add(tempfile)

            If Insert_GI_File(tempfile, msgonly) = True Then
                erfolgreich = True
                'Hier nun die Anhänge herauslösen
                Dim _msg As New Msg.Message(msgname)
                Dim i1 As Integer = 1

                Logger.Info(">> Anzahl der Attachments: " & _msg.Attachments.Count)
                For Each attachment As Independentsoft.Msg.Attachment In _msg.Attachments
                    If erfolgreich = False Then
                        Exit For
                    End If
                    Dim attachment_name As String
                    If attachment.LongFileName Is Nothing Then
                        attachment_name = attachment.DisplayName
                    Else
                        attachment_name = attachment.LongFileName
                    End If
                    If attachment.EmbeddedMessage IsNot Nothing Then
                        attachment_name = InvalidCharacters(attachment_name)
                        tempfile = Path.Combine(Path.GetTempPath, attachment_name & ".msg")
                        tempfile = CType(Versionierung_Datei(tempfile), String)

                        If tempfile <> String.Empty Then
                            Dim oMessage = attachment.EmbeddedMessage
                            oMessage.Save(tempfile)
                            My.Application.Globix.TEMP_FILES.Add(tempfile)
                            Logger.Info("Attachment (" & i1 & "):" & tempfile)
                            erfolgreich = Insert_GI_File(tempfile, ATT_EXTR)
                            i1 += 1
                        End If
                    ElseIf Not attachment_name.Contains("inline") Then
                        'Sonderzeichen entfernen
                        attachment_name = InvalidCharacters(attachment_name)
                        tempfile = Path.Combine(Path.GetTempPath, attachment_name)
                        tempfile = Versionierung_Datei(tempfile)
                        If tempfile <> "" Then
                            attachment.Save(tempfile)
                            'Datei in Array zum Templöschen speichern
                            My.Application.Globix.TEMP_FILES.Add(tempfile)
                            Logger.Info("Attachment (" & i1 & "):" & tempfile)
                            'nun der Insert des Anhanges
                            erfolgreich = Insert_GI_File(tempfile, ATT_EXTR)
                            i1 += 1
                        End If
                    End If
                Next
            End If
            Return erfolgreich
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Error in Email_Decay: " & ex.Message, MsgBoxStyle.Critical)
            Return False
        End Try
    End Function

    Private Function Insert_GI_File(filename As String, handleType As String) As Boolean
        Try
            filename = filename.Replace("'", "''")

            Dim filename_only As String = Path.GetFileName(filename)
            Dim ins As String = "INSERT INTO TBGI_FILES_USER (FILENAME2WORK, USER@WORK,HANDLE_TYPE,FILENAME_ONLY) VALUES ('" & filename & "','" & Environment.UserName & "','" & handleType & "','" & filename_only & "')"
            Return My.DatabaseECM.ExecuteNonQuery(ins)

        Catch ex As Exception
            Return False
        End Try
    End Function
    Public Function IsFileInUse(ByVal fullFilePath As String) As Boolean
        ' Gibt zurück, ob die übergebene Datei momentan exklusiv zu haben ist.
        ' Prüft, ob die angegeben Datei aktuell durch eine
        ' andere Anwendung in Benutzung ist
        Dim ff As Integer = FreeFile()
        If System.IO.File.Exists(fullFilePath) Then
            Try
                ' Versuchen, die Datei mit *exklusiven* Lese- und
                ' Schreibrechten zu öffnen
                FileOpen(ff, fullFilePath, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
            Catch ex As Exception
                ' Ist ein Fehler aufgetreten, so wird nach außen hin generell
                ' davon ausgegangen, dass die Datei in Benutzung ist (obwohl
                ' auch andere Ursachen, etwa Rechteprobleme, möglich sind).
                Logger.Info(">> FileInUse Message: " & ex.Message)
                Return True
            Finally
                ' Die eventuell geöffnete Datei schließen
                FileClose(ff)
            End Try
            Return False
        Else
            Return False
        End If
    End Function
    Public Function Versionierung_Datei(Dateiname As String) As String
        Dim extension As String
        Dim _NewFileString As String = ""
        Try
            Dim version As Integer = 1

            Dim Stammname As String = Path.GetDirectoryName(Dateiname) & "\" & Path.GetFileNameWithoutExtension(Dateiname)
            extension = Path.GetExtension(Dateiname)

            Dim _neuername As String = Stammname
            'Dim MoveFilename As String = DATEINAME.Replace(element.Value, "")
            'Überprüfen ob File existiert
            If File.Exists(_neuername & extension) = False Then
                _NewFileString = _neuername
            Else
                Do While File.Exists(_neuername & extension)
                    version = version + 1
                    _neuername = Stammname & "~" & version
                    _NewFileString = _neuername
                Loop
            End If
            Return _NewFileString & extension
        Catch ex As Exception
            Logger.Info(" - Error in versioning file - error: " & vbNewLine & ex.Message)
            Logger.Error(ex)
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in versioning file:")
            Return ""
        End Try
    End Function
End Class
