<?php
/**
 * TechShop Perú - API: Actualizar cantidad del carrito
 * 
 * POST: cart_id, cantidad, 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 cart_id
    $cart_id = isset($_POST['cart_id']) ? (int) $_POST['cart_id'] : 0;
    if ($cart_id <= 0) {
        echo json_encode([
            'success' => false,
            'message' => 'Ítem de carrito no especificado.'
        ]);
        exit;
    }

    // Obtener y validar cantidad
    $cantidad = isset($_POST['cantidad']) ? (int) $_POST['cantidad'] : 0;

    // Obtener el item del carrito con información del producto
    $stmt = $db->prepare(
        'SELECT c.id, c.cantidad AS cantidad_actual, c.usuario_id, c.sesion_id,
                p.id AS producto_id, p.nombre, p.stock, p.precio, p.precio_oferta, p.activo
         FROM carrito c
         JOIN productos p ON c.producto_id = p.id
         WHERE c.id = ?'
    );
    $stmt->execute([$cart_id]);
    $item = $stmt->fetch();

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

    // Verificar pertenencia
    if (is_logged_in()) {
        if ($item['usuario_id'] != $_SESSION['usuario_id']) {
            echo json_encode([
                'success' => false,
                'message' => 'No tienes permiso para modificar este ítem.'
            ]);
            exit;
        }
    } else {
        if ($item['sesion_id'] !== $_SESSION['carrito_sesion_id']) {
            echo json_encode([
                'success' => false,
                'message' => 'No tienes permiso para modificar este ítem.'
            ]);
            exit;
        }
    }

    // Si cantidad <= 0, eliminar el item
    if ($cantidad <= 0) {
        $stmt = $db->prepare('DELETE FROM carrito WHERE id = ?');
        $stmt->execute([$cart_id]);

        $cart_total = cart_total();
        $cart_count = cart_count();

        echo json_encode([
            'success'        => true,
            'message'        => "\"" . e($item['nombre']) . "\" eliminado del carrito.",
            'cart_total'     => format_precio($cart_total),
            'cart_total_raw' => $cart_total,
            'cart_count'     => $cart_count,
            'item_subtotal'  => format_precio(0),
            'removed'        => true
        ]);
        exit;
    }

    // Validar stock
    if ($cantidad > $item['stock']) {
        echo json_encode([
            'success' => false,
            'message' => "Stock insuficiente. Solo hay {$item['stock']} unidades disponibles de \"" . e($item['nombre']) . "\"."
        ]);
        exit;
    }

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

    $item_subtotal = precio_final($item) * $cantidad;
    $cart_total = cart_total();

    echo json_encode([
        'success'        => true,
        'message'        => "Cantidad de \"" . e($item['nombre']) . "\" actualizada a {$cantidad}.",
        'cart_total'     => format_precio($cart_total),
        'cart_total_raw' => $cart_total,
        'item_subtotal'  => format_precio($item_subtotal),
        'removed'        => false
    ]);

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