<?php
// admin/texte_action.php — enregistre le contenu d'une zone de texte éditable (protégé).
require_once dirname(__DIR__) . '/inc/schema.php';
require_once dirname(__DIR__) . '/inc/auth.php';
auth_require();
header('Content-Type: application/json; charset=utf-8');
init_schema();
db()->exec("CREATE TABLE IF NOT EXISTS zones_textes (cle TEXT PRIMARY KEY, contenu TEXT DEFAULT '', maj_le TEXT DEFAULT (datetime('now')))");

$zone = trim($_POST['zone'] ?? '');
if ($zone === '') { echo json_encode(['ok'=>false,'error'=>'Zone manquante']); exit; }

$contenu = $_POST['contenu'] ?? '';

// Convertir les <font color="..."> (générés par execCommand) en <span style="color:...">
$contenu = preg_replace_callback('/<font[^>]*\bcolor\s*=\s*"([^"]*)"[^>]*>/i', function($m){
    $col = preg_replace('/[^#a-z0-9(),.\s%]/i', '', $m[1]);
    return '<span style="color:'.$col.'">';
}, $contenu);
$contenu = preg_replace('#</font>#i', '</span>', $contenu);

// Nettoyage : on n'autorise qu'un jeu de balises de mise en forme sûres
$autorisees = '<p><br><strong><b><em><i><u><h2><h3><h4><ul><ol><li><span><div><a>';
$contenu = strip_tags($contenu, $autorisees);

// Neutraliser tout attribut dangereux (on garde style et href seulement)
$contenu = preg_replace_callback('/<([a-z0-9]+)([^>]*)>/i', function($m){
    $tag = strtolower($m[1]);
    $attrs = $m[2];
    $keep = '';
    // garder style="text-align…/font…" et href pour les liens
    if (preg_match('/\bstyle\s*=\s*"([^"]*)"/i', $attrs, $s)) {
        // ne garder que des propriétés sûres
        $safe = [];
        foreach (explode(';', $s[1]) as $decl) {
            if (preg_match('/^\s*(text-align|font-weight|font-style|font-size|text-decoration|color)\s*:\s*[^;]+$/i', $decl)) {
                $safe[] = trim($decl);
            }
        }
        if ($safe) $keep .= ' style="'.implode(';', $safe).'"';
    }
    if ($tag === 'a' && preg_match('/\bhref\s*=\s*"([^"]*)"/i', $attrs, $h)) {
        $url = $h[1];
        if (preg_match('#^(https?:|/|mailto:|tel:)#i', $url)) {
            $keep .= ' href="'.htmlspecialchars($url, ENT_QUOTES).'" target="_blank" rel="noopener"';
        }
    }
    return '<'.$tag.$keep.'>';
}, $contenu);

db()->prepare("INSERT INTO zones_textes (cle,contenu,maj_le) VALUES (?,?,datetime('now'))
    ON CONFLICT(cle) DO UPDATE SET contenu=excluded.contenu, maj_le=datetime('now')")
   ->execute([$zone, $contenu]);

echo json_encode(['ok'=>true,'zone'=>$zone]);
