<?php
// views/pages/raspadita/api/venta_cart_add.php
// ✅ Agrega al carrito (sesión)
// ✅ y en BD marca: estado=2 (vendida) + tmp_cart=1 (reservada por carrito)
declare(strict_types=1);

session_start();
date_default_timezone_set('America/Guayaquil');

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: 0');

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'OPTIONS') { http_response_code(204); exit; }
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
  http_response_code(405);
  echo json_encode(['success'=>false,'message'=>'Use POST'], JSON_UNESCAPED_UNICODE);
  exit;
}

function jexit(array $p, int $c=200): void {
  http_response_code($c);
  echo json_encode($p, JSON_UNESCAPED_UNICODE);
  exit;
}

if (!isset($_SESSION['idusuario'])) jexit(['success'=>false,'message'=>'Sesión no iniciada'], 401);
$id_usuario = (int)$_SESSION['idusuario'];

$raw = file_get_contents('php://input');
$in = $raw ? json_decode($raw, true) : [];
if (!is_array($in)) $in = [];

$serie = trim((string)($in['serie'] ?? ''));
$serie = preg_replace('/[^\p{L}\p{N}\-_]/u', '', $serie);

if ($serie === '' || mb_strlen($serie) < 4) {
  jexit(['success'=>false,'message'=>'Ingrese un código válido (mínimo 4 caracteres).'], 400);
}

require_once __DIR__ . '/../../conex.php';
$db = $conn ?? null;
if (!$db instanceof mysqli) jexit(['success'=>false,'message'=>'Sin conexión BD'], 500);
mysqli_set_charset($db, 'utf8mb4');

$_SESSION['rasp_cart'] = $_SESSION['rasp_cart'] ?? [];
$PRECIO_FIJO = 0.50;

foreach ($_SESSION['rasp_cart'] as $it) {
  if (($it['serie'] ?? '') === $serie) jexit(['success'=>false,'message'=>'Ese código ya está en el carrito.'], 409);
}

$nowFecha = date('Y-m-d');

try {
  $db->begin_transaction();

  // ✅ Solo vende si está disponible: estado=1, anulado=0, id_usuario=sesión
  // y además pone tmp_cart=1 (reservado por carrito)
  $sqlUpd = "UPDATE tbr_raspadita
             SET estado = 2,
                 tmp_cart = 1,
                 tmp_cart_at = NOW()
             WHERE codigo = ?
               AND estado = 2
               AND anulado = 0
               AND id_usuario = ?
               AND tmp_cart = 0
             LIMIT 1";
  $st = $db->prepare($sqlUpd);
  if (!$st) throw new RuntimeException("Prepare update: ".$db->error);

  $st->bind_param('si', $serie, $id_usuario);
  $st->execute();
  $aff = $st->affected_rows;
  $st->close();

  if ($aff !== 1) {
    $db->rollback();

    // Mensajes más claros
    $sqlInfo = "SELECT estado, anulado, id_usuario, tmp_cart
                FROM tbr_raspadita
                WHERE codigo = ?
                LIMIT 1";
    $st2 = $db->prepare($sqlInfo);
    if ($st2) {
      $st2->bind_param('s', $serie);
      $st2->execute();
      $res = $st2->get_result();
      $row = $res ? $res->fetch_assoc() : null;
      $st2->close();

      if (!$row) jexit(['success'=>false,'message'=>'Código no existe en tbr_raspadita.'], 404);
      if ((int)$row['anulado'] === 1) jexit(['success'=>false,'message'=>'Código ANULADO.'], 403);
      if ((int)$row['id_usuario'] !== $id_usuario) jexit(['success'=>false,'message'=>'Este código no pertenece a tu usuario.'], 403);
      if ((int)$row['estado'] === 2 && (int)$row['tmp_cart'] === 1) jexit(['success'=>false,'message'=>'Este código ya está reservado en un carrito (tmp_cart=1).'], 409);
      if ((int)$row['estado'] === 2 && (int)$row['tmp_cart'] === 0) jexit(['success'=>false,'message'=>'Este código ya está VENDIDO definitivo (estado=2).'], 409);
      jexit(['success'=>false,'message'=>'Este código no está disponible para venta (debe estar estado=1).'], 409);
    }

    jexit(['success'=>false,'message'=>'No se pudo vender.'], 409);
  }

  // ✅ Agregar a carrito (sesión)
  $id = (int)(microtime(true) * 1000);
  $_SESSION['rasp_cart'][] = [
    'id'    => $id,
    'fecha' => $nowFecha,
    'serie' => $serie,
    'valor' => $PRECIO_FIJO
  ];

  $db->commit();

  $items = array_values($_SESSION['rasp_cart']);
  $total = round(count($items) * $PRECIO_FIJO, 2);

  jexit([
    'success'=>true,
    'message'=>'Agregado al carrito y reservado (estado=2, tmp_cart=1).',
    'data'=>$items,
    'total'=>$total
  ], 200);

} catch (Throwable $e) {
  try { $db->rollback(); } catch (Throwable $x) {}
  jexit(['success'=>false,'message'=>'Error interno','detail'=>$e->getMessage()], 500);
}
