'Sesión no iniciada']); exit; } $idPartida = intval($_POST['idPartida'] ?? 0); $orden = $_POST['orden'] ?? ''; if ($idPartida <= 0) { echo json_encode(['error' => 'Partida no válida']); exit; } $conexion = conexionBD(); if (is_array($conexion)) { echo json_encode($conexion); exit; } switch ($orden) { case 'comprobarEstado': try { $stmt = $conexion->prepare(" SELECT COUNT(exu.idUsuario) AS total_jugadores FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo WHERE exp.idPartida = :idPartida "); $stmt->execute([':idPartida' => $idPartida]); $totalJugadores = (int)$stmt->fetchColumn(); $preguntasTotalesEsperadas = $totalJugadores * 10; $stmtRespuestas = $conexion->prepare(" SELECT COUNT(*) FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta WHERE pxp.idPartida = :idPartida "); $stmtRespuestas->execute([':idPartida' => $idPartida]); $respuestasRespondidas = (int)$stmtRespuestas->fetchColumn(); $terminada = ($respuestasRespondidas >= $preguntasTotalesEsperadas && $preguntasTotalesEsperadas > 0); if ($terminada && !isset($_SESSION['partidas_processed'][$idPartida])) { $conexion->beginTransaction(); if (!isset($_SESSION['primeros_en_acertar'][$idPartida])) { $_SESSION['primeros_en_acertar'][$idPartida] = []; } $stmtVelocidad = $conexion->prepare(" SELECT ra.idPartidaxPregunta, ra.idUsuario FROM respuestaalmacenada ra INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta WHERE pxp.idPartida = :idPartida AND r.correcta = 1 ORDER BY ra.idRespuestaAlmacenada ASC "); $stmtVelocidad->execute([':idPartida' => $idPartida]); $todosLosAciertos = $stmtVelocidad->fetchAll(PDO::FETCH_ASSOC); foreach ($todosLosAciertos as $acierto) { $idPxp = $acierto['idPartidaxPregunta']; $idU = $acierto['idUsuario']; if (!isset($_SESSION['primeros_en_acertar'][$idPartida][$idPxp])) { $_SESSION['primeros_en_acertar'][$idPartida][$idPxp] = $idU; } } $stmtAciertos = $conexion->prepare(" SELECT ra.idUsuario, exu.idEquipo, COUNT(*) as aciertos_partida FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta INNER JOIN respuesta r ON ra.idRespuesta = r.idRespuesta INNER JOIN equipoxusuario exu ON ra.idUsuario = exu.idUsuario WHERE pxp.idPartida = :idPartida AND r.correcta = 1 GROUP BY ra.idUsuario, exu.idEquipo "); $stmtAciertos->execute([':idPartida' => $idPartida]); $jugadoresPartida = $stmtAciertos->fetchAll(PDO::FETCH_ASSOC); $updateAciertos = $conexion->prepare("UPDATE usuario SET aciertos = aciertos + :nuevos_aciertos WHERE idUsuario = :idUsuario"); $puntosEquipos = []; foreach ($jugadoresPartida as $jp) { $idU = (int)$jp['idUsuario']; $idE = (int)$jp['idEquipo']; $nuevosAciertos = (int)$jp['aciertos_partida']; $updateAciertos->execute([':nuevos_aciertos' => $nuevosAciertos, ':idUsuario' => $idU]); if (!isset($puntosEquipos[$idE])) { $puntosEquipos[$idE] = 0; } $puntosEquipos[$idE] += $nuevosAciertos; } if (!empty($puntosEquipos)) { arsort($puntosEquipos); $idEquipoGanador = key($puntosEquipos); $stmtMiembros = $conexion->prepare(" SELECT exu.idUsuario, exu.idEquipo FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo WHERE exp.idPartida = :idPartida "); $stmtMiembros->execute([':idPartida' => $idPartida]); $todosLosMiembros = $stmtMiembros->fetchAll(PDO::FETCH_ASSOC); $updateVictoria = $conexion->prepare("UPDATE usuario SET victorias = victorias + 1 WHERE idUsuario = :idUsuario"); $updateDerrota = $conexion->prepare("UPDATE usuario SET derrotas = derrotas + 1 WHERE idUsuario = :idUsuario"); foreach ($todosLosMiembros as $miembro) { $idU = (int)$miembro['idUsuario']; $idE = (int)$miembro['idEquipo']; if ($idE === $idEquipoGanador) { $updateVictoria->execute([':idUsuario' => $idU]); } else { $updateDerrota->execute([':idUsuario' => $idU]); } } } $stmtFinalizar = $conexion->prepare("UPDATE partida SET fechaFin = NOW() WHERE idPartida = :idPartida AND fechaFin IS NULL"); $stmtFinalizar->execute([':idPartida' => $idPartida]); $conexion->commit(); $_SESSION['partidas_procesadas'][$idPartida] = true; } echo json_encode(['terminada' => $terminada]); } catch (PDOException $e) { if ($conexion->inTransaction()) { $conexion->rollBack(); } echo json_encode(['error' => $e->getMessage()]); } break; case 'registrarSalidaUsuario': try { $idUsuario = (int)$_SESSION['idUsuario']; $conexion->beginTransaction(); $stmtSalir = $conexion->prepare("DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario"); $stmtSalir->execute([':idUsuario' => $idUsuario]); $stmtContarQuedan = $conexion->prepare(" SELECT COUNT(exu.idUsuario) FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo WHERE exp.idPartida = :idPartida "); $stmtContarQuedan->execute([':idPartida' => $idPartida]); $jugadoresRestantes = (int)$stmtContarQuedan->fetchColumn(); if ($jugadoresRestantes === 0) { $stmtBorrarRespuestas = $conexion->prepare(" DELETE ra FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta = pxp.idPartidaxPregunta WHERE pxp.idPartida = :idPartida "); $stmtBorrarRespuestas->execute([':idPartida' => $idPartida]); $stmtBorrarPreguntas = $conexion->prepare("DELETE FROM partidaxpregunta WHERE idPartida = :idPartida"); $stmtBorrarPreguntas->execute([':idPartida' => $idPartida]); $stmtObtenerEquipos = $conexion->prepare("SELECT idEquipo FROM equipoxpartida WHERE idPartida = :idPartida"); $stmtObtenerEquipos->execute([':idPartida' => $idPartida]); $equiposDeLaPartida = $stmtObtenerEquipos->fetchAll(PDO::FETCH_COLUMN); $stmtBorrarEquiposPartida = $conexion->prepare("DELETE FROM equipoxpartida WHERE idPartida = :idPartida"); $stmtBorrarEquiposPartida->execute([':idPartida' => $idPartida]); if (!empty($equiposDeLaPartida)) { $inQuery = implode(',', array_fill(0, count($equiposDeLaPartida), '?')); $stmtBorrarEquiposFisicos = $conexion->prepare("DELETE FROM equipo WHERE idEquipo IN ($inQuery)"); $stmtBorrarEquiposFisicos->execute($equiposDeLaPartida); } $stmtBorrarSala = $conexion->prepare("DELETE FROM partida WHERE idPartida = :idPartida"); $stmtBorrarSala->execute([':idPartida' => $idPartida]); } $conexion->commit(); echo json_encode(['exito' => true, 'usuarios_quedan' => $jugadoresRestantes]); } catch (PDOException $e) { if ($conexion->inTransaction()) { $conexion->rollBack(); } echo json_encode(['error' => $e->getMessage()]); } break; }