<?php
// ============================================================
//  api/published.php  —  Mèmes publiés (soumissions validées)
//  injectés dans le nuage : renvoie un script JS qui ajoute les
//  nœuds à MEME_NODES. Chargé via <script src> après graph_data.js.
//  Sur un hôte statique (sans PHP) : 404, ignoré silencieusement.
// ============================================================
header('Content-Type: application/javascript; charset=utf-8');
header('Cache-Control: no-store');

require_once __DIR__ . '/../config.php';

$nodes = [];
try {
    // Toutes les soumissions publiées sont des fiches. Une variante est une
    // fiche aussi, juste marquée enfant (c:1) → hors du nuage principal, mais
    // avec sa propre page et reliée à son parent dans le schéma de variantes.
    $rows = $pdo->query(
        "SELECT slug, nom, type, attach, tags, origine, date_creation
         FROM submissions WHERE slug IS NOT NULL
         ORDER BY created_at DESC LIMIT 2000"
    )->fetchAll();
    foreach ($rows as $r) {
        $tags = array_values(array_filter(array_map('trim', explode(',', (string)$r['tags']))));
        $year = 0;
        if (preg_match('/(\d{4})/', (string)$r['date_creation'], $m)) $year = (int)$m[1];
        $nodes[] = [
            'h'  => $r['slug'],
            'n'  => $r['nom'] ?: $r['slug'],
            'y'  => $year ?: (int)date('Y'),
            'o'  => $r['origine'] ?: 'Contribution',
            's'  => '',
            'c'  => ($r['type'] === 'variante') ? 1 : 0,   // variante = fiche enfant
            'p'  => '',
            't'  => '',
            'ko' => [],
            'kc' => $tags,
            'kf' => [],
            'k'  => $tags,
        ];
    }
} catch (Throwable $e) {
    // En cas d'erreur DB : renvoyer un overlay vide (ne casse rien).
    $nodes = [];
}

// Mèmes supprimés par un administrateur : à retirer du nuage/recherche/fiches.
$hidden = [];
try {
    $hidden = $pdo->query("SELECT hash FROM hidden_memes")->fetchAll(PDO::FETCH_COLUMN);
} catch (Throwable $e) {
    $hidden = [];
}

// Variantes publiées : à injecter dans le schéma de variantes du parent.
$V = [];
try {
    foreach ($pdo->query("SELECT parent_hash, vslug, title FROM published_variants ORDER BY created_at")->fetchAll() as $v) {
        $V[] = ['p' => $v['parent_hash'], 's' => $v['vslug'], 't' => $v['title'] ?: $v['vslug']];
    }
} catch (Throwable $e) {
    $V = [];
}

echo "(function(){if(typeof MEME_NODES==='undefined')return;"
   . "var P=" . json_encode($nodes, JSON_UNESCAPED_UNICODE) . ";"
   . "var H=" . json_encode(array_values($hidden), JSON_UNESCAPED_UNICODE) . ";"
   . "var V=" . json_encode($V, JSON_UNESCAPED_UNICODE) . ";"
   . "var h={};MEME_NODES.forEach(function(n){h[n.h]=1;});"
   . "P.forEach(function(n){if(!h[n.h])MEME_NODES.push(n);});"
   . "window.AM_HIDDEN=H;"
   . "if(H.length){var hs={};H.forEach(function(x){hs[x]=1;});"
   . "for(var i=MEME_NODES.length-1;i>=0;i--){if(hs[MEME_NODES[i].h])MEME_NODES.splice(i,1);}}"
   . "if(typeof VARIANT_MAP!=='undefined'&&typeof VARIANT_DETAILS!=='undefined'){V.forEach(function(v){"
   . "if(!VARIANT_MAP[v.p])VARIANT_MAP[v.p]=[];"
   . "if(VARIANT_MAP[v.p].indexOf(v.s)<0)VARIANT_MAP[v.p].push(v.s);"
   . "if(!VARIANT_DETAILS[v.p])VARIANT_DETAILS[v.p]=[];"
   . "if(!VARIANT_DETAILS[v.p].some(function(d){return d.s===v.s;}))"
   . "VARIANT_DETAILS[v.p].push({s:v.s,t:v.t,x:1});});}"
   . "})();";
