<?php
/**
 * Convertit un MAC humain (bc:dd:c2:47:3d:b6) en binaire pour Kea VARBINARY(128).
 */
function macToBinary(string $mac): string {
    $hex = strtolower(preg_replace('/[:\-\.]/', '', trim($mac)));
    return hex2bin($hex);
}

/**
 * Convertit un VARBINARY Kea en adresse MAC lisible (bc:dd:c2:47:3d:b6).
 */
function binaryToMac(string $bin): string {
    return implode(':', str_split(bin2hex($bin), 2));
}

/**
 * Convertit une adresse IP en entier non signé pour Kea (ipv4_address INT UNSIGNED).
 */
function ipToInt(string $ip): string {
    return sprintf('%u', ip2long($ip));
}

/**
 * Convertit un entier Kea en adresse IP lisible.
 */
function intToIp(int|string $int): string {
    // long2ip attend un entier signé ; sur PHP 64-bit on peut caster directement
    return long2ip((int)$int);
}

/**
 * Valide le format d'une adresse MAC.
 */
function isValidMac(string $mac): bool {
    return (bool)preg_match('/^([0-9a-fA-F]{2}[:\-]){5}[0-9a-fA-F]{2}$/', trim($mac));
}

/**
 * Valide le format d'une adresse IPv4.
 */
function isValidIp(string $ip): bool {
    return filter_var(trim($ip), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
}

/**
 * Vérifie qu'une IP appartient à un CIDR donné (ex: 192.168.1.0/24).
 */
function ipInCidr(string $ip, string $cidr): bool {
    [$network, $bits] = explode('/', $cidr);
    $mask    = -1 << (32 - (int)$bits);
    $netLong = ip2long($network) & $mask;
    $ipLong  = ip2long($ip);
    return ($ipLong & $mask) === $netLong;
}

/**
 * Échappe pour affichage HTML.
 */
function h(mixed $v): string {
    return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

/**
 * Formate une adresse MAC depuis son stockage hex brut (sans séparateurs).
 */
function formatMacHex(string $hex): string {
    return implode(':', str_split(strtolower($hex), 2));
}
