WinDirOps.psm1

#Region './Classes/FolderDeletionResult.ps1' -1

class FolderDeletionResult {
    [string]$FolderPath
    [bool]$DeletionSuccess
    [string]$DeletionMessage
    [string]$ComputerName

    # Constructor to initialize the properties
    FolderDeletionResult([string]$folderPath, [bool]$deletionSuccess, [string]$deletionMessage, [string]$computerName) {
        $this.FolderPath = $folderPath
        $this.DeletionSuccess = $deletionSuccess
        $this.DeletionMessage = $deletionMessage
        $this.ComputerName = $computerName
    }
}
#EndRegion './Classes/FolderDeletionResult.ps1' 15
#Region './Public/Clear-Directory.ps1' -1

function Clear-Directory {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
    param (
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        [string]$Directory,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$ComputerName = $env:COMPUTERNAME  # Default to local computer
    )

    process {
        if ($PSCmdlet.ShouldProcess($Directory, "Delete directory on $ComputerName")) {
            $result = Remove-DirectoryByType -Directory $Directory -ComputerName $ComputerName
            Write-Information -MessageData $result.DeletionMessage -Tags "DeleteOperation"
            return $result
        }
    }
}
#EndRegion './Public/Clear-Directory.ps1' 19
#Region './Public/Clear-DirectoryContents.ps1' -1

function Clear-DirectoryContents {
    param (
        [string]$Directory
    )

    try {
        # Create a temporary directory
        $emptyDir = [System.IO.Path]::GetTempPath() + [System.Guid]::NewGuid().ToString()
        mkdir $emptyDir | Out-Null

        # Use robocopy to fast-delete the directory contents by syncing an empty directory
        robocopy $emptyDir $Directory /mir | Out-Null

        # Remove the target directory and the temporary directory
        Remove-Item -Path $Directory -Recurse -Force -ErrorAction SilentlyContinue
        Remove-Item -Path $emptyDir -Recurse -Force -ErrorAction SilentlyContinue

        return $true
    } catch {
        Write-Error "Failed to clear directory contents for $Directory. Error: $_"
        return $false
    }
}
#EndRegion './Public/Clear-DirectoryContents.ps1' 24
#Region './Public/Remove-DirectoryByType.ps1' -1

function Remove-DirectoryByType {
    param (
        [string]$Directory,
        [string]$ComputerName = $env:COMPUTERNAME
    )

    $isLocal = $ComputerName -eq $env:COMPUTERNAME

    if ($isLocal) {
        return Remove-LocalDirectory -Directory $Directory
    } else {
        return Remove-RemoteDirectory -Directory $Directory -ComputerName $ComputerName
    }
}
#EndRegion './Public/Remove-DirectoryByType.ps1' 15
#Region './Public/Remove-LocalDirectory.ps1' -1

function Remove-LocalDirectory {
    param (
        [string]$Directory
    )

    try {
        if (Clear-DirectoryContents -Directory $Directory) {
            return [FolderDeletionResult]::new(
                $Directory,
                $true,
                "Successfully deleted local directory '$Directory'.",
                $env:COMPUTERNAME
            )
        } else {
            return [FolderDeletionResult]::new(
                $Directory,
                $false,
                "Failed to delete local directory '$Directory'.",
                $env:COMPUTERNAME
            )
        }
    } catch {
        return [FolderDeletionResult]::new(
            $Directory,
            $false,
            "Error occurred while deleting local directory '$Directory'. $_",
            $env:COMPUTERNAME
        )
    }
}
#EndRegion './Public/Remove-LocalDirectory.ps1' 31
#Region './Public/Remove-RemoteDirectory.ps1' -1

function Remove-RemoteDirectory {
    param (
        [string]$Directory,
        [string]$ComputerName
    )

    # Get the full script block for Clear-DirectoryContents function
    $clearDirectoryFunction = Get-FunctionScriptBlock -FunctionName 'Clear-DirectoryContents'

    if (-not $clearDirectoryFunction) {
        Write-Error "Unable to retrieve Clear-DirectoryContents function."
        return
    }

    $scriptBlock = {
        param ($remoteDirectory, $clearFunction)

        # Define the function from the passed string
        Invoke-Expression $clearFunction

        # Call the Clear-DirectoryContents function
        if (Clear-DirectoryContents -Directory $remoteDirectory) {
            return @{
                Directory      = $remoteDirectory
                Success        = $true
                Message        = "Successfully deleted remote directory '$remoteDirectory'."
                ComputerName   = $env:COMPUTERNAME
            }
        } else {
            return @{
                Directory      = $remoteDirectory
                Success        = $false
                Message        = "Failed to delete remote directory '$remoteDirectory'."
                ComputerName   = $env:COMPUTERNAME
            }
        }
    }

    try {
        # Execute the script block on the remote machine, passing the function string and directory
        $rawResult = Invoke-Command -ComputerName $ComputerName -ScriptBlock $scriptBlock -ArgumentList $Directory, $clearDirectoryFunction

        # Construct the FolderDeletionResult object locally
        return [FolderDeletionResult]::new(
            $rawResult.Directory,
            $rawResult.Success,
            $rawResult.Message,
            $rawResult.ComputerName
        )
    } catch {
        return [FolderDeletionResult]::new(
            $Directory,
            $false,
            "Error occurred while deleting remote directory '$Directory'. $_",
            $ComputerName
        )
    }
}
#EndRegion './Public/Remove-RemoteDirectory.ps1' 59