functions/common/ConvertTo-RelativePath.ps1

function ConvertTo-RelativePath {
    param (
        [Parameter(Mandatory = $true)]
        [string]$AbsolutePath,

        [Parameter(Mandatory = $true)]
        [string]$BasePath
    )

    # Convert both paths to full paths and resolve any relative elements
    $absolutePath = [System.IO.Path]::GetFullPath($AbsolutePath)
    $basePath = [System.IO.Path]::GetFullPath($BasePath)

    # Ensure the base path ends with a directory separator
    if (-not $basePath.EndsWith([System.IO.Path]::DirectorySeparatorChar)) {
        $basePath += [System.IO.Path]::DirectorySeparatorChar
    }

    # Create a Uri object for both paths
    $absoluteUri = New-Object System.Uri($absolutePath)
    $baseUri = New-Object System.Uri($basePath)

    # Get the relative Uri from the base Uri
    $relativeUri = $baseUri.MakeRelativeUri($absoluteUri)

    # Convert the relative Uri to a string and return it
    return $relativeUri.OriginalString
}

# Example usage
# $absolutePath = "C:\Users\ExampleUser\Documents\Project\File.txt"
# $basePath = "C:\Users\ExampleUser\Documents"
# $relativePath = ConvertTo-RelativePath -AbsolutePath $absolutePath -BasePath $basePath
# Write-Output $relativePath