TfL.psm1


# TfL line colours for terminal display
$script:LineColours = @{
    'Bakerloo'           = 'DarkRed'
    'Central'            = 'Red'
    'Circle'             = 'Yellow'
    'District'           = 'Green'
    'Hammersmith & City' = 'Magenta'
    'Jubilee'            = 'DarkGray'
    'Metropolitan'       = 'DarkMagenta'
    'Northern'           = 'DarkGray'
    'Piccadilly'         = 'DarkBlue'
    'Victoria'           = 'Cyan'
    'Waterloo & City'    = 'DarkCyan'
    'Elizabeth line'     = 'DarkMagenta'
    'London Overground'  = 'DarkYellow'
    'DLR'                = 'DarkCyan'
}

function Get-TflStatus {
    <#
    .SYNOPSIS
        Fetches and displays current London Underground line statuses from TfL.
    #>

    $uri = 'https://api.tfl.gov.uk/Line/Mode/tube,elizabeth-line,overground,dlr/Status'

    try {
        $params = @{
            Uri              = $uri
            UseBasicParsing  = $true
            ErrorAction      = 'Stop'
        }
        # On Windows, pass through the system proxy with default credentials (e.g. corporate proxy)
        if ($IsWindows -or $env:OS -eq 'Windows_NT') {
            $proxy = [System.Net.WebRequest]::GetSystemWebProxy().GetProxy($uri)
            $params['Proxy'] = $proxy
            $params['ProxyUseDefaultCredentials'] = $true
        }
        $lines = Invoke-RestMethod @params
    }
    catch {
        Write-Host " Failed to fetch TfL data: $($_.Exception.Message)" -ForegroundColor Red
        return
    }

    Write-Host ""
    Write-Host " London Transport Status" -ForegroundColor White
    Write-Host " $((Get-Date).ToString('HH:mm, dd MMM yyyy'))" -ForegroundColor DarkGray
    Write-Host " $('─' * 45)" -ForegroundColor DarkGray
    Write-Host ""

    foreach ($line in ($lines | Sort-Object name)) {
        $topStatus   = $line.lineStatuses | Sort-Object statusSeverity | Select-Object -First 1
        $severity    = $topStatus.statusSeverity
        $description = $topStatus.statusSeverityDescription
        $name        = $line.name

        # Severity 10 = Good Service; lower = worse
        $statusColour = switch ($true) {
            ($severity -ge 10) { 'Green' }
            ($severity -ge 6)  { 'Yellow' }
            default            { 'Red' }
        }

        $lineColour = if ($script:LineColours.ContainsKey($name)) { $script:LineColours[$name] } else { 'White' }

        $paddedName = $name.PadRight(22)
        Write-Host " " -NoNewline
        Write-Host $paddedName -ForegroundColor $lineColour -NoNewline
        Write-Host " $description" -ForegroundColor $statusColour

        # Show disruption reason if available and not good service
        if ($severity -lt 10 -and $topStatus.reason) {
            $reason = $topStatus.reason -replace '\s+', ' '
            Write-Host " $(' ' * 22) $reason" -ForegroundColor DarkGray
        }
    }

    Write-Host ""
}

function tfl {
    <#
    .SYNOPSIS
        TfL command-line tool.
    .EXAMPLE
        tfl status # Show current tube/Elizabeth line/Overground/DLR status
    #>

    param(
        [Parameter(Position = 0)]
        [string]$Command = 'help'
    )

    switch ($Command.ToLower()) {
        'status' { Get-TflStatus }
        default  {
            Write-Host ""
            Write-Host " Usage: tfl <command>" -ForegroundColor Yellow
            Write-Host ""
            Write-Host " Commands:" -ForegroundColor DarkGray
            Write-Host " status Show current line statuses" -ForegroundColor White
            Write-Host ""
        }
    }
}

Export-ModuleMember -Function tfl, Get-TflStatus