qbo4.Infrastructure.psm1

Write-Verbose "Setting up AssemblyResolve handler for qbo4.Infrastructure"

if (-not $script:AssemblyHandlerAttached) {
    # Thread-safe cache (optional)
    $script:ResolvedAssemblies = [hashtable]::Synchronized(@{})

    $script:AssemblyResolveHandler = {
        param($sender, [System.ResolveEventArgs] $eventArgs)

        if (-not $eventArgs -or -not $eventArgs.Name) {
            Write-Verbose "AssemblyResolve: eventArgs or Name was null"
            return $null
        }

        $requestedName = $eventArgs.Name.Split(',')[0]

        if ($script:ResolvedAssemblies.ContainsKey($requestedName)) {
            return $script:ResolvedAssemblies[$requestedName]
        }

        try {
            $assemblyPath = Join-Path -Path $PSScriptRoot -ChildPath "$requestedName.dll"

            # Optional: also look in a 'lib' subfolder
            if (-not (Test-Path $assemblyPath)) {
                $assemblyPath = Join-Path -Path (Join-Path $PSScriptRoot 'lib') -ChildPath "$requestedName.dll"
            }

            if (Test-Path $assemblyPath) {
                $assembly = [System.Reflection.Assembly]::LoadFrom($assemblyPath)
                $script:ResolvedAssemblies[$requestedName] = $assembly
                Write-Verbose "Manually loaded assembly: $requestedName from $assemblyPath"
                return $assembly
            } else {
                Write-Verbose "Assembly $requestedName not found under $PSScriptRoot (or /lib)"
            }
        } catch {
            Write-Warning "Failed to resolve assembly '$requestedName': $_"
        }

        return $null
    }

    [AppDomain]::CurrentDomain.add_AssemblyResolve($script:AssemblyResolveHandler)
    $script:AssemblyHandlerAttached = $true
}

Write-Verbose "Loading qbo4.Infrastructure cmdlets and functions from $PSScriptRoot"
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath qbo4.Infrastructure.Powershell.dll)
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath qbo4.WebServer.ps1)
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath qbo4.PublishModule.ps1)
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath qbo4.Nuget.ps1)

Write-Verbose "Initializing qboConfig"
Initialize-qboConfig

Export-ModuleMember -Cmdlet '*'