M365Connect.psm1

#Requires -Version 5.1
<#
.SYNOPSIS
    M365Connect - Connect to Microsoft 365 services with a single command.
 
.DESCRIPTION
    This module provides unified authentication and connection management for multiple
    Microsoft 365 services including Teams, Exchange Online, Azure AD, SharePoint,
    Security & Compliance, and Intune.
 
    Supports:
    - PowerShell 5.1 (Desktop) and PowerShell 7+ (Core)
    - Interactive authentication with optional MFA
    - Stored credential authentication
    - Service principal/app registration authentication (certificate or secret)
 
.NOTES
    Version: 1.0.0
    Author: nikkelly
    GitHub: https://github.com/nikkelly/M365Connect
#>


# Initialize module state
$script:MSProfileState = @{
    ConnectedServices     = [System.Collections.ArrayList]@()
    Credential            = $null
    MicrosoftUser         = $null
    Domain                = $null
    MFAEnabled            = $false
    AuthMethod            = 'Interactive'  # Interactive, Credential, ServicePrincipal
    AppRegistration       = @{
        AppId                 = $null
        TenantId              = $null
        CertificateThumbprint = $null
        ClientSecret          = $null
    }
    PSVersionInfo         = @{
        Major        = $PSVersionTable.PSVersion.Major
        Minor        = $PSVersionTable.PSVersion.Minor
        IsCore       = $PSVersionTable.PSEdition -eq 'Core'
        IsWindows    = ($PSVersionTable.PSVersion.Major -lt 6) -or (Get-Variable -Name IsWindows -ValueOnly -ErrorAction SilentlyContinue)
        SupportsAzureAD = $PSVersionTable.PSVersion.Major -lt 7
        RequiresGraph   = $PSVersionTable.PSVersion.Major -ge 7
    }
    ExchangeServerSession = $null
    OriginalPrompt        = $null
    ForegroundColor       = try {
        $fc = $host.UI.RawUI.ForegroundColor
        if ($fc -is [ConsoleColor] -and [int]$fc -ge 0) { $fc } else { [ConsoleColor]::Gray }
    } catch { [ConsoleColor]::Gray }
}

# Dot-source all Private function files first
$Private = @(Get-ChildItem -Path "$PSScriptRoot\Private\*.ps1" -ErrorAction SilentlyContinue)
foreach ($file in $Private) {
    try {
        . $file.FullName
    } catch {
        Write-Error "Failed to import private function $($file.FullName): $_"
    }
}

# Dot-source all Public function files
$Public = @(Get-ChildItem -Path "$PSScriptRoot\Public\*.ps1" -ErrorAction SilentlyContinue)
foreach ($file in $Public) {
    try {
        . $file.FullName
    } catch {
        Write-Error "Failed to import public function $($file.FullName): $_"
    }
}

# Create backward-compatible aliases (Script scope for proper module export)
Set-Alias -Name Teams -Value Connect-MSTeams -Scope Script
Set-Alias -Name Exchange -Value Connect-MSExchange -Scope Script
Set-Alias -Name ExchangeServer -Value Connect-MSExchangeServer -Scope Script
Set-Alias -Name AzureAD -Value Connect-MSAzureAD -Scope Script
Set-Alias -Name AzureADPreview -Value Connect-MSAzureAD -Scope Script
Set-Alias -Name MSOnline -Value Connect-MSGraph -Scope Script
Set-Alias -Name SharePoint -Value Connect-MSSharePoint -Scope Script
Set-Alias -Name Security_Compliance -Value Connect-MSSecurityCompliance -Scope Script
Set-Alias -Name Intune -Value Connect-MSIntune -Scope Script
Set-Alias -Name connectAll -Value Connect-AllMSServices -Scope Script
Set-Alias -Name Disconnect -Value Disconnect-AllMSServices -Scope Script
Set-Alias -Name Add-Account -Value Add-MSAccount -Scope Script
Set-Alias -Name Remove-Account -Value Remove-MSAccount -Scope Script
Set-Alias -Name Add-MFA -Value Add-MSMFA -Scope Script
Set-Alias -Name Remove-MFA -Value Remove-MSMFA -Scope Script

# Auto-import credentials and settings on module load
Initialize-ModuleState

# Display startup message
Show-MSCommands -Quiet