Private/Import-PAConfig.ps1

function Import-PAConfig {
    [CmdletBinding()]
    param(
        [Parameter(Position=0)]
        [ValidateSet('Server','Account','Order')]
        [string]$Level
    )

    # The config structure looks like this:
    # %LOCALAPPDATA%\Posh-ACME
    # - current-server.txt
    # %LOCALAPPDATA%\Posh-ACME\(server)
    # - dir.json
    # - current-account.txt
    # %LOCALAPPDATA%\Posh-ACME\(server)\(account)
    # - acct.json
    # - current-order.txt
    # %LOCALAPPDATA%\Posh-ACME\(server)\(account)\(order)
    # - order.json
    # - cert.cer/key/pfx/etc

    # Each level of the config is dependent on its parent. So if the user changes the server,
    # they need to reload the server and all of the child accounts and orders. But if they only
    # change the account, they only need to reload it and orders. And so on.

    # make sure we have the root config folder
    if ([string]::IsNullOrWhiteSpace((Get-ConfigRoot))) {
        if ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop') {
            Set-ConfigRoot (Join-Path $env:LOCALAPPDATA 'Posh-ACME')
        } elseif ($IsLinux) {
            Set-ConfigRoot (Join-Path $env:HOME '.config/Posh-ACME')
        } elseif ($IsMacOs) {
            Set-ConfigRoot (Join-Path $env:HOME 'Library/Preferences/Posh-ACME')
        } else {
            throw "Unrecognized PowerShell platform"
        }

        # allow overriding the default config location with a custom path
        # based on the POSHACME_HOME environment variable
        if (-not [string]::IsNullOrWhiteSpace($env:POSHACME_HOME)) {
            if (Test-Path $env:POSHACME_HOME -PathType Container) {
                Set-ConfigRoot $env:POSHACME_HOME
            } else {
                Write-Warning "The POSHACME_HOME environment variable exists but the path it points to, $($env:POSHACME_HOME), does not. Using default config location."
            }
        }

        # create the config folder if it doesn't already exist.
        if (-not (Test-Path (Get-ConfigRoot) -PathType Container)) {
            New-Item -ItemType Directory -Path (Get-ConfigRoot) -Force -EA Stop | Out-Null
        }
    }

    # start at the server level if nothing was specified or specifically requested
    if (-not $Level -or $Level -eq 'Server') {

        # load the current ACME directory into memory if it exists on disk
        $dirUrl = [string](Get-Content (Join-Path (Get-ConfigRoot) 'current-server.txt') -EA Ignore)
        if (![string]::IsNullOrWhiteSpace($dirUrl)) {

            $script:Dir = Get-PAServer -DirectoryUrl $dirUrl

            # deal with cert validation options between PS editions
            Set-CertValidation $script:Dir.SkipCertificateCheck

            $ImportAccount = $true

        } else {
            # wipe references since we have no current server
            $script:Dir = $null
            $script:Acct = $null
            $script:Order = $null
        }
    }

    if ($ImportAccount -or $Level -eq 'Account') {

        # load the current account into memory if it exists on disk
        $acctID = [string](Get-Content (Join-Path $script:Dir.Folder 'current-account.txt') -EA Ignore)
        if (![string]::IsNullOrWhiteSpace($acctID)) {

            $script:Acct = Get-PAAccount -ID $acctID

            $ImportOrder = $true

            # Check for a v3 plugindata.xml file and convert it to order-specific v4
            # files.
            $pDataV3File = Join-Path $script:Acct.Folder 'plugindata.xml'
            if (Test-Path $pDataV3File -PathType Leaf) {
                Write-Debug "Migrating v3 plugindata.xml"
                $pDataV3 = Import-Clixml $pDataV3File

                # Loop through the available orders
                Get-PAOrder -List -Refresh | ForEach-Object {
                    if ($_.Plugin) {
                        Write-Debug "Migrating for order '$($_.Name)'"
                        Export-PluginArgs -Order $_ -PluginArgs $pDataV3
                    } else {
                        Write-Debug "No Plugins defined for order '$($_.Name)'"
                    }
                }

                Move-Item $pDataV3File (Join-Path $script:Acct.Folder 'plugindata.xml.v3') -Force
            }

        } else {
            # wipe references since we have no current account
            $script:Acct = $null
            $script:Order = $null
        }
    }

    if ($ImportOrder -or $Level -eq 'Order') {

        # load the current order into memory if it exists on disk
        $orderName = [string](Get-Content (Join-Path $script:Acct.Folder 'current-order.txt') -EA Ignore)
        if (-not [string]::IsNullOrWhiteSpace($orderName)) {

            # replace wildcard characters to filesystem friendly ! characters
            # for 4.5 and earlier compatibility
            $orderName = $orderName.Replace('*','!')

            $script:Order = Get-PAOrder -Name $orderName

        } else {
            # wipe references since we have no current order
            $script:Order = $null
        }
    }

}