& {
    . "$PSScriptRoot/../../lib/Restoration.ps1";
    . "$PSScriptRoot/../../lib/SoftwareManagement.ps1";
    . "$PSScriptRoot/../../../lib/Software.ps1";
    $configPath = "$env:LocalAppData/LGHUB";

    <#
        .SYNOPSIS
        Stops the running Logitech G Hub instance.
    #>
    function Stop-LGHub {
        [OutputType([string])]
        param()

        $hubName = "lghub_system_tray.exe";
        $candidates = Get-Process | Where-Object { $_.Path -and ((Split-Path -Leaf $_.Path) -eq $hubName) };

        if ($candidates.Count -gt 0) {
            $lghubPath = $candidates[0].Path;
        }
        else {
            $lghubPath = $null;
        }

        $mainProcesses = Get-Process | Where-Object {
            $_.Path -and
            (@("lghub.exe", "lghub_agent.exe", "lghub_updater.exe", $hubName) -contains (Split-Path -Leaf $_.Path)) -and
            (($_.Parent.ProcessName -eq "explorer") -or ($null -eq $_.Parent));
        };

        $null = $mainProcesses | ForEach-Object { $_.Kill($true) };
        return $lghubPath;
    }

    <#
        .SYNOPSIS
        Edits the Logitech G Hub configuration.
    #>
    function Edit-LGHubConfig {
        param(
            [scriptblock] $Action
        )

        Write-Host "Stopping Logitech G Hub";
        $path = Stop-LGHub;
        & $Action;

        if ($path) {
            Write-Host "Restarting Logitech G Hub";
            Start-Process $path;
        }
    }

    Start-SoftwareInstaller @args `
        -Installer {
            Install-ChocoPackage lghub;
            Remove-DesktopIcon "*G HUB*";
        } `
        -UserBackup {
            param(
                [string] $Name,
                [hashtable] $Arguments
            )

            Edit-LGHubConfig {
                Add-BackupArtifacts -User $Arguments.Name -Source $configPath -Path "$Name" `
                    -Include @("settings.db", "icon_cache");
            };
        } `
        -UserConfigurator {
            param(
                [string] $Name,
                [hashtable] $Arguments
            )

            Edit-LGHubConfig {
                Expand-BackupArtifacts -User $Arguments.Name -Path "$Name" -Target $configPath;
            };
        };
} @args;