<?php
require_once 'config.php';
require_once 'middleware.php';

header('Content-Type: application/json; charset=utf-8');

$negocio_id = validarToken();
$method     = $_SERVER['REQUEST_METHOD'];
$db         = getDB();
$id         = (int)($_GET['id'] ?? 0);

// GET — lista o detalle
if ($method === 'GET') {
    if ($id) {
        $stmt = $db->prepare('SELECT * FROM banners WHERE id = ? AND negocio_id = ?');
        $stmt->execute([$id, $negocio_id]);
        $banner = $stmt->fetch();
        if (!$banner) jsonResponse(['error' => 'Banner no encontrado'], 404);
        jsonResponse($banner);
    }
    $stmt = $db->prepare(
        'SELECT * FROM banners WHERE negocio_id = ? ORDER BY fecha_inicio DESC'
    );
    $stmt->execute([$negocio_id]);
    jsonResponse($stmt->fetchAll());
}

// POST sin ?id — crear
if ($method === 'POST' && !$id) {
    $link_destino = trim($_POST['link_destino'] ?? '');
    $f_inicio     = $_POST['fecha_inicio'] ?? '';
    $f_fin        = $_POST['fecha_fin'] ?? '';

    if (!$f_inicio || !$f_fin) {
        jsonResponse(['error' => 'fecha_inicio y fecha_fin son requeridos'], 400);
    }
    if ($f_fin < $f_inicio) {
        jsonResponse(['error' => 'fecha_fin no puede ser anterior a fecha_inicio'], 400);
    }
    if (empty($_FILES['imagen']) || $_FILES['imagen']['error'] !== UPLOAD_ERR_OK) {
        jsonResponse(['error' => 'La imagen del banner es requerida'], 400);
    }
    if ($_FILES['imagen']['size'] > MAX_FILE_SIZE) {
        jsonResponse(['error' => 'Imagen demasiado grande (máx. 3 MB)'], 400);
    }

    $imagen_url = comprimirYGuardarImagen($_FILES['imagen']['tmp_name'], $negocio_id, 'banners');
    if (!$imagen_url) jsonResponse(['error' => 'Formato de imagen no válido (solo JPG/PNG)'], 400);

    $stmt = $db->prepare(
        'INSERT INTO banners (negocio_id, imagen_url, link_destino, fecha_inicio, fecha_fin)
         VALUES (?, ?, ?, ?, ?)'
    );
    $stmt->execute([$negocio_id, $imagen_url, $link_destino ?: null, $f_inicio, $f_fin]);

    jsonResponse(['id' => (int)$db->lastInsertId()], 201);
}

// POST con ?id=X — actualizar
if ($method === 'POST' && $id) {
    $link_destino = trim($_POST['link_destino'] ?? '');
    $f_inicio     = $_POST['fecha_inicio'] ?? '';
    $f_fin        = $_POST['fecha_fin'] ?? '';

    if (!$f_inicio || !$f_fin) {
        jsonResponse(['error' => 'fecha_inicio y fecha_fin son requeridos'], 400);
    }
    if ($f_fin < $f_inicio) {
        jsonResponse(['error' => 'fecha_fin no puede ser anterior a fecha_inicio'], 400);
    }

    $stmt = $db->prepare('SELECT imagen_url FROM banners WHERE id = ? AND negocio_id = ?');
    $stmt->execute([$id, $negocio_id]);
    $banner = $stmt->fetch();
    if (!$banner) jsonResponse(['error' => 'Banner no encontrado'], 404);

    $imagen_url = $banner['imagen_url'];

    if (!empty($_FILES['imagen']) && $_FILES['imagen']['error'] === UPLOAD_ERR_OK) {
        if ($_FILES['imagen']['size'] > MAX_FILE_SIZE) {
            jsonResponse(['error' => 'Imagen demasiado grande (máx. 3 MB)'], 400);
        }
        $nueva = comprimirYGuardarImagen($_FILES['imagen']['tmp_name'], $negocio_id, 'banners');
        if (!$nueva) jsonResponse(['error' => 'Formato de imagen no válido (solo JPG/PNG)'], 400);
        eliminarArchivoUpload($imagen_url);
        $imagen_url = $nueva;
    }

    $db->prepare(
        'UPDATE banners SET imagen_url=?, link_destino=?, fecha_inicio=?, fecha_fin=?
         WHERE id=? AND negocio_id=?'
    )->execute([$imagen_url, $link_destino ?: null, $f_inicio, $f_fin, $id, $negocio_id]);

    jsonResponse(['ok' => true]);
}

// DELETE ?id=X
if ($method === 'DELETE' && $id) {
    $stmt = $db->prepare('SELECT imagen_url FROM banners WHERE id = ? AND negocio_id = ?');
    $stmt->execute([$id, $negocio_id]);
    $banner = $stmt->fetch();
    if (!$banner) jsonResponse(['error' => 'Banner no encontrado'], 404);

    eliminarArchivoUpload($banner['imagen_url']);
    $db->prepare('DELETE FROM banners WHERE id = ? AND negocio_id = ?')->execute([$id, $negocio_id]);

    jsonResponse(['ok' => true]);
}

jsonResponse(['error' => 'Método o parámetros no válidos'], 405);
