functions/Import-RequiredModules.ps1

<#
.SYNOPSIS
    Imports all required modules
.DESCRIPTION
    Imports all required modules in the correct order, handling dependencies
.NOTES
    Author: Jurie Smit
    Version: 1.0.0
    Date: March 10, 2025
#>


function Import-RequiredModules {
    [CmdletBinding()]
    param()
    
    # First import HomeLab.Logging as it's needed by other modules
    $loggingModule = $script:RequiredModules | Where-Object { $_.Name -eq "HomeLab.Logging" }
    if ($loggingModule) {
        try {
            Write-Host "Loading module: HomeLab.Logging" -ForegroundColor Yellow
            Import-Module -Name $loggingModule.Path -Force:$ForceReload -ErrorAction Stop -Global -DisableNameChecking
            Write-Log -Message "Successfully loaded module: HomeLab.Logging" -Level "Success"
        }
        catch {
            Write-Host "Failed to load HomeLab.Logging module: $_" -ForegroundColor Red
            return $false
        }
    }
    
    # Then import HomeLab.Core as it may be needed by other modules
    $coreModule = $script:RequiredModules | Where-Object { $_.Name -eq "HomeLab.Core" }
    if ($coreModule) {
        try {
            Write-Log -Message "Loading module: HomeLab.Core" -Level "Info"
            Import-Module -Name $coreModule.Path -Force:$ForceReload -ErrorAction Stop -Global -DisableNameChecking
            Write-Log -Message "Successfully loaded module: HomeLab.Core" -Level "Success"
        }
        catch {
            Write-Log -Message "Failed to load HomeLab.Core module: $_" -Level "Error"
            return $false
        }
    }
    
    # Import the rest of the modules
    foreach ($module in $script:RequiredModules) {
        $moduleName = $module.Name
        
        # Skip already imported modules
        if ($moduleName -eq "HomeLab.Logging" -or $moduleName -eq "HomeLab.Core") {
            continue
        }
        
        try {
            Write-Log -Message "Loading module: $moduleName" -Level "Info"
            
            # For local modules, use the Path
            if ($module.Path) {
                Import-Module -Name $module.Path -Force:$ForceReload -ErrorAction Stop -Global -DisableNameChecking
            }
            # For external modules like Az, use the Name
            else {
                Import-Module -Name $moduleName -Force:$ForceReload -ErrorAction Stop
            }
            
            Write-Log -Message "Successfully loaded module: $moduleName" -Level "Success"
        }
        catch {
            Write-Log -Message "Failed to load module $moduleName`: $_" -Level "Error"
            # Continue loading other modules even if one fails
        }
    }
    
    $script:ModulesLoaded = $true
    return $true
}

# Export the function
Export-ModuleMember -Function Import-RequiredModules