<?php

namespace App\Services\Wireguard;

use Carbon\CarbonImmutable;

/**
 * One line of `wg show <if> dump` — what the hub currently reports about a peer.
 * A value object rather than an array so callers cannot silently mistype a key.
 */
final readonly class PeerSnapshot
{
    public function __construct(
        public string $publicKey,
        public ?string $endpoint,
        public string $allowedIps,
        public ?CarbonImmutable $latestHandshake,
        public int $rxBytes,
        public int $txBytes,
    ) {}

    /** @param list<string> $columns one dump line, already split on tabs */
    public static function fromDumpLine(array $columns): ?self
    {
        // publickey, presharedkey, endpoint, allowed-ips, latest-handshake, rx, tx, keepalive
        if (count($columns) < 8) {
            return null;
        }
        $handshake = (int) $columns[4];

        return new self(
            publicKey: $columns[0],
            endpoint: $columns[2] === '(none)' ? null : $columns[2],
            allowedIps: $columns[3],
            // 0 means "never handshaked" — not the unix epoch.
            latestHandshake: $handshake > 0 ? CarbonImmutable::createFromTimestamp($handshake) : null,
            rxBytes: (int) $columns[5],
            txBytes: (int) $columns[6],
        );
    }
}
