<?php
/**
 * admin/api/bloque.php
 * Gestión CRUD de bloques de contenido.
 * Acciones: add | update | delete | move
 * Siempre redirige de vuelta a admin/editar.php?id=X
 */
require_once __DIR__ . '/../auth.php';
require_once __DIR__ . '/../../config/conn.php';

av_require_login();
av_csrf_verify();

$aviso_id = (int)($_POST['aviso_id'] ?? 0);
$action   = $_POST['action'] ?? '';

if (!$aviso_id) {
    header('Location: ../index.php');
    exit;
}

// Verificar que el aviso existe y pertenece al sistema
$chk = $conn->prepare("SELECT id FROM av_avisos WHERE id = ? LIMIT 1");
$chk->bind_param('i', $aviso_id);
$chk->execute();
if (!$chk->get_result()->fetch_assoc()) {
    header('Location: ../index.php');
    exit;
}
$chk->close();

// ─── Helpers ────────────────────────────────────────────────

/** Renumera los bloques de un aviso de forma secuencial (0,1,2,...). */
function renum(mysqli $db, int $aid): void
{
    $s = $db->prepare("SELECT id FROM av_aviso_bloques WHERE aviso_id=? ORDER BY orden ASC, id ASC");
    $s->bind_param('i', $aid);
    $s->execute();
    $rows = $s->get_result()->fetch_all(MYSQLI_ASSOC);
    $s->close();

    $u = $db->prepare("UPDATE av_aviso_bloques SET orden=? WHERE id=?");
    foreach ($rows as $i => $row) {
        $u->bind_param('ii', $i, $row['id']);
        $u->execute();
    }
    $u->close();
}

/**
 * Sube un archivo y devuelve ['path' => 'uploads/avisos/archivos/xxx.ext',
 *                             'nombre' => 'original.pdf',
 *                             'mime'   => 'application/pdf',
 *                             'size'   => 12345].
 * Lanza RuntimeException si falla.
 */
function subir_archivo(array $file, string $tipo): array
{
    $allowed = [
        'imagen'  => ['image/jpeg','image/png','image/gif','image/webp'],
        'video'   => ['video/mp4','video/webm','video/ogg','video/quicktime'],
        'archivo' => [], // cualquier tipo permitido
    ];

    if ($file['error'] !== UPLOAD_ERR_OK) {
        throw new RuntimeException('Error al subir el archivo (código ' . $file['error'] . ').');
    }
    if ($file['size'] > 100 * 1024 * 1024) { // 100 MB máx
        throw new RuntimeException('El archivo supera el límite de 100 MB.');
    }

    // Detectar MIME real con finfo
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime  = $finfo->file($file['tmp_name']);

    if (!empty($allowed[$tipo])) {
        if (!in_array($mime, $allowed[$tipo], true)) {
            throw new RuntimeException("Tipo de archivo no permitido para bloque «{$tipo}» (detectado: {$mime}).");
        }
    }

    // Extensión segura
    $ext    = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    $ext    = preg_replace('/[^a-z0-9]/', '', $ext);
    $newnam = bin2hex(random_bytes(16)) . ($ext ? '.' . $ext : '');

    $dir = __DIR__ . '/../../uploads/avisos/archivos/';
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }

    $dest = $dir . $newnam;
    if (!move_uploaded_file($file['tmp_name'], $dest)) {
        throw new RuntimeException('No se pudo mover el archivo al directorio de uploads.');
    }

    return [
        'path'   => 'uploads/avisos/archivos/' . $newnam,
        'nombre' => basename($file['name']),
        'mime'   => $mime,
        'size'   => (int)$file['size'],
    ];
}

// ─── Acciones ───────────────────────────────────────────────

switch ($action) {

    // ── Agregar bloque ──────────────────────────────────────
    case 'add':
        $tipo = $_POST['tipo'] ?? 'texto';
        $tipo = in_array($tipo, ['texto','imagen','video','archivo'], true)
                ? $tipo : 'texto';

        // Orden = siguiente disponible
        $ord_q = $conn->prepare("SELECT COALESCE(MAX(orden)+1,0) AS n FROM av_aviso_bloques WHERE aviso_id=?");
        $ord_q->bind_param('i', $aviso_id);
        $ord_q->execute();
        $next_ord = (int)$ord_q->get_result()->fetch_assoc()['n'];
        $ord_q->close();

        $contenido    = null;
        $nombre_arch  = null;
        $mime_type    = null;
        $tamano       = null;

        if ($tipo === 'texto') {
            $contenido = $_POST['contenido'] ?? '';
        } elseif ($tipo === 'video') {
            $url = trim($_POST['url_video'] ?? '');
            if ($url !== '') {
                $contenido = $url;
            } elseif (!empty($_FILES['archivo']['tmp_name'])) {
                $info = subir_archivo($_FILES['archivo'], 'video');
                $contenido   = $info['path'];
                $nombre_arch = $info['nombre'];
                $mime_type   = $info['mime'];
                $tamano      = $info['size'];
            }
        } else {
            // imagen, pdf, excel, archivo
            if (!empty($_FILES['archivo']['tmp_name'])) {
                $info = subir_archivo($_FILES['archivo'], $tipo);
                $contenido   = $info['path'];
                $nombre_arch = $info['nombre'];
                $mime_type   = $info['mime'];
                $tamano      = $info['size'];
            }
        }

        $ins = $conn->prepare(
            "INSERT INTO av_aviso_bloques
             (aviso_id, tipo, contenido, nombre_archivo, mime_type, tamano_bytes, orden)
             VALUES (?,?,?,?,?,?,?)"
        );
        $ins->bind_param('issssii', $aviso_id, $tipo, $contenido,
                         $nombre_arch, $mime_type, $tamano, $next_ord);
        $ins->execute();
        $ins->close();
        break;

    // ── Actualizar bloque ───────────────────────────────────
    case 'update':
        $bloque_id = (int)($_POST['bloque_id'] ?? 0);
        if (!$bloque_id) break;

        // Cargar bloque actual para conservar archivo si no se sube uno nuevo
        $cur = $conn->prepare("SELECT tipo, contenido, nombre_archivo, mime_type, tamano_bytes
                                FROM av_aviso_bloques WHERE id=? AND aviso_id=? LIMIT 1");
        $cur->bind_param('ii', $bloque_id, $aviso_id);
        $cur->execute();
        $actual = $cur->get_result()->fetch_assoc();
        $cur->close();
        if (!$actual) break;

        $contenido   = $actual['contenido'];
        $nombre_arch = $actual['nombre_archivo'];
        $mime_type   = $actual['mime_type'];
        $tamano      = $actual['tamano_bytes'];

        if ($actual['tipo'] === 'texto') {
            $contenido = $_POST['contenido'] ?? '';
        } elseif ($actual['tipo'] === 'video') {
            $url = trim($_POST['url_video'] ?? '');
            if ($url !== '') {
                $contenido = $url;
            } elseif (!empty($_FILES['archivo']['tmp_name'])) {
                $info = subir_archivo($_FILES['archivo'], 'video');
                $contenido   = $info['path'];
                $nombre_arch = $info['nombre'];
                $mime_type   = $info['mime'];
                $tamano      = $info['size'];
            }
        } else {
            if (!empty($_FILES['archivo']['tmp_name'])) {
                $info = subir_archivo($_FILES['archivo'], $actual['tipo']);
                $contenido   = $info['path'];
                $nombre_arch = $info['nombre'];
                $mime_type   = $info['mime'];
                $tamano      = $info['size'];
            }
        }

        $upd = $conn->prepare(
            "UPDATE av_aviso_bloques
             SET contenido=?, nombre_archivo=?, mime_type=?, tamano_bytes=?
             WHERE id=? AND aviso_id=?"
        );
        $upd->bind_param('sssiii', $contenido, $nombre_arch, $mime_type, $tamano,
                         $bloque_id, $aviso_id);
        $upd->execute();
        $upd->close();
        break;

    // ── Eliminar bloque ─────────────────────────────────────
    case 'delete':
        $bloque_id = (int)($_POST['bloque_id'] ?? 0);
        if (!$bloque_id) break;

        $del = $conn->prepare("DELETE FROM av_aviso_bloques WHERE id=? AND aviso_id=?");
        $del->bind_param('ii', $bloque_id, $aviso_id);
        $del->execute();
        $del->close();
        renum($conn, $aviso_id);
        break;

    // ── Mover bloque (subir / bajar) ────────────────────────
    case 'move':
        $bloque_id = (int)($_POST['bloque_id'] ?? 0);
        $dir       = ($_POST['dir'] ?? '') === 'up' ? 'up' : 'down';
        if (!$bloque_id) break;

        // Cargar todos los bloques ordenados
        $all = $conn->prepare("SELECT id, orden FROM av_aviso_bloques WHERE aviso_id=? ORDER BY orden ASC, id ASC");
        $all->bind_param('i', $aviso_id);
        $all->execute();
        $bloques = $all->get_result()->fetch_all(MYSQLI_ASSOC);
        $all->close();

        $idx = null;
        foreach ($bloques as $i => $b) {
            if ((int)$b['id'] === $bloque_id) { $idx = $i; break; }
        }
        if ($idx === null) break;

        $swap = $dir === 'up' ? $idx - 1 : $idx + 1;
        if ($swap < 0 || $swap >= count($bloques)) break;

        // Intercambiar orden
        $o1 = $bloques[$idx]['orden'];
        $o2 = $bloques[$swap]['orden'];
        $sw = $conn->prepare("UPDATE av_aviso_bloques SET orden=? WHERE id=?");
        $sw->bind_param('ii', $o2, $bloques[$idx]['id']);
        $sw->execute();
        $sw->bind_param('ii', $o1, $bloques[$swap]['id']);
        $sw->execute();
        $sw->close();
        break;
}

// Siempre volver al editor
header('Location: ../editar.php?id=' . $aviso_id);
exit;
