ProductivityTools.FindModuleDependencies.psm1

function ProcessPsd1File() {
    param($psd1FilePath)
    
    $file = Import-PowerShellDataFile $psd1FilePath
    $requiredModules = $file["RequiredModules"]
    
    return $requiredModules
}

function ProcessPsd1Files() {
    param($psd1Files)
    
    $psd1Results = @{ }
    
    foreach ($psd1File in $psd1Files) {
        $psd1FilePath = $psd1File.FullName
        $requiredModules = ProcessPsd1File $psd1FilePath
        if ($requiredModules -eq $null) {
            $psd1Results.add($psd1FilePath, $null)    
        }
        else {
            $psd1Results.add($psd1FilePath, @($requiredModules))    
        }
    }
    return $psd1Results
}

function FilterDependencies {

    [cmdletbinding()]
    param([Hashtable]$psd1Results, [string]$filter, [bool]$Like)
    
    Write-Verbose "Filtering results with filter $filter and Like swich set to $Like"

    $psd1ResultsFiltered = @{ }
    
    foreach ($psd1Result in $psd1Results.GetEnumerator()) {
        foreach ($dependency in $psd1Result.Value) {
            if ($Like) {
                if ($dependency -like "*$filter*") {
                    Write-Verbose "file which contains dependency $($psd1Result.Key) [Like]"
                    if (!$psd1ResultsFiltered.ContainsKey($psd1Result.key)) {
                        $psd1ResultsFiltered.add($psd1Result.key, $psd1Result.Value)
                    }
                }    
            }
            else {
                if ($dependency -eq $filter) {
                    Write-Verbose "file which contains dependency $($psd1Result.Key) [Equals]"
                    if (!$psd1ResultsFiltered.ContainsKey($psd1Result.key)) {
                        $psd1ResultsFiltered.add($psd1Result.key, $psd1Result.Value)
                    }
                }
            }
            
        }
    }
    return $psd1ResultsFiltered
}

function Find-ModuleDependencies {
    
    [cmdletbinding()]
    param([string]$DependencyName, [string]$Path = $(Get-Location), [switch]$Like)

    Write-Verbose "Hello from Find-ModuleDependencies."
    Write-Verbose "Path analyzed: $Path."
    
    $psd1Files = @(Get-ChildItem -Path $Path -Recurse -filter "*.psd1")
    Write-Verbose "Found $($psd1Files.Count) psd1 files."

    $psd1Results = ProcessPsd1Files $psd1Files
    
    if ($DependencyName -ne [String]::Empty) {
        $psd1ResultsFiltered = FilterDependencies $psd1Results $DependencyName $Like
        Write-Output $psd1ResultsFiltered
    }
    else {
        Write-Output $psd1Results
    }
}