<?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);
$accion     = $_GET['accion'] ?? '';

// PATCH ?id=X&accion=toggle — activa/pausa sin borrar
if ($method === 'PATCH' && $id && $accion === 'toggle') {
    $stmt = $db->prepare('SELECT activo FROM promociones WHERE id = ? AND negocio_id = ?');
    $stmt->execute([$id, $negocio_id]);
    $promo = $stmt->fetch();
    if (!$promo) jsonResponse(['error' => 'Promoción no encontrada'], 404);

    $nuevo = $promo['activo'] ? 0 : 1;
    $db->prepare('UPDATE promociones SET activo = ? WHERE id = ? AND negocio_id = ?')
       ->execute([$nuevo, $id, $negocio_id]);

    jsonResponse(['activo' => $nuevo]);
}

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

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

    if (!$titulo || !$f_inicio || !$f_fin) {
        jsonResponse(['error' => 'titulo, 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);
    }

    $imagen_url = null;
    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);
        }
        $imagen_url = comprimirYGuardarImagen($_FILES['imagen']['tmp_name'], $negocio_id, 'promos');
        if (!$imagen_url) jsonResponse(['error' => 'Formato de imagen no válido (solo JPG/PNG)'], 400);
    }

    $stmt = $db->prepare(
        'INSERT INTO promociones (negocio_id, titulo, descripcion, imagen_url, fecha_inicio, fecha_fin)
         VALUES (?, ?, ?, ?, ?, ?)'
    );
    $stmt->execute([$negocio_id, $titulo, $descripcion, $imagen_url, $f_inicio, $f_fin]);

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

// POST con ?id=X — actualizar (PHP no parsea multipart en PUT)
if ($method === 'POST' && $id) {
    $titulo      = trim($_POST['titulo'] ?? '');
    $descripcion = trim($_POST['descripcion'] ?? '');
    $f_inicio    = $_POST['fecha_inicio'] ?? '';
    $f_fin       = $_POST['fecha_fin'] ?? '';

    if (!$titulo || !$f_inicio || !$f_fin) {
        jsonResponse(['error' => 'titulo, 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 promociones WHERE id = ? AND negocio_id = ?');
    $stmt->execute([$id, $negocio_id]);
    $promo = $stmt->fetch();
    if (!$promo) jsonResponse(['error' => 'Promoción no encontrada'], 404);

    $imagen_url = $promo['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, 'promos');
        if (!$nueva) jsonResponse(['error' => 'Formato de imagen no válido (solo JPG/PNG)'], 400);
        eliminarArchivoUpload($imagen_url);
        $imagen_url = $nueva;
    }

    $db->prepare(
        'UPDATE promociones SET titulo=?, descripcion=?, imagen_url=?, fecha_inicio=?, fecha_fin=?
         WHERE id=? AND negocio_id=?'
    )->execute([$titulo, $descripcion, $imagen_url, $f_inicio, $f_fin, $id, $negocio_id]);

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

// DELETE ?id=X
if ($method === 'DELETE' && $id) {
    $stmt = $db->prepare('SELECT imagen_url FROM promociones WHERE id = ? AND negocio_id = ?');
    $stmt->execute([$id, $negocio_id]);
    $promo = $stmt->fetch();
    if (!$promo) jsonResponse(['error' => 'Promoción no encontrada'], 404);

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

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

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