Private/Init.psm1

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

$global:ForgeProviders = @{
    'github' = @{
        Module       = 'GithubCli'
        Prefix       = 'Github'
        HostPatterns = @('github')
        Resource     = @{
            'Branch'                  = 'Branch'
            'ChangeRequest'           = 'PullRequest'
            'ChangeRequestApproval'   = 'PullRequestReview'
            'ChangeRequestComment'    = 'PullRequestComment'
            'Commit'                  = 'Commit'
            'Group'                   = 'Organization'
            'GroupMember'             = 'OrganizationMember'
            'Issue'                   = 'Issue'
            'IssueComment'            = 'IssueComment'
            'Milestone'               = 'Milestone'
            'Release'                 = 'Release'
            'Repo'                    = 'Repository'
            'User'                    = 'User'
            'UserActivity'            = 'Event'
        }
    }
    'gitlab' = @{
        Module       = 'GitlabCli'
        Prefix       = 'Gitlab'
        HostPatterns = @('gitlab')
        Resource     = @{
            'Branch'                  = 'Branch'
            'ChangeRequest'           = 'MergeRequest'
            'ChangeRequestApproval'   = 'MergeRequestApproval'
            'ChangeRequestComment'    = 'MergeRequestNote'
            'Commit'                  = 'Commit'
            'Group'                   = 'Group'
            'GroupMember'             = 'GroupMember'
            'Issue'                   = 'Issue'
            'IssueComment'            = 'IssueNote'
            'Milestone'               = 'Milestone'
            'Release'                 = 'Release'
            'Repo'                    = 'Project'
            'User'                    = 'User'
            'UserActivity'            = 'UserEvent'
        }
    }
}

foreach ($Key in $global:ForgeProviders.Keys) {
    $Provider = $global:ForgeProviders[$Key]
    $Commands = @{}
    foreach ($ForgeCommand in $global:ForgeCommands) {
        $Verb, $Noun = $ForgeCommand -split '-', 2
        $MappedNoun = $Provider.Resource[$Noun]
        if (-not $MappedNoun) {
            throw "Forge command '$ForgeCommand' uses noun '$Noun' which is not mapped in the '$Key' provider. Add it to the Resource table in Init.psm1."
        }
        $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"