Imports System.Text.RegularExpressions
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Base

''' <summary>
''' Parses Commandline Arguments. Used to jump to a specific point in the application.
''' 
''' Example: --start-search=id#7~doctype#ARE
''' </summary>
Public Class ClassCommandlineArgs
    Inherits BaseClass

    Private CommandLineArgTypes As New List(Of String) From {
        "show-profile",
        "start-search"
    }
    Private CommandLineArgTypeString As String = String.Join("|", CommandLineArgTypes)
    Private CommandLineArgRegex As String = $"(?:-{{2}}(?:({CommandLineArgTypeString})+)=([a-zA-Z0-9~|]+)\s*)+"
    Private CommandLineArgParameterRegex As String = "(?:~{0,1}([\w\d-]+|[\w\d-]+))+"

    Public FunctionName As String
    Public FunctionArgs As New Dictionary(Of String, String)

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

    Public Sub Parse(Args As List(Of String))
        Dim oRegex = New Regex(CommandLineArgRegex)
        Dim oArgRegex = New Regex(CommandLineArgParameterRegex)

        Logger.Debug("Application started with {0} arguments", Args.Count)

        For Each oArg In Args
            Dim oMatch = oRegex.Match(oArg)
            Dim oGroups = oMatch.Groups

            If oMatch.Success = False Then
                Logger.Warn("The Argument [{0}] did not match the required format and was discarded!", oArg)
                Continue For
            End If

            Dim oParamName As String = oGroups.Item(1).Value.Replace("--", "")
            Dim oParamValue As String = oGroups.Item(2).Value

            If oArgRegex.IsMatch(oParamValue) Then
                FunctionName = oParamName

                For Each oValue As String In oParamValue.Split("~"c)
                    Dim oValueArray = oValue.Split("|"c).ToList
                    FunctionArgs.Add(oValueArray.Item(0), oValueArray.Item(1))
                Next
            Else
                Throw New ArgumentException($"Parameters did not match the required format!", "pValue")
            End If

        Next
    End Sub


End Class
