Files

101 lines
3.6 KiB
PHP

<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../admin/db.php';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
// JSON o form
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!is_array($data)) $data = $_POST;
$rasca_id = isset($data['rasca_id']) ? (int)$data['rasca_id'] : 0;
$porcentaje = isset($data['percent']) ? (float)$data['percent'] : null; // opcional
if ($rasca_id <= 0) { echo json_encode(['ok'=>false,'error'=>'rasca_id inválido']); exit; }
// Premios activos con stock (NULL = ilimitado)
$sql = "SELECT id, nombre, probabilidad, stock, activo, imagen_url
FROM rasca_premios
WHERE rasca_id=? AND activo=1
AND (stock IS NULL OR stock > 0)
AND probabilidad > 0";
$st = $conn->prepare($sql);
$st->bind_param('i', $rasca_id);
$st->execute();
$st->bind_result($id, $nombre, $prob, $stock, $activo, $img);
$premios = []; $total = 0.0;
while ($st->fetch()) {
$prob = (float)$prob;
$premios[] = [
'id' => (int)$id,
'nombre' => $nombre,
'prob' => $prob,
'stock' => is_null($stock) ? null : (int)$stock,
'imagen_url' => $img ?: null
];
$total += max(0.0, $prob);
}
$st->close();
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? null;
$ua = $_SERVER['HTTP_USER_AGENT'] ?? null;
if (!$premios) {
// Sin premios disponibles: registra jugada sin premio
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
VALUES (?,?,?,?,NULL)")
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
->execute();
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'No hay premios activos o con stock']);
exit;
}
if ($total <= 0) { echo json_encode(['ok'=>false,'error'=>'Probabilidades inválidas']); exit; }
// Selección ponderada
$rnd = mt_rand() / mt_getrandmax() * $total;
$acc = 0.0; $pick = null;
foreach ($premios as $p) { $acc += max(0.0, $p['prob']); if ($rnd <= $acc) { $pick = $p; break; } }
if ($pick === null) $pick = $premios[0];
// Transacción: descontar stock (si aplica) y registrar jugada
$conn->begin_transaction();
if ($pick['stock'] !== null) {
$upd = $conn->prepare("UPDATE rasca_premios SET stock = stock - 1 WHERE id=? AND stock > 0");
$upd->bind_param('i', $pick['id']);
$upd->execute();
if ($upd->affected_rows === 0) {
$conn->rollback();
// stock se agotó en carrera; registra jugada sin premio
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
VALUES (?,?,?,?,NULL)")
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
->execute();
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'Stock agotado']);
exit;
}
}
$ins = $conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
VALUES (?,?,?,?,?)");
$ins->bind_param('issdi', $rasca_id, $ip, $ua, $porcentaje, $pick['id']);
$ins->execute();
$conn->commit();
echo json_encode([
'ok' => true,
'premio' => $pick['nombre'],
'premio_id' => $pick['id'],
'imagen_url' => $pick['imagen_url']
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} catch (Throwable $e) {
@mysqli_rollback($conn);
echo json_encode(['ok'=>false,'error'=>'No hay articulos en stock.']);
//echo json_encode(['ok'=>false,'error'=>'Sorteo falló: '.$e->getMessage()]);
}