<?php
/**
 * Bandwidth Calculator
 * Calcula delta de octetos SNMP e converte para bps
 */

/**
 * Calcula bps a partir de dois snapshots de octetos e o tempo decorrido
 *
 * @param string|int|null $prevOctets  Valor anterior de octetos
 * @param string|int|null $currOctets  Valor atual de octetos
 * @param int             $deltaSeconds Segundos entre medições
 * @param bool            $is64bit      Se true, usa contador 64-bit (sem wrap em 32-bit)
 * @return int|null       bps calculado ou null se inválido
 */
function calculate_bps($prevOctets, $currOctets, int $deltaSeconds, bool $is64bit = true): ?int {
    if ($prevOctets === null || $currOctets === null || $deltaSeconds <= 0) {
        return null;
    }

    $prev = (int)$prevOctets;
    $curr = (int)$currOctets;

    // Detectar wrap-around (contador 32-bit vai até 4294967295)
    $delta = $curr - $prev;
    if ($delta < 0) {
        if ($is64bit) {
            return null; // 64-bit não deveria sofrer wrap em polling de 60s
        }
        // 32-bit wrap: MAX_UINT32 - prev + curr
        $delta = (4294967295 - $prev) + $curr;
    }

    $bytesPerSec = $delta / $deltaSeconds;
    return (int)($bytesPerSec * 8); // bytes → bits
}

/**
 * Formata bps em string legível (bps, Kbps, Mbps, Gbps)
 */
function format_bps(int $bps): string {
    if ($bps >= 1_000_000_000) return round($bps / 1_000_000_000, 2) . ' Gbps';
    if ($bps >= 1_000_000)     return round($bps / 1_000_000, 2)     . ' Mbps';
    if ($bps >= 1_000)         return round($bps / 1_000, 2)         . ' Kbps';
    return $bps . ' bps';
}

/**
 * Formata segundos em string de uptime legível
 */
function format_uptime(int $seconds): string {
    if ($seconds <= 0) return '0s';
    $d = intdiv($seconds, 86400);
    $h = intdiv($seconds % 86400, 3600);
    $m = intdiv($seconds % 3600, 60);
    $s = $seconds % 60;
    $parts = [];
    if ($d > 0) $parts[] = "{$d}d";
    if ($h > 0) $parts[] = "{$h}h";
    if ($m > 0) $parts[] = "{$m}m";
    if ($s > 0 || empty($parts)) $parts[] = "{$s}s";
    return implode(' ', $parts);
}
