<?php
require_once __DIR__ . '/filieres.php';
require_once __DIR__ . '/candidatures.php';

if (!function_exists('lignes_export')) {
    /**
     * Export Admin (Tâche 11) : lignes prêtes pour un tableur (SimpleXLSXGen), première
     * ligne = en-têtes. Mêmes filtres et même sémantique que filtrer_candidatures() —
     * filiere, statut, q (recherche LIKE échappée) — puisque le bouton « Exporter Excel »
     * de la liste admin transporte exactement les mêmes paramètres GET.
     *
     * Contrat filtres identique à filtrer_candidatures() : $filtres = ['filiere' =>
     * string, 'statut' => string, 'q' => string], valeurs déjà validées par l'appelant
     * ('' = pas de filtre ; filiere et statut hors référentiel écartés en amont, cf.
     * public/admin/export.php). Aucune revalidation ici : mêmes garanties, même confiance
     * qu'accordée à filtrer_candidatures() par public/admin/index.php.
     *
     * Contrairement à filtrer_candidatures() (liste écran, triée du plus récent, plafonnée
     * à 500 lignes), l'export est complet et monté en RAM d'un bloc (pas de LIMIT —
     * fetchAll puis xlsx généré en mémoire) : compromis délibéré, une campagne se compte
     * en centaines de dossiers, très loin des limites PHP. Tri chronologique croissant
     * (created_at, id) : ordre naturel d'un registre à archiver.
     *
     * Le statut est exporté sous son libellé français (STATUTS_LABELS) plutôt que le code
     * brut de l'ENUM — le personnel du secrétariat lit l'Excel, pas la base de données.
     *
     * @param array{filiere?:string,statut?:string,q?:string} $filtres
     * @return list<list<string>>
     */
    function lignes_export(PDO $pdo, array $filtres): array {
        $conditions = [];
        $params = [];
        if (($filtres['filiere'] ?? '') !== '') { $conditions[] = 'filiere1 = ?'; $params[] = $filtres['filiere']; }
        if (($filtres['statut'] ?? '') !== '') { $conditions[] = 'statut = ?'; $params[] = $filtres['statut']; }
        $q = $filtres['q'] ?? '';
        if ($q !== '') {
            // Même branchement ESCAPE par pilote que filtrer_candidatures() : ESCAPE '\'
            // pour SQLite, ESCAPE '\\' pour MySQL (littéraux de chaîne interprètent l'antislash).
            $esc = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite' ? "ESCAPE '\\'" : "ESCAPE '\\\\'";
            $motif = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $q) . '%';
            $like = [];
            foreach (['nom', 'prenoms', 'numero', 'telephone'] as $col) {
                $like[] = "$col LIKE ? $esc";
                $params[] = $motif;
            }
            $conditions[] = '(' . implode(' OR ', $like) . ')';
        }
        $where = $conditions ? ('WHERE ' . implode(' AND ', $conditions)) : '';
        $stmt = $pdo->prepare("SELECT numero, nom, prenoms, sexe, date_naissance, telephone, email, ville,
                   bac_serie, bac_annee, etablissement_origine, filiere1, filiere2,
                   tuteur_nom, tuteur_telephone, statut, dossier_complet, created_at
            FROM candidatures $where ORDER BY created_at, id");
        $stmt->execute($params);
        $rows = $stmt->fetchAll();

        $lignes = [['Numéro','Nom','Prénoms','Sexe','Naissance','Téléphone','E-mail','Ville','Série BAC','Année BAC',
                    'Établissement','Filière 1','Filière 2','Tuteur','Tél. tuteur','Statut','Dossier complet','Date']];
        // Préfixe NUL "\0" = « RAW value » documenté par SimpleXLSXGen : la chaîne est
        // écrite telle quelle, sans interprétation de balisage ni auto-détection de type.
        // Idempotent (jamais de double préfixe, qui laisserait un NUL littéral en cellule).
        $brut = static fn(string $v): string => strncmp($v, "\0", 1) === 0 ? $v : "\0" . $v;
        foreach ($rows as $r) {
            $r['dossier_complet'] = $r['dossier_complet'] ? 'Oui' : 'Non';
            $r['statut'] = STATUTS_LABELS[$r['statut']] ?? $r['statut'];
            // Téléphones : toujours en chaîne brute — ce sont des identifiants, jamais des
            // nombres à calculer. Sans cela, « +2250102030405 » (sans espaces) passe
            // l'auto-détection numérique de la lib et perd son « + » de tête.
            $r['telephone'] = $brut($r['telephone']);
            $r['tuteur_telephone'] = $brut($r['tuteur_telephone']);
            // Neutralise le mini-langage de balisage de SimpleXLSXGen (<f>…</f> = formule,
            // <a href> = lien, <!-- --> = commentaire, <b>/<style>…). Toute valeur contenant
            // '<' est forcée en chaîne brute via le préfixe NUL "\0" documenté par la lib ;
            // les colonnes numériques/dates (sans '<') gardent leur formatage Excel.
            $lignes[] = array_map(
                static fn($v) => (is_string($v) && strpos($v, '<') !== false) ? $brut($v) : $v,
                array_values($r)
            );
        }
        return $lignes;
    }
}
