Private/Init.psm1

$global:ForgeCommands = (Import-PowerShellDataFile "$PSScriptRoot/../ForgeCli.psd1").FunctionsToExport

$global:ForgeProviders = @{
    'github' = @{
        Module       = 'GithubCli'
        Prefix       = 'Github'
        HostPatterns = @('github')
        Resource     = @{
            'ChangeRequest' = 'PullRequest'
            'Group'         = 'Organization'
            'Repo'          = 'Repository'
        }
    }
    'gitlab' = @{
        Module       = 'GitlabCli'
        Prefix       = 'Gitlab'
        HostPatterns = @('gitlab')
        Resource     = @{
            'ChangeRequest' = 'MergeRequest'
            'Repo'          = 'Project'
        }
    }
}

foreach ($Key in $global:ForgeProviders.Keys) {
    $Provider = $global:ForgeProviders[$Key]
    $Commands = @{}
    foreach ($ForgeCommand in $global:ForgeCommands) {
        $Verb, $Noun = $ForgeCommand -split '-', 2
        $MappedNoun = if ($Provider.Resource.ContainsKey($Noun)) { $Provider.Resource[$Noun] } else { $Noun }
        $Commands[$ForgeCommand] = "$Verb-$($Provider.Prefix)$MappedNoun"
    }
    $Provider.Commands = $Commands
}

# Probe for installed provider modules and import them.
# Providers whose modules are not installed are removed from the registry.
foreach ($Key in @($global:ForgeProviders.Keys)) {
    $Provider = $global:ForgeProviders[$Key]
    $Module = $Provider.Module
    if (Get-Module -Name $Module) {
        Write-Verbose "Forge: provider '$Key' already loaded ($Module)"
    } elseif (Get-Module -ListAvailable -Name $Module) {
        Write-Verbose "Forge: loading provider '$Key' ($Module)"
        Import-Module $Module
    } else {
        Write-Verbose "Forge: provider '$Key' not available ($Module not installed)"
        $global:ForgeProviders.Remove($Key)
    }
}

Write-Verbose "Forge: $(($global:ForgeProviders.Keys) -join ', ') provider(s) registered"