<?php
/**
 * TechShop Perú - API: Agregar producto al carrito
 * 
 * POST: producto_id, cantidad (default 1), csrf_token
 * 
 * @package TechShop Perú
 * @version 1.0
 */

define('SECURE_ACCESS', true);
require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/database.php';
require_once __DIR__ . '/../includes/functions.php';

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

// Solo aceptar POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode([
        'success' => false,
        'message' => 'Método no permitido.'
    ]);
    exit;
}

// Verificar CSRF
if (!csrf_verify()) {
    echo json_encode([
        'success' => false,
        'message' => 'Token de seguridad inválido. Recarga la página e inténtalo de nuevo.'
    ]);
    exit;
}

try {
    $db = db();

    // Obtener y validar producto_id
    $producto_id = isset($_POST['producto_id']) ? (int) $_POST['producto_id'] : 0;
    if ($producto_id <= 0) {
        echo json_encode([
            'success' => false,
            'message' => 'Producto no especificado.'
        ]);
        exit;
    }

    // Obtener y validar cantidad
    $cantidad = isset($_POST['cantidad']) ? (int) $_POST['cantidad'] : 1;
    if ($cantidad < 1) {
        $cantidad = 1;
    }

    // Verificar que el producto existe, está activo y tiene stock
    $stmt = $db->prepare(
        'SELECT id, nombre, stock, precio_oferta, activo
         FROM productos
         WHERE id = ?'
    );
    $stmt->execute([$producto_id]);
    $producto = $stmt->fetch();

    if (!$producto) {
        echo json_encode([
            'success' => false,
            'message' => 'El producto no existe.'
        ]);
        exit;
    }

    if (!$producto['activo']) {
        echo json_encode([
            'success' => false,
            'message' => 'Este producto ya no está disponible.'
        ]);
        exit;
    }

    if ($producto['stock'] <= 0) {
        echo json_encode([
            'success' => false,
            'message' => 'Producto agotado. No hay stock disponible.'
        ]);
        exit;
    }

    // Determinar si el usuario está logueado o es invitado
    if (is_logged_in()) {
        $usuario_id = $_SESSION['usuario_id'];
        $sesion_id = null;

        // Verificar si el producto ya está en el carrito
        $stmt = $db->prepare(
            'SELECT id, cantidad FROM carrito
             WHERE usuario_id = ? AND producto_id = ?'
        );
        $stmt->execute([$usuario_id, $producto_id]);
    } else {
        $usuario_id = null;
        $sesion_id = $_SESSION['carrito_sesion_id'];

        // Verificar si el producto ya está en el carrito
        $stmt = $db->prepare(
            'SELECT id, cantidad FROM carrito
             WHERE sesion_id = ? AND producto_id = ?'
        );
        $stmt->execute([$sesion_id, $producto_id]);
    }

    $item_existente = $stmt->fetch();

    if ($item_existente) {
        // Ya existe: aumentar cantidad
        $nueva_cantidad = $item_existente['cantidad'] + $cantidad;

        // Validar que no exceda el stock disponible
        if ($nueva_cantidad > $producto['stock']) {
            $nueva_cantidad = $producto['stock'];
        }

        $stmt = $db->prepare('UPDATE carrito SET cantidad = ? WHERE id = ?');
        $stmt->execute([$nueva_cantidad, $item_existente['id']]);

        $message = $cantidad > 1
            ? "Se agregaron {$cantidad} unidades mas de \"" . e($producto['nombre']) . "\" al carrito."
            : "Se agrego 1 unidad mas de \"" . e($producto['nombre']) . "\" al carrito.";

        if ($nueva_cantidad === $producto['stock']) {
            $message .= ' (Stock maximo alcanzado)';
        }
    } else {
        // No existe: insertar nuevo
        $cantidad_final = min($cantidad, $producto['stock']);

        $stmt = $db->prepare(
            'INSERT INTO carrito (usuario_id, sesion_id, producto_id, cantidad)
             VALUES (?, ?, ?, ?)'
        );
        $stmt->execute([$usuario_id, $sesion_id, $producto_id, $cantidad_final]);

        $message = "\"" . e($producto['nombre']) . "\" agregado al carrito.";
    }

    // Obtener conteo y total actualizados
    $cart_count = cart_count();
    $cart_total = cart_total();

    echo json_encode([
        'success'   => true,
        'message'   => $message,
        'cart_count' => $cart_count,
        'cart_total' => format_precio($cart_total)
    ]);

} catch (PDOException $e) {
    if (DEBUG_MODE) {
        error_log('Error en cart-add.php: ' . $e->getMessage());
    }
    echo json_encode([
        'success' => false,
        'message' => 'Ocurrió un error al agregar el producto al carrito. Inténtalo nuevamente.'
    ]);
}
