Imports System.Reflection
Imports System.Windows.Forms
Imports DigitalData.Modules.Logging

Namespace Base
    Public Class BaseErrorHandler
        Private _LogConfig As LogConfig
        Private _Logger As Logger
        Private _Form As Form

        Private Const UNKNOWN_METHOD = "Unknown Method"
        Private Const UNKNOWN_FORM = "Unknown Form"

        Public Sub New(LogConfig As LogConfig, Logger As Logger, Form As Form)
            _LogConfig = LogConfig
            _Logger = Logger
            _Form = Form
        End Sub

        Public Sub ShowErrorMessage(Exception As Exception)
            _Logger.Error(Exception)
            MessageBox.Show(GetMessage(Exception), _Form.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Sub

        Public Sub ShowInfoMessage(Text As String)
            _Logger.Info(Text)
            MessageBox.Show(Text, _Form.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Sub

        Private Function GetMessage(Exception As Exception) As String
            Dim oTargetSite = Exception.TargetSite
            Dim oMethodName = GetMethodName(Exception)
            Dim oFormName = GetFormName(Exception)
            Dim oMessage As String = String.Empty

            If TypeOf Exception Is SqlClient.SqlException Then
                Dim oNumber As Integer = DirectCast(Exception, SqlClient.SqlException).Number
                Select Case oNumber
                    Case 2627
                        oMessage = "Es wurde ein Doppelter Wert in eine Spalte eingetragen, die einzigartig sein muss."
                End Select
            ElseIf TypeOf Exception Is NoNullAllowedException Then
                oMessage = "Einige benötigte Felder wurde nicht ausgefüllt."
            Else
                oMessage = $"Es ist ein unerwarteter Fehler in {oFormName}/{oMethodName} aufgetreten. Mehr Informationen finden Sie im Log."
            End If

            If _LogConfig.Debug Then
                oMessage &= vbNewLine & vbNewLine & "== Debug Informationen =="
                oMessage &= vbNewLine & vbNewLine & "Die ursprüngliche Fehlermeldung lautet:"
                oMessage &= vbNewLine & Exception.Message
                oMessage &= vbNewLine & vbNewLine & "Stacktrace:"
                oMessage &= vbNewLine & Exception.StackTrace
            End If

            Return oMessage
        End Function

        'Private Function GetMessage(Exception As Exception) As String
        '    Dim oTargetSite = Exception.TargetSite
        '    Dim oMethodName = GetMethodName(Exception)
        '    Dim oFormName = GetFormName(Exception)
        '    Dim oMessage As String = String.Empty

        '    oMessage &= $"Form: {oFormName}{vbNewLine}"
        '    oMessage &= $"Method: {oMethodName}{vbNewLine}"

        '    If Not String.IsNullOrEmpty(Exception.StackTrace) Then
        '        oMessage &= $"Message: {Exception.Message}{vbNewLine}{vbNewLine}"
        '    End If

        '    If Not String.IsNullOrEmpty(Exception.StackTrace) Then
        '        oMessage &= $"Stacktrace: {Exception.StackTrace}{vbNewLine}"
        '    End If

        '    oMessage &= $"{vbNewLine}"
        '    oMessage &= $"Please report this error to error@digitaldata.works"

        '    Return oMessage
        'End Function

        Private Function GetMethodName(Exception As Exception) As String
            Dim oMethodName = Exception.TargetSite?.Name

            If oMethodName Is Nothing Then
                Return UNKNOWN_METHOD
            Else
                Return oMethodName
            End If
        End Function

        Private Function GetFormName(Exception As Exception) As String
            Dim oFormName = Exception.TargetSite?.ReflectedType?.Name

            If oFormName Is Nothing Then
                Return UNKNOWN_FORM
            Else
                Return oFormName
            End If
        End Function
    End Class

End Namespace
