<?php
if (!function_exists('est_spam')) {
    /**
     * Détecte un envoi de robot via le champ honeypot « site_web » (caché en CSS,
     * jamais rempli par un humain).
     *
     * Fail-closed : toute valeur non-chaîne (ex. site_web[]=x forgé) est aussi
     * un signal de bot => true, sans erreur fatale.
     */
    function est_spam(array $post): bool {
        $v = $post['site_web'] ?? '';
        return !is_string($v) || trim($v) !== '';
    }
}
if (!function_exists('journaliser_envoi')) {
    /**
     * Journalise une tentative d'envoi du formulaire pour l'IP donnée.
     *
     * $ok est de la télémétrie réservée à un futur reporting admin — il n'est
     * pas lu par ip_bloquee(), par choix : les tentatives bloquées comptent aussi.
     */
    function journaliser_envoi(PDO $pdo, string $ip, bool $ok): void {
        $pdo->prepare('INSERT INTO envois_log (ip, ok) VALUES (?,?)')->execute([$ip, (int)$ok]);
    }
}
if (!function_exists('ip_bloquee')) {
    /**
     * Vrai si l'IP a atteint $max envois dans la fenêtre glissante d'une heure.
     *
     * Contrat : $max >= 1 — avec 0, COUNT(*) >= 0 est toujours vrai, donc tout
     * est bloqué par construction.
     */
    function ip_bloquee(PDO $pdo, string $ip, int $max = 3): bool {
        $sqlite = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite';
        $sql = $sqlite
            ? "SELECT COUNT(*) FROM envois_log WHERE ip = ? AND created_at > datetime('now','-1 hour')"
            : 'SELECT COUNT(*) FROM envois_log WHERE ip = ? AND created_at > NOW() - INTERVAL 1 HOUR';
        $q = $pdo->prepare($sql); $q->execute([$ip]);
        return (int)$q->fetchColumn() >= $max;
    }
}
if (!function_exists('est_doublon')) {
    /**
     * Vrai si une candidature existe déjà pour ce téléphone et ce premier choix
     * de filière. Comparaison insensible aux espaces ('01 02 03 04 05' ≡
     * '0102030405') ; REPLACE(str, from, to) est portable SQLite/MySQL.
     *
     * Côté formulaire, un doublon déclenche une demande de confirmation,
     * pas un blocage.
     */
    function est_doublon(PDO $pdo, string $telephone, string $filiere1): bool {
        $q = $pdo->prepare("SELECT COUNT(*) FROM candidatures WHERE REPLACE(telephone, ' ', '') = ? AND filiere1 = ?");
        $q->execute([str_replace(' ', '', $telephone), $filiere1]);
        return (int)$q->fetchColumn() > 0;
    }
}
