PSGadget.psm1

# PsGadget Module Loader
# PowerShell 5.1+ compatible module bootstrapper

#Requires -Version 5.1

# Get the module root directory
$ModuleRoot = $PSScriptRoot

# 1. Load all Class files first (dependency order matters)
$ClassFiles = @(
    'PsGadgetLogger.ps1',
    'PsGadgetI2CDevice.ps1',
    'PsGadgetSsd1306.ps1',
    'PsGadgetFtdi.ps1',
    'PsGadgetMpy.ps1',
    'PsGadgetPca9685.ps1'
)

foreach ($ClassFile in $ClassFiles) {
    $ClassPath = Join-Path -Path $ModuleRoot -ChildPath "Classes/$ClassFile"
    if (Test-Path -Path $ClassPath) {
        . $ClassPath
    } else {
        Write-Warning "Class file not found: $ClassPath"
    }
}

# 2. Load all Private functions
$PrivateFiles = Get-ChildItem -Path "$ModuleRoot/Private" -Filter "*.ps1" -ErrorAction SilentlyContinue

foreach ($PrivateFile in $PrivateFiles) {
    . $PrivateFile.FullName
}

# 3. Load all Public functions
$PublicFiles = Get-ChildItem -Path "$ModuleRoot/Public" -Filter "*.ps1" -ErrorAction SilentlyContinue

foreach ($PublicFile in $PublicFiles) {
    . $PublicFile.FullName
}

# 4. Initialize FTDI assembly loading
$script:FtdiInitialized = $false
try {
    $script:FtdiInitialized = Initialize-FtdiAssembly -ModuleRoot $ModuleRoot -Verbose:($VerbosePreference -ne 'SilentlyContinue')
    if ($script:FtdiInitialized) {
        Write-Verbose "FTDI D2XX assembly loaded successfully"
    } else {
        Write-Verbose "FTDI assembly not available - using stub mode"
    }
} catch {
    Write-Warning "Failed to initialize FTDI assembly: $_"
    $script:FtdiInitialized = $false
}

# 5. Initialize the PsGadget environment
try {
    Initialize-PsGadgetEnvironment
} catch {
    Write-Warning "Failed to initialize PsGadget environment: $_"
}