. "$PSScriptRoot/../../Types/InstallerAction.ps1";

$null = New-Module {
    . "$PSScriptRoot/../../Software/PowerShell/Profile.ps1";

    <#
        .SYNOPSIS
        Generates the components for creating a module installer.

        .PARAMETER Name
        The name of the module to install.
    #>
    function Get-ModuleInstallerComponents {
        param(
            [string] $Name,
            [switch] $NativeOnly
        )

        @{
            arguments = @{
                name = $Name;
                nativeOnly = $NativeOnly;
            };
            installer = {
                param(
                    [scriptblock] $Installer,
                    [hashtable] $Arguments
                )

                $env:PENDING_MODULE_NAME = $Arguments.Name;
                $installAction = { Install-Module -Scope AllUsers -Force $env:PENDING_MODULE_NAME @args };

                if (-not $Arguments.NativeOnly) {
                    & $installAction -AcceptLicense;
                }

                if (Test-Command powershell) {
                    powershell -c ($installAction.ToString());
                }

                Remove-Item Env:\PENDING_MODULE_NAME;
                & $Installer -Action ([InstallerAction]::Configure) @PSBoundParameters;
            };

            configurator = {
                param(
                    [hashtable] $Arguments
                )

                $name = $Arguments.Name;

                Add-PowerShellProfileStatement `
                    -DefaultUser `
                    -Category $name `
                    -Script "Import-Module `"$name`";";
            };
        }
    }
};