Functions/GenXdev.AI.Queries/Remove-ImageDirectory.ps1

################################################################################
<#
.SYNOPSIS
Removes directories from the configured image directories for GenXdev.AI operations.
 
.DESCRIPTION
This function removes one or more directory paths from the existing image directories
configuration used by the GenXdev.AI module. It updates both the global variable
and the module's preference storage to persist the configuration across sessions.
Supports wildcard patterns for flexible directory matching.
 
.PARAMETER ImageDirectories
An array of directory paths or wildcard patterns to remove from the existing
image directories configuration.
 
.PARAMETER Force
Forces removal without confirmation prompts.
 
.EXAMPLE
Remove-ImageDirectory -ImageDirectories @("C:\OldPhotos", "D:\TempImages")
 
Removes the specified directories from the image directories configuration.
 
.EXAMPLE
Remove-ImageDirectory "C:\Temp\*"
 
Removes all directories that match the wildcard pattern.
 
.EXAMPLE
removeimgdir @("C:\OldPhotos") -Force
 
Uses alias to forcibly remove a directory from the configuration without confirmation.
#>

function Remove-ImageDirectory {

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')]
    [Alias("removeimgdir")]

    param(
        ###############################################################################
        [Parameter(
            Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true,
            HelpMessage = "Array of directory paths or patterns to remove from image directories"
        )]
        [SupportsWildcards()]
        [string[]] $ImageDirectories,
        ###############################################################################
        [Parameter(
            Mandatory = $false,
            HelpMessage = "Forces removal without confirmation prompts"
        )]
        [switch] $Force
        ###############################################################################
    )

    begin {

        # get current configuration
        $currentConfig = GenXdev.AI\Get-ImageDirectories

        # initialize collection for remaining directories
        $remainingDirectories = [System.Collections.Generic.List[string]]::new()

        # add all existing directories to start
        foreach ($dir in $currentConfig.ImageDirectories) {

            $remainingDirectories.Add($dir)
        }

        # track directories that will be removed for reporting
        $removedDirectories = [System.Collections.Generic.List[string]]::new()

        Microsoft.PowerShell.Utility\Write-Verbose (
            "Current image directories: [$($currentConfig.ImageDirectories -join ', ')]"
        )
    }

    process {

        # process each directory pattern to remove
        foreach ($directoryPattern in $ImageDirectories) {

            # expand the path to handle relative paths and environment variables
            $expandedPattern = GenXdev.FileSystem\Expand-Path $directoryPattern

            # find matching directories (support wildcards)
            $matchingDirectories = $remainingDirectories |
                Microsoft.PowerShell.Core\Where-Object {
                    $_ -like $expandedPattern
                }

            # remove matching directories
            foreach ($matchingDir in $matchingDirectories) {

                if ($remainingDirectories.Remove($matchingDir)) {

                    $removedDirectories.Add($matchingDir)
                    Microsoft.PowerShell.Utility\Write-Verbose "Marked for removal: $matchingDir"
                }
            }

            # if no matches found and no wildcards, try exact match (case-insensitive)
            if ($matchingDirectories.Count -eq 0 -and -not $expandedPattern.Contains('*') -and -not $expandedPattern.Contains('?')) {

                $exactMatch = $remainingDirectories |
                    Microsoft.PowerShell.Core\Where-Object {
                        $_.ToLower() -eq $expandedPattern.ToLower()
                    }

                if ($exactMatch) {

                    foreach ($match in $exactMatch) {

                        if ($remainingDirectories.Remove($match)) {

                            $removedDirectories.Add($match)
                            Microsoft.PowerShell.Utility\Write-Verbose "Marked for removal (exact match): $match"
                        }
                    }
                }
                else {

                    Microsoft.PowerShell.Utility\Write-Warning "Directory not found in configuration: $expandedPattern"
                }
            }
        }
    }

    end {

        if ($removedDirectories.Count -eq 0) {

            Microsoft.PowerShell.Utility\Write-Host "No directories were found to remove." -ForegroundColor Yellow
            return
        }

        # convert to array for the Set-ImageDirectories call
        $finalDirectories = $remainingDirectories.ToArray()

        # determine if we should proceed based on Force parameter or ShouldProcess
        $shouldProceed = $Force -or $PSCmdlet.ShouldProcess(
            "GenXdev.AI Module Configuration",
            "Remove directories from image directories: [$($removedDirectories -join ', ')]"
        )

        if ($shouldProceed) {

            # use Set-ImageDirectories to update the configuration
            GenXdev.AI\Set-ImageDirectories -ImageDirectories $finalDirectories -Language $currentConfig.Language

            # output confirmation
            Microsoft.PowerShell.Utility\Write-Host (
                "Removed $($removedDirectories.Count) directories from image directories configuration. " +
                "Remaining directories: $($finalDirectories.Count)"
            ) -ForegroundColor Green

            # list removed directories
            if ($removedDirectories.Count -gt 0) {

                Microsoft.PowerShell.Utility\Write-Host "Removed directories:" -ForegroundColor Cyan
                foreach ($removedDir in $removedDirectories) {

                    Microsoft.PowerShell.Utility\Write-Host " - $removedDir" -ForegroundColor Gray
                }
            }
        }
    }
}
################################################################################