Private/Get-PatConfigurationPath.ps1

function Get-PatConfigurationPath {
    <#
    .SYNOPSIS
        Gets the configuration file path for PlexAutomationToolkit.
 
    .DESCRIPTION
        Determines the best location for the configuration file with fallback options.
        Prefers OneDrive-synced location for cross-machine sync.
 
    .OUTPUTS
        String
        Returns the full path to the configuration file
    #>

    [CmdletBinding()]
    param ()

    # Try OneDrive location first (syncs across machines)
    if ($env:OneDrive) {
        $configurationDirectory = Join-Path $env:OneDrive 'Documents\PlexAutomationToolkit'
        $configurationPath = Join-Path $configurationDirectory 'servers.json'

        # Test if OneDrive location is writable
        try {
            # Create directory if needed (Force handles race condition)
            $null = New-Item -Path $configurationDirectory -ItemType Directory -Force -ErrorAction Stop

            # Test write access
            $testFile = Join-Path $configurationDirectory '.test'
            [IO.File]::WriteAllText($testFile, 'test')
            Remove-Item $testFile -Force
            return $configurationPath
        }
        catch [System.IO.IOException] {
            Write-Debug "OneDrive path not accessible (IOException), using fallback"
        }
        catch {
            Write-Debug "OneDrive path not accessible ($($_.Exception.GetType().Name)), using fallback"
        }
    }

    # Fallback to user Documents
    $configurationDirectory = Join-Path $env:USERPROFILE 'Documents\PlexAutomationToolkit'
    $configurationPath = Join-Path $configurationDirectory 'servers.json'

    try {
        # Create directory if needed (Force handles race condition)
        $null = New-Item -Path $configurationDirectory -ItemType Directory -Force -ErrorAction Stop
        return $configurationPath
    }
    catch {
        # Documents not accessible, use LocalAppData as last resort
        $configurationDirectory = Join-Path $env:LOCALAPPDATA 'PlexAutomationToolkit'
        # Create directory if needed (Force handles race condition)
        $null = New-Item -Path $configurationDirectory -ItemType Directory -Force -ErrorAction Stop
        return Join-Path $configurationDirectory 'servers.json'
    }
}