Private/Shared/JsonConfig/Get-SettingsFromJson.ps1

function Get-SettingsFromJson {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateSet("FileSystem", "Registry")]
        [string]$Mode,
        
        [string[]]$ConfigPaths = (Get-ConfigPaths)
    )
    
    $defaultSettings = Get-DefaultConfig
    
    try {
        Write-Verbose "Searching for configuration files in the following locations:"
        foreach ($path in $ConfigPaths) {
            Write-Verbose " - $path"
            
            if (Test-Path $path) {
                $fileContent = Get-Content -Path $path -Raw -ErrorAction Stop
                $settings = $fileContent | ConvertFrom-Json -ErrorAction Stop
                
                Write-Verbose "Settings loaded from $path"
                
                # Base hashtable with shared settings
                $settingsHashtable = @{
                    ShowConnectorLines = if ($null -ne $settings.Shared.ShowConnectorLines) { $settings.Shared.ShowConnectorLines } else { $defaultSettings.Shared.ShowConnectorLines }
                    ShowExecutionStats = if ($null -ne $settings.Shared.ShowExecutionStats) { $settings.Shared.ShowExecutionStats } else { $defaultSettings.Shared.ShowExecutionStats }
                    ShowConfigurations = if ($null -ne $settings.Shared.ShowConfigurations) { $settings.Shared.ShowConfigurations } else { $defaultSettings.Shared.ShowConfigurations }
                    LineStyle = if ($settings.Shared.LineStyle) { $settings.Shared.LineStyle } else { $defaultSettings.Shared.LineStyle }
                    OpenOutputFileOnFinish = if ($null -ne $settings.Shared.OpenOutputFileOnFinish) { $settings.Shared.OpenOutputFileOnFinish } else { $defaultSettings.Shared.OpenOutputFileOnFinish }
                }
                
                # Add mode-specific settings
                switch ($Mode) {
                    "FileSystem" {
                        $settingsHashtable += @{
                            MaxDepth = if ($null -ne $settings.FileSystem.MaxDepth) { $settings.FileSystem.MaxDepth } else { $defaultSettings.FileSystem.MaxDepth }
                            ExcludeDirectories = if ($settings.FileSystem.ExcludeDirectories -is [array]) { $settings.FileSystem.ExcludeDirectories } else { $defaultSettings.FileSystem.ExcludeDirectories }
                            HumanReadableSizes = if ($null -ne $settings.FileSystem.HumanReadableSizes) { $settings.FileSystem.HumanReadableSizes } else { $defaultSettings.FileSystem.HumanReadableSizes }
                            Files = @{
                                ExcludeExtensions = if ($settings.FileSystem.Files.ExcludeExtensions -is [array]) { $settings.FileSystem.Files.ExcludeExtensions } else { $defaultSettings.FileSystem.Files.ExcludeExtensions }
                                IncludeExtensions = if ($settings.FileSystem.Files.IncludeExtensions -is [array]) { $settings.FileSystem.Files.IncludeExtensions } else { $defaultSettings.FileSystem.Files.IncludeExtensions }
                                FileSizeMinimum = if ($settings.FileSystem.Files.FileSizeMinimum) { $settings.FileSystem.Files.FileSizeMinimum } else { $defaultSettings.FileSystem.Files.FileSizeMinimum }
                                FileSizeMaximum = if ($settings.FileSystem.Files.FileSizeMaximum) { $settings.FileSystem.Files.FileSizeMaximum } else { $defaultSettings.FileSystem.Files.FileSizeMaximum }
                            }
                            Sorting = @{
                                By = if ($settings.FileSystem.Sorting.By) { $settings.FileSystem.Sorting.By } else { $defaultSettings.FileSystem.Sorting.By }
                                SortFolders = if ($null -ne $settings.FileSystem.Sorting.SortFolders) { $settings.FileSystem.Sorting.SortFolders } else { $defaultSettings.FileSystem.Sorting.SortFolders }
                            }
                        }
                    }
                    "Registry" {
                        $settingsHashtable += @{
                            MaxDepth = if ($null -ne $settings.Registry.MaxDepth) { $settings.Registry.MaxDepth } else { $defaultSettings.Registry.MaxDepth }
                            ExcludeKeys = if ($settings.Registry.ExcludeKeys -is [array]) { $settings.Registry.ExcludeKeys } else { $defaultSettings.Registry.ExcludeKeys }
                        }
                    }
                }
                
                Write-Verbose ("Parsed $Mode Settings: " + ($settingsHashtable | ConvertTo-Json -Depth 5))
                return $settingsHashtable
            }
        }
        
        Write-Verbose "Config file not found in any of the potential locations. Using default settings."
        return Get-FlattenedDefaultSettings -Mode $Mode -DefaultSettings $defaultSettings
        
    } catch {
        Write-Warning "Error loading settings file: $($_.Exception.Message)"
        Write-Verbose "Using default settings instead."
        return Get-FlattenedDefaultSettings -Mode $Mode -DefaultSettings $defaultSettings
    }
}

function Get-FlattenedDefaultSettings {
    param(
        [string]$Mode,
        [hashtable]$DefaultSettings
    )
    
    $flattened = @{
        ShowConnectorLines = $DefaultSettings.Shared.ShowConnectorLines
        ShowExecutionStats = $DefaultSettings.Shared.ShowExecutionStats
        LineStyle = $DefaultSettings.Shared.LineStyle
        Sorting = $DefaultSettings.Shared.Sorting
    }
    
    switch ($Mode) {
        "FileSystem" {
            $flattened += @{
                MaxDepth = $DefaultSettings.FileSystem.MaxDepth
                ExcludeDirectories = $DefaultSettings.FileSystem.ExcludeDirectories
                HumanReadableSizes = $DefaultSettings.FileSystem.HumanReadableSizes
                Files = $DefaultSettings.FileSystem.Files
            }
        }
        "Registry" {
            $flattened += @{
                MaxDepth = $DefaultSettings.Registry.MaxDepth
                DisplayValues = $DefaultSettings.Registry.DisplayValues
                ExcludeKeys = $DefaultSettings.Registry.ExcludeKeys
                ValueTypes = $DefaultSettings.Registry.ValueTypes
                EscapeWildcards = $DefaultSettings.Registry.EscapeWildcards
            }
        }
    }
    
    return $flattened
}