source/Private/Common.ps1

function Get-ConflictingModuleList {

    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    param (
        [Parameter(Mandatory = $true)]
        [hashtable]$RequiredModules
    )

    $conflicts = @()

    foreach ($moduleName in $RequiredModules.Keys) {
        $requiredVersion = $RequiredModules[$moduleName]
        $loadedModules = Get-Module -Name $moduleName -ErrorAction SilentlyContinue

        if ($loadedModules) {
            $conflictingVersions = $loadedModules | Where-Object { $_.Version -ne $requiredVersion }

            if ($conflictingVersions) {
                $conflicts += [PSCustomObject]@{
                    ModuleName = $moduleName
                    LoadedVersions = $conflictingVersions.Version
                    RequiredVersion = $requiredVersion
                }
            }
        }
    }

    return $conflicts
}

function Show-ModuleConflictInstructions {
    <#
    .SYNOPSIS
    Shows user-friendly instructions to resolve module version conflicts.
 
    .PARAMETER ConflictingModules
    Array of conflicting module information from Get-ConflictingModuleList.
    #>

    [CmdletBinding()]
    [OutputType([void])]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', 'Show-ModuleConflictInstructions')]
    param (
        [Parameter(Mandatory = $true)]
        [PSCustomObject[]]$ConflictingModules
    )

    Write-Host "Module version conflicts detected - initialization cannot proceed in current session" -ForegroundColor Red
    Write-Host ""
    Write-Host "PowerShell cannot unload assemblies from the current session." -ForegroundColor Yellow
    Write-Host "To resolve this issue, please follow these steps:" -ForegroundColor Yellow
    Write-Host ""
    Write-Host "1. Close this PowerShell session" -ForegroundColor Cyan
    Write-Host "2. Open a new PowerShell session" -ForegroundColor Cyan
    Write-Host "3. Re-run your command" -ForegroundColor Cyan
    Write-Host ""
    Write-Host "Module version conflicts:" -ForegroundColor Yellow

    foreach ($conflict in $ConflictingModules) {
        $loadedVersions = $conflict.LoadedVersions -join ', '
        Write-Host " - $($conflict.ModuleName): Loaded=$loadedVersions, Required=$($conflict.RequiredVersion)" -ForegroundColor Yellow
    }

    Write-Host ""
}

function Initialize-RequiredModule {
    <#
    .SYNOPSIS
    Initializes required Microsoft Graph PowerShell modules.
 
    .DESCRIPTION
    Checks for module version conflicts, installs missing modules, and imports required modules.
    If version conflicts are detected, provides user instructions and returns false.
 
    .OUTPUTS
    [bool] True if initialization succeeded, False if conflicts prevent initialization.
    #>

    [CmdletBinding()]
    [OutputType([bool])]
    param()

    Write-Verbose "Initializing required Microsoft Graph PowerShell modules..."

    # Check for module version conflicts
    $conflictingModules = Get-ConflictingModuleList -RequiredModules $RequiredGraphModules
    if ($conflictingModules.Count -gt 0) {
        Show-ModuleConflictInstructions -ConflictingModules $conflictingModules
        return $false
    }

    # Install missing modules and import all required modules
    foreach ($moduleName in $RequiredGraphModules.Keys) {
        $requiredVersion = $RequiredGraphModules[$moduleName]

        Write-Verbose "Processing module: $moduleName (version $requiredVersion)"

        # Check if the correct version is already loaded
        $loadedModule = Get-Module -Name $moduleName | Where-Object { $_.Version -eq $requiredVersion }
        if ($loadedModule) {
            Write-Verbose "Module $moduleName version $requiredVersion is already loaded"
            continue
        }

        # Check if the required version is installed
        $installedModule = Get-Module -FullyQualifiedName @{
            ModuleName    = $moduleName
            RequiredVersion = $requiredVersion
        } -ListAvailable -ErrorAction SilentlyContinue

        if (-not $installedModule) {
            Write-Verbose "Installing module $moduleName version $requiredVersion..."
            try {
                Install-Module -Name $moduleName -RequiredVersion $requiredVersion -Force -AllowClobber -Scope CurrentUser -ErrorAction Stop
                Write-Information "Successfully installed $moduleName version $requiredVersion"
            }
            catch {
                $errorMessage = "Failed to install required module $moduleName version $requiredVersion. Error: $($_.Exception.Message)"
                Write-Error $errorMessage
                return $false
            }
        }

        # Import the required version
        Write-Verbose "Importing module $moduleName version $requiredVersion..."
        try {
            Import-Module -Name $moduleName -RequiredVersion $requiredVersion -Force -ErrorAction Stop
            Write-Verbose "Successfully imported $moduleName version $requiredVersion"
        }
        catch {
            $errorMessage = "Failed to import required module $moduleName version $requiredVersion. Error: $($_.Exception.Message)"
            Write-Error $errorMessage
            return $false
        }
    }

    Write-Verbose "All required Microsoft Graph PowerShell modules are initialized and ready to use"
    return $true
}