<?php
// admin/galerie_action.php — actions galeries & sliders (JSON). Protégé par login.
require_once dirname(__DIR__) . '/inc/schema.php';
require_once dirname(__DIR__) . '/inc/auth.php';
auth_require();
header('Content-Type: application/json; charset=utf-8');
header('X-LiteSpeed-Cache-Control: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate');
init_schema();

$action = $_GET['action'] ?? $_POST['action'] ?? '';
$db = db();
function out($a){ echo json_encode($a); exit; }

function slugifie(string $s): string {
    $s = trim($s);
    if (function_exists('iconv')) { $t = @iconv('UTF-8','ASCII//TRANSLIT',$s); if($t!==false) $s=$t; }
    $s = strtolower($s);
    $s = preg_replace('/[^a-z0-9]+/','-',$s);
    return trim($s,'-') ?: 'galerie';
}

switch ($action) {

  // Liste des galeries d'un type (gal | slider), avec nb d'images + vignette.
  case 'list_galeries': {
    $type = ($_GET['type'] ?? 'gal') === 'slider' ? 'slider' : 'gal';
    // convention : les sliders ont un slug préfixé "slider-"
    $like = $type === 'slider' ? 'slider-%' : '%';
    $rows = $db->query("SELECT g.id,g.nom,g.slug,
        (SELECT COUNT(*) FROM galerie_medias gm WHERE gm.galerie_id=g.id) n,
        (SELECT m.url FROM galerie_medias gm JOIN medias m ON m.id=gm.media_id WHERE gm.galerie_id=g.id ORDER BY gm.position LIMIT 1) vignette
        FROM galeries g ORDER BY g.nom")->fetchAll(PDO::FETCH_ASSOC);
    $out = [];
    foreach ($rows as $r) {
      $isSlider = strpos($r['slug'],'slider-') === 0;
      if ($type==='slider' && !$isSlider) continue;
      if ($type==='gal' && $isSlider) continue;
      $r['code'] = ($type==='slider' ? '[slider:' : '[galerie:') . preg_replace('/^slider-/','',$r['slug']) . ']';
      $out[] = $r;
    }
    out($out);
  }

  // Créer une galerie/slider
  case 'create': {
    $nom = trim($_POST['nom'] ?? '');
    $type = ($_POST['type'] ?? 'gal') === 'slider' ? 'slider' : 'gal';
    if ($nom === '') out(['ok'=>false,'error'=>'Nom requis']);
    $slug = slugifie($nom);
    if ($type==='slider') $slug = 'slider-'.preg_replace('/^slider-/','',$slug);
    // unicité du slug
    $racine=$slug; $i=2;
    $chk=$db->prepare("SELECT COUNT(*) FROM galeries WHERE slug=?");
    while(true){ $chk->execute([$slug]); if((int)$chk->fetchColumn()===0) break; $slug=$racine.'-'.$i++; }
    $st=$db->prepare("INSERT INTO galeries(nom,slug,description,cree_le) VALUES(?,?,'',datetime('now'))");
    $st->execute([$nom,$slug]);
    out(['ok'=>true,'id'=>$db->lastInsertId(),'slug'=>$slug]);
  }

  // Renommer
  case 'rename': {
    $id=(int)($_POST['id']??0); $nom=trim($_POST['nom']??'');
    if(!$id||$nom==='') out(['ok'=>false,'error'=>'Paramètres manquants']);
    $db->prepare("UPDATE galeries SET nom=? WHERE id=?")->execute([$nom,$id]);
    out(['ok'=>true]);
  }

  // Supprimer la galerie (et ses liens médias ; les fichiers restent en médiathèque)
  case 'delete': {
    $id=(int)($_POST['id']??0);
    if(!$id) out(['ok'=>false,'error'=>'id manquant']);
    $db->prepare("DELETE FROM galerie_medias WHERE galerie_id=?")->execute([$id]);
    $db->prepare("DELETE FROM galeries WHERE id=?")->execute([$id]);
    out(['ok'=>true]);
  }

  // Médias d'une galerie (ordonnés) + infos galerie
  case 'galerie': {
    $id=(int)($_GET['id']??0);
    $g=$db->prepare("SELECT id,nom,slug FROM galeries WHERE id=?"); $g->execute([$id]); $g=$g->fetch(PDO::FETCH_ASSOC);
    if(!$g) out(['ok'=>false,'error'=>'introuvable']);
    $st=$db->prepare("SELECT m.id,m.url,m.alt FROM galerie_medias gm JOIN medias m ON m.id=gm.media_id WHERE gm.galerie_id=? ORDER BY gm.position,gm.media_id");
    $st->execute([$id]);
    out(['ok'=>true,'galerie'=>$g,'medias'=>$st->fetchAll(PDO::FETCH_ASSOC)]);
  }

  // Toute la médiathèque (pour le sélecteur)
  case 'mediatheque': {
    $rows=$db->query("SELECT id,url,alt FROM medias ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);
    out($rows);
  }

  // Ajouter un média à la galerie (à la fin)
  case 'add_media': {
    $gid=(int)($_POST['galerie_id']??0); $mid=(int)($_POST['media_id']??0);
    if(!$gid||!$mid) out(['ok'=>false,'error'=>'Paramètres manquants']);
    $ex=$db->prepare("SELECT 1 FROM galerie_medias WHERE galerie_id=? AND media_id=?"); $ex->execute([$gid,$mid]);
    if($ex->fetch()) out(['ok'=>true,'deja'=>true]);
    $pos=$db->prepare("SELECT COALESCE(MAX(position),-1)+1 FROM galerie_medias WHERE galerie_id=?"); $pos->execute([$gid]); $pos=$pos->fetchColumn();
    $db->prepare("INSERT INTO galerie_medias(galerie_id,media_id,position) VALUES(?,?,?)")->execute([$gid,$mid,$pos]);
    out(['ok'=>true]);
  }

  // Retirer un média de la galerie
  case 'remove_media': {
    $gid=(int)($_POST['galerie_id']??0); $mid=(int)($_POST['media_id']??0);
    $db->prepare("DELETE FROM galerie_medias WHERE galerie_id=? AND media_id=?")->execute([$gid,$mid]);
    out(['ok'=>true]);
  }

  // Réordonner : liste d'IDs média dans l'ordre voulu
  case 'reorder': {
    $gid=(int)($_POST['galerie_id']??0);
    $ids=json_decode($_POST['ordre']??'[]',true);
    if(!$gid||!is_array($ids)) out(['ok'=>false,'error'=>'Paramètres manquants']);
    $pos=0;
    foreach($ids as $mid){ $db->prepare("UPDATE galerie_medias SET position=? WHERE galerie_id=? AND media_id=?")->execute([$pos++, $gid, (int)$mid]); }
    out(['ok'=>true]);
  }
}
out(['ok'=>false,'error'=>'Action inconnue']);