#!/bin/pwsh
$null = New-Module {
    function Add-PowerShellProfileStatement() {
        param (
            [Parameter(ParameterSetName="Global", Mandatory)]
            [switch]$System,
            [Parameter(ParameterSetName="DefaultUser", Mandatory)]
            [switch]$DefaultUser,
            [Parameter(ParameterSetName="Home")]
            [string]$HomeDir = "~",
            [Parameter(ParameterSetName="Global", Mandatory)]
            [Parameter(ParameterSetName="DefaultUser")]
            [Parameter(ParameterSetName="Home")]
            [string]$Category = $null,
            [Parameter(Position=0, Mandatory=$true)]
            [string]$Statement,
            [switch]$Overwrite
        )

        [System.Collections.Generic.List[string]] $profiles = @();

        if ($System) {
            $configRoot;

            if ($IsWindows) {
                $configRoot = "$env:ProgramData";
            } else {
                $configRoot = "/etc";
            }

            $profiles = @("$configRoot/powershell/.");
        } else {
            [System.Collections.Generic.List[string]] $shells = @();

            if ($DefaultUser) {
                if ($IsWindows) {
                    $HomeDir = "C:/Users/Default";
                } else {
                    $HomeDir = "/etc/skel"
                }
            }

            if (Get-Command pwsh -ErrorAction SilentlyContinue) {
                $shells.Add("pwsh");
            }

            if (Get-Command powershell -ErrorAction SilentlyContinue) {
                $shells.Add("powershell");
            }

            foreach ($shell in $shells) {
                $path = & $shell -NoProfile -c '$PROFILE';
                $profiles.Add($path);
            }

            Push-Location ~;
            $profiles = $profiles |
                ForEach-Object { [System.IO.Path]::GetRelativePath($(Get-Location), $_); } |
                ForEach-Object { "$HomeDir/$_" };
        }

        if ($Category) {
            if (-not $($Overwrite.IsPresent)) {
                $Overwrite = $true;
            }

            $profiles = $profiles | ForEach-Object { Join-Path (Split-Path -Parent $_) "conf.d" "$Category.ps1"; };
        }

        $profiles | ForEach-Object {
            $dirName = Split-Path -Parent $_;

            if (-not (Test-Path -PathType Container $dirName)) {
                $null = New-Item -ItemType Directory -Force $dirName;
            }

            if ((Test-Path -PathType Leaf $_) -and (-not $Overwrite)) {
                Add-Content -Force "$_" "`n$Statement";
            } else {
                Set-Content -Force "$_" "$Statement";
            }
        };

        Pop-Location;
    }

    function Get-ScriptInitializer() {
        param (
            [Parameter(Position=0, Mandatory=$true)]
            $Initializer
        )

        return ". ([scriptblock]::Create(($Initializer) -join `"``n`"))";
    }
}