Imports WINDREAMLib
Imports WMOSRCHLib

Public Class ClassPMWindream

    Inherits ClassWindream_allgemein
    Dim clsWM As ClassWindream_allgemein
    'Private email As New ClassNIEmail
    Private allgFunk As New ClassAllgemeineFunktionen
#Region "+++++ Konstanten +++++"
    Protected Const WMObjectEditModeObject = &H1F
    Protected Const WMObjectStreamOpenModeReadWrite = 2
    Protected Const WMEntityObjectType = 10
    Protected Const WMEntityDocument = 1

    Const WMObjectVariableValueTypeUndefined = 0
    Const WMObjectVariableValueTypeString = 1
    Const WMObjectVariableValueTypeInteger = 2
    Const WMObjectVariableValueTypeInteger64bit = 11
    Const WMObjectVariableValueTypeFloat = 3
    Const WMObjectVariableValueTypeBoolean = 4
    Const WMObjectVariableValueTypeDate = 5
    Const WMObjectVariableValueTypeFixedPoint = 6
    Const WMObjectVariableValueTypeTimeStamp = 7
    Const WMObjectVariableValueTypeCurrency = 8
    Const WMObjectVariableValueTypeTime = 9
    Const WMObjectVariableValueTypeVariant = 10
    Const WMObjectVariableValueTypeMask = &HFFF
    Const WMObjectVariableValueFlagMask = &HFFFFF000
    Const WMObjectVariableValueTypeVector = &H1000
    Const WMObjectVariableValueTypeFulltext = &H2000
    Const WMObjectVariableValueTypeDefaultValue = &H4000

    Const WMObjectEditModeIndexEdit = &H3DA
#End Region

#Region "+++++ Variablen +++++"
    'Private oController As New WMOSearchController
#End Region

#Region "+++++ Allgemeine Methoden und Funktionen +++++"
    Sub New()
        MyBase.New()
    End Sub
    Private Function IsNotEmpty(ByVal aValue As Object)
        If aValue IsNot Nothing Then
            Return True
        Else
            Return False
        End If
    End Function

    Public Function GetValuesfromAuswahlliste(ByVal listname As String)
        Try
            If listname = "" Then
                Return ""
            End If
            Dim oChoiceList = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityChoiceList, listname)
            If Err.Number = 0 And TypeName(oChoiceList) <> "Nothing" Then
                Dim Values = oChoiceList
                Values = oChoiceList.GetVariableValue("vItems")
                Dim anz As Integer = 0

                For Each CLItem In Values
                    If oChoiceList.aName IsNot Nothing Then
                        anz += 1
                    End If
                Next
                Dim strListe(anz - 1)
                Dim zahl As Integer = 0
                For Each CLItem In Values
                    If oChoiceList.aName IsNot Nothing Then
                        strListe(zahl) = CLItem
                        zahl += 1
                    End If
                Next
                Return strListe
            Else
                MsgBox("Auswahlliste: " & listname & " nicht gefunden!", MsgBoxStyle.Critical, "Fehler:")
                Return Nothing
            End If

        Catch ex As Exception
            LOGGER.Error(ex)
            MsgBox(ex.Message, MsgBoxStyle.Critical, $"Error in GetValuesfromAuswahlliste ({listname}):")
            Return Nothing
        End Try
    End Function


    Public Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object)
        Dim vType
        Try
            If Indizes IsNot Nothing And aValues IsNot Nothing Then
                If Not oDocument.aLocked Then

                    ' 02.07. Änderung der Lock Methode, um eine Validierung auch zuzulassen, wenn das Recht "Datei ändern"
                    ' nicht gesetzt ist
                    'oDocument.lock()

                    Try
                        oDocument.LockFor(WMObjectEditModeIndexEdit)
                    Catch ex As Exception
                        LOGGER.Error(ex)
                        frmValidator.idxerr_message = "Could not lock WMFile - Check Your rights and inform the admin!"
                        Return False
                    End Try

                    If oDocument.aObjectType.aName <> CURRENT_WMObjecttype Then
                        ' ihr den entsprechenden Dokumenttyp zuweisen
                        oDocument.aObjectType = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, CURRENT_WMObjecttype)
                        ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
                        LOGGER.Debug("Objekttyp '" & oDocument.aObjectType.aName & "' was changed to '" & CURRENT_WMObjecttype & "'.")
                        Try
                            oDocument.Save()
                        Catch ex As Exception
                            ' wenn es einen Fehler beim speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
                            ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
                            Return False
                        End Try
                    End If


                    Dim i As Integer = 0
                    Dim indexname As String

                    If aValues.Length = 1 And aValues(0) = "" Then
                        LOGGER.Debug("Indexwert ist leer/Nothing - Keine Indexierung")
                    Else
                        'Jetzt jeden Indexwert durchlaufen
                        For Each aName As String In Indizes
                            indexname = aName
                            ' das entsprechende Attribut aus windream auslesen
                            Dim oAttribute = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, Indizes(i))
                            ' den Variablentyp (String, Integer, ...) auslesen 
                            vType = oAttribute.getVariableValue("dwAttrType")
                            ' wenn in aValues an Position i ein Wert steht

                            If IsNotEmpty(aValues(i)) Then
                                Dim _int As Boolean = False
                                Dim _date As Boolean = False
                                Dim _dbl As Boolean = False
                                Dim _bool As Boolean = False
                                'If indexname = "Tournr" Then
                                '    MsgBox("Index: " & indexname & vbNewLine & "wert: " & aValues(i), MsgBoxStyle.Information, "Index: " & aName.ToString)
                                'End If
                                LOGGER.Debug(" ### Indexierung von Index: " & indexname & " ####")
                                'MsgBox(oDocument.aName & vbNewLine & aValues(i) & vbNewLine & vType, MsgBoxStyle.Exclamation, "Zeile 87")
                                Dim value = aValues(i)
                                Dim convertValue
                                Dim vektor As Boolean = False
                                'Den Typ des Index-Feldes auslesen
                                'MsgBox(value.GetType.ToString)
                                Select Case vType
                                    Case WMObjectVariableValueTypeString
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeString")
                                        If value = "DeleteWMAttributeValue" Then
                                            LOGGER.Debug("DeleteWMAttributeValue - simpleAttribute with String.Empty")
                                            convertValue = CStr(String.Empty)
                                        Else
                                            convertValue = CStr(value)
                                        End If

                                    Case WMObjectVariableValueTypeInteger
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeInteger")
                                        If IsNumeric(value) = False Then
                                            If value = String.Empty Then
                                                LOGGER.Debug("Indexing WMObjectVariableValueTypeInteger with vbEmpty")
                                                convertValue = vbEmpty
                                            Else
                                                frmValidator.idxerr_message = "Unerlaubte Eingabe in Numerisches Feld: " & value
                                                LOGGER.Debug("Achtung: Value " & value & " kann nicht in Zahl konvertiert werden!")
                                                oDocument.Save()
                                                oDocument.unlock()
                                                Return False
                                            End If
                                        Else
                                            convertValue = CInt(value)
                                        End If

                                        _int = True
                                    Case WMObjectVariableValueTypeInteger64bit
                                        LOGGER.Debug("Typ des windream-Indexes: Integer64bit")
                                        If IsNumeric(value) = False Then
                                            frmValidator.idxerr_message = "Unerlaubte Eingabe in Numerisches Feld: " & value
                                            LOGGER.Debug("Achtung: Value " & value & " kann nicht in Zahl konvertiert werden!")
                                            oDocument.Save()
                                            oDocument.unlock()
                                            Return False
                                        End If
                                        convertValue = CInt(value)
                                        _int = True
                                    Case WMObjectVariableValueTypeFloat
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
                                        Try
                                            value = Replace(value, ".", ",")
                                            convertValue = Convert.ToDouble(value)
                                        Catch ex As Exception
                                            LOGGER.Error(ex)
                                            frmValidator.idxerr_message = "Could't convert value '" & value & "' to double!"
                                            oDocument.Save()
                                            oDocument.unlock()
                                            Return False
                                        End Try

                                    Case WMObjectVariableValueTypeFixedPoint
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFixedPoint")
                                        Try
                                            convertValue = CDbl(value)
                                        Catch ex As Exception
                                            LOGGER.Error(ex)
                                            frmValidator.idxerr_message = "Could't convert value '" & value & "' to double!"
                                            oDocument.Save()
                                            oDocument.unlock()
                                            Return False
                                        End Try

                                        _dbl = True
                                    Case WMObjectVariableValueTypeBoolean
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeBoolean")
                                        convertValue = CBool(value)
                                        _bool = True
                                    Case WMObjectVariableValueTypeDate
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeDate")
                                        _date = True
                                        'Dim _date As Date = value
                                        convertValue = value
                                    Case WMObjectVariableValueTypeTimeStamp
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeTimeStamp")
                                        convertValue = CInt(value)
                                    Case WMObjectVariableValueTypeCurrency
                                        LOGGER.Info(" >> Typ des windream-Indexes: WMObjectVariableValueTypeCurrency")
                                        'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden
                                        Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(value))
                                        convertValue = aValueWrapper
                                    Case WMObjectVariableValueTypeTime
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeTime", False)
                                        'If ((value)) Then
                                        '    convertValue = CDate(value)
                                        'Else
                                        '    convertValue = ""
                                        'End If
                                        'Dim _date As Date = value
                                        convertValue = convertValue '*_date.ToShortTimeString
                                    Case WMObjectVariableValueTypeFloat
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFloat", False)
                                        convertValue = CStr(value)
                                    Case WMObjectVariableValueTypeVariant
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeVariant", False)
                                        convertValue = CStr(value)
                                    Case WMObjectVariableValueTypeFulltext
                                        LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFulltext", False)
                                        convertValue = CStr(value)
                                    Case 4100
                                        LOGGER.Debug("Typ des windream-Indexes: 4100 Vektor Boolean", False)
                                        vektor = True
                                    Case 4101
                                        LOGGER.Debug("Typ des windream-Indexes: 4101 Vektor Date", False)
                                        vektor = True
                                    Case 4104
                                        LOGGER.Debug("Typ des windream-Indexes: 4104 Vektor Currency", False)
                                        vektor = True
                                    Case 4097
                                        LOGGER.Debug("Typ des windream-Indexes: 4097 Vektor alphanumerisch", False)
                                        vektor = True
                                    Case 4098
                                        LOGGER.Debug("Typ des windream-Indexes: 4098 Vektor Numerisch", False)
                                        vektor = True
                                    Case 4099
                                        LOGGER.Debug("Typ des windream-Indexes: 4099 Vektor Kommazahl", False)
                                        vektor = True
                                    Case 36865
                                        LOGGER.Debug("Typ des windream-Indexes: 36865 Vektor alphanumerisch", False)
                                        vektor = True
                                    Case Else
                                        LOGGER.Debug("Typ des windream-Indexes konnte nicht bestimmt werden!", False)
                                        LOGGER.Debug("Versuch des Auslesens (vType): " & vType)
                                        'MsgBox(vType & vbNewLine & CStr(value), MsgBoxStyle.Exclamation, "Marlon-Case Else")
                                        convertValue = ""
                                End Select
                                If vektor = False Then
                                    If convertValue.ToString Is Nothing = False Then
                                        LOGGER.Debug("Konvertierter Wert: '" & convertValue.ToString & "'", False)
                                    End If
                                End If
                                '############################################################################################
                                '####################### Der eigentliche Indexierungsvorgang ################################
                                '############################################################################################
                                If vektor = False Then
                                    If convertValue.ToString Is Nothing = False Then
                                        Try
                                            LOGGER.Debug("Jetzt indexieren: oDocument.SetVariableValue(" & aName & ", " & convertValue.ToString & ")", False)
                                        Catch ex As Exception
                                            LOGGER.Error(ex)
                                            LOGGER.Info(" >> Unexpected Error in Logging SetVariableValue for " & aName & ": " & ex.Message, False)
                                        End Try



                                        If _int = True Then
                                            oDocument.SetVariableValue(aName, CInt(convertValue))
                                        ElseIf _date = True Then
                                            oDocument.SetVariableValue(aName, CDate(convertValue))
                                        ElseIf _bool Then
                                            oDocument.SetVariableValue(aName, CBool(convertValue))
                                        ElseIf _dbl Then
                                            oDocument.SetVariableValue(aName, CDbl(convertValue))
                                        Else
                                            oDocument.SetVariableValue(aName, convertValue)
                                        End If
                                        LOGGER.Debug("Index '" & aName & "' wurde geschrieben", False)
                                    Else
                                        LOGGER.Info(" >> Kein Indexwert vorhanden", False)
                                    End If
                                Else
                                    'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST
                                    LOGGER.Debug("VEKTORFELD: Vorbereiten des Arrays", False)
                                    If aValues(0).ToString.Contains("DeleteWMAttributeValue") Then
                                        'Variante um Vektorfeld zu leeren
                                        Dim myArray()
                                        ReDim myArray(aValues.Length - 1)
                                        myArray(0) = String.Empty
                                        LOGGER.Debug("Now Indexing vektor-attribute with String.Empty ...")
                                        oDocument.SetVariableValue(aName, myArray)
                                    Else
                                        Dim myArray()
                                        Select Case vType
                                            Case 4100
                                                'Vektortyp Boolean
                                                'Umwandeln in Boolean
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    Select Case obj.ToString.ToLower
                                                        Case "falsch"
                                                            obj = False
                                                        Case "wahr"
                                                            obj = True
                                                        Case "nein"
                                                            obj = False
                                                        Case "ja"
                                                            obj = True
                                                        Case "0"
                                                            obj = False
                                                        Case "1"
                                                            obj = True
                                                    End Select
                                                    myArray(i1) = CBool(obj)
                                                    i1 = i1 + 1
                                                Next
                                            Case 4101
                                                'Vektortyp Date
                                                'Umwandeln in String
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    myArray(i1) = CDate(obj)
                                                    i1 = i1 + 1
                                                Next
                                            Case 4104
                                                'Vektortyp Currency
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(obj))
                                                    myArray(i1) = aValueWrapper
                                                    i1 = i1 + 1
                                                Next
                                            Case 4097
                                                'Vektortyp ALPHANUMERISCH
                                                'Umwandeln in String
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    myArray(i1) = CStr(obj)
                                                    i1 = i1 + 1
                                                Next

                                            Case 4098
                                                'Umwandeln in Integer
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    myArray(i1) = CInt(obj)
                                                    i1 = i1 + 1
                                                Next
                                            Case 4099
                                                'Umwandeln in Double
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    Dim Str As String = obj
                                                    myArray(i1) = CDbl(Str.Replace(".", ","))
                                                    i1 = i1 + 1
                                                Next

                                            Case 36865
                                                'Umwandeln in String
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    myArray(i1) = CStr(obj)
                                                    i1 = i1 + 1
                                                Next
                                            Case Else
                                                'Umwandeln in String
                                                'Die Größe des Arrays festlegen
                                                ReDim myArray(aValues.Length - 1)
                                                Dim i1 As Integer = 0
                                                'Das Array durchlaufen und Werte für den Index in Array schreiben
                                                For Each obj In aValues
                                                    myArray(i1) = CStr(obj)
                                                    i1 = i1 + 1
                                                Next
                                        End Select
                                        'Jetzt die Nachindexierung für Vektor-Felder
                                        LOGGER.Debug("Wert für Index vor Indexierung: [{0}]", myArray)

                                        'If vType = 4097 Or vType = 36865 Then
                                        '    If myArray(0) = "DeleteWMAttributeValue" Then
                                        '        'Variante um Vektorfeld zu leeren
                                        '        LOGGER.Debug("Now Indexing vektor-attribute with vbEmpty ...")
                                        '        oDocument.SetVariableValue(aName, vbEmpty)
                                        '    Else
                                        '        oDocument.SetVariableValue(aName, myArray)
                                        '    End If
                                        'Else
                                        oDocument.SetVariableValue(aName, myArray)
                                        'End If
                                    End If


                                    LOGGER.Debug("'SetVariableValue' für VEKTOR erfolgreich", False)
                                End If
                            End If
                            i += 1

                        Next
                    End If

                    ' oDocument.LockRights()

                    'SetRights(WMObject, User)
                    oDocument.Save()
                    oDocument.unlock()
                    LOGGER.Debug(" ### Indexierung erfolgreich beendet (Save und Unlock durchgeführt) ###", False)
                    Return True
                Else
                    LOGGER.Info(" ### Dokument ist gesperrt, Indexierung nicht möglich! ###", False)
                    frmValidator.idxerr_message = "Dokument " & oDocument.aName & " ist gesperrt, Indexierung nicht möglich"
                    Return False
                End If
            End If
        Catch ex As Exception
            LOGGER.Error(ex)
            LOGGER.Info("ClassSearchResult.RunIndexing - " & ex.Message, True)
            frmValidator.idxerr_message = "Unvorhergesehener Fehler in Indexing: " & ex.Message & vbNewLine & "vType: " & vType.ToString
            oDocument.Save()
            oDocument.unlock()
            Return False
        End Try
    End Function

#End Region



End Class
