idPartida = $idPartida; $this->nombrePartida = $nombrePartida; $this->idUsuario = $idUsuario; $this->fechaCreacion = $fechaCreacion; $this->fechaInicio = $fechaInicio; $this->fechaFin = $fechaFin; } public function insertar() { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("INSERT INTO partida (nombrePartida,idUsuario) VALUES (:nombrePartida,:idUsuario)"); $consulta->bindParam(":nombrePartida", $this->nombrePartida); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); return [ "exito" => "La partida se creó correctamente.", "exito_tecnico" => $conexion->lastInsertId() ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al guardar la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function listar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT * FROM partida"); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al obtener el listado.", 'error_tecnico' => $error->getMessage() ]; } } public function buscar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT * FROM partida WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return $consulta->fetch(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al buscar la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function editar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("UPDATE partida SET nombrePartida=:nombrePartida, idUsuario=:idUsuario WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":nombrePartida", $this->nombrePartida); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); return [ "exito" => "La partida se editó correctamente.", "exito_tecnico" => $this->idPartida ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al editar la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function eliminar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("DELETE FROM partida WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return [ "exito" => "La partida se eliminó correctamente.", "exito_tecnico" => $this->idPartida ]; } catch (PDOException $error) { return [ "error" => "No se pudo eliminar la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function iniciarPartida(){ $conexion = conexionBD(); if (is_array($conexion)){ return $conexion; } try { $consulta = $conexion->prepare("UPDATE partida SET fechaInicio=NOW() WHERE idPartida=:idPartida AND fechaInicio IS NULL"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return [ "exito" => "La partida ha comenzado.", "exito_tecnico" => $this->idPartida ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al iniciar la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function finalizar(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("UPDATE partida SET fechaFin=NOW() WHERE idPartida=:idPartida AND fechaFin IS NULL"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return [ "exito" => "La partida se finalizó correctamente.", "exito_tecnico" => $this->idPartida ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al finalizar la partida.", 'error_tecnico' => $error->getMessage() ]; } } //true si la partida ya tiene fecha de fin (fechaFin no es NULL) //Devuelve false si la partida no existe public function estaFinalizada() { $datos = $this->buscar(); if (is_array($datos) && isset($datos["error"])) { return $datos; } if (!$datos) { return false; } return $datos["fechaFin"] !== null; } //Devuelve la partida más reciente del usuario que aún no ha //terminado (fechaFin NULL), o false si no tiene ninguna. //Incluye también las salas que todavía no han empezado. public function partidaEnCursoDeUsuario(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT * FROM partida WHERE idUsuario=:idUsuario AND fechaFin IS NULL ORDER BY idPartida DESC LIMIT 1"); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); return $consulta->fetch(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al buscar la partida en curso.", 'error_tecnico' => $error->getMessage() ]; } } public function listarSalasAbiertas() { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT p.idPartida, p.nombrePartida, e.idEquipo, e.nombreEquipo, u.idUsuario, u.nombreUsuario FROM partida p INNER JOIN equipoxpartida exp ON exp.idPartida=p.idPartida INNER JOIN equipo e ON e.idEquipo=exp.idEquipo LEFT JOIN equipoxusuario exu ON exu.idEquipo=e.idEquipo LEFT JOIN usuario u ON u.idUsuario=exu.idUsuario WHERE p.fechaInicio IS NULL AND p.fechaFin IS NULL ORDER BY p.idPartida DESC, e.idEquipo ASC"); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al recuperar las salas abiertas.", 'error_tecnico' => $error->getMessage() ]; } } /** * Devuelve las preguntas asignadas a la partida, junto con el * idPartidaxPregunta (necesario para guardar respuestas después). */ public function getPreguntas(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT pxp.idPartidaxPregunta, p.* FROM partidaxpregunta pxp INNER JOIN pregunta p ON pxp.idPregunta=p.idPregunta WHERE pxp.idPartida=:idPartida ORDER BY pxp.idPartidaxPregunta"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al recuperar las preguntas de la partida.", 'error_tecnico' => $error->getMessage() ]; } } public function asignarPregunta($idPregunta) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("INSERT INTO partidaxpregunta (idPartida,idPregunta) VALUES (:idPartida,:idPregunta)"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPregunta", $idPregunta); $consulta->execute(); return [ "exito" => "La pregunta se asignó correctamente.", "exito_tecnico" => $conexion->lastInsertId() ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al asignar la pregunta.", 'error_tecnico' => $error->getMessage() ]; } } //Cuenta cuántas preguntas tiene la partida en total. Es la primera mitad de la comprobación "¿ha terminado el usuario de jugar?". public function contarPreguntasAsignadas() { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM partidaxpregunta WHERE idPartida=:idPartida"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); $fila = $consulta->fetch(PDO::FETCH_ASSOC); return (int)$fila["total"]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al contar las preguntas.", 'error_tecnico' => $error->getMessage() ]; } } public function contarRespuestasUsuario($idUsuario){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM respuestaalmacenada ra INNER JOIN partidaxpregunta pxp ON ra.idPartidaxPregunta=pxp.idPartidaxPregunta WHERE pxp.idPartida=:idPartida AND ra.idUsuario=:idUsuario"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idUsuario", $idUsuario); $consulta->execute(); $fila = $consulta->fetch(PDO::FETCH_ASSOC); return (int)$fila["total"]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al contar las respuestas del usuario.", 'error_tecnico' => $error->getMessage() ]; } } /** * Indica si ESTE usuario ya ha respondido todas las preguntas: * compara cuántas preguntas tiene la partida contra cuántas ha * respondido él. (La partida completa se marca con finalizar().) */ public function estaFinalizadaParaUsuario($idUsuario){ $totalPreguntas = $this->contarPreguntasAsignadas(); if (is_array($totalPreguntas)) { return $totalPreguntas; } $totalRespondidas = $this->contarRespuestasUsuario($idUsuario); if (is_array($totalRespondidas)) { return $totalRespondidas; } return $totalPreguntas > 0 && $totalPreguntas === $totalRespondidas; } /** * Partidas creadas por un usuario, de más reciente a más antigua. */ public function listarDelUsuario(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT * FROM partida WHERE idUsuario=:idUsuario ORDER BY idPartida DESC"); $consulta->bindParam(":idUsuario", $this->idUsuario); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al recuperar las partidas del usuario.", 'error_tecnico' => $error->getMessage() ]; } } public function preguntaAsignada($idPregunta) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT COUNT(*) AS total FROM partidaxpregunta WHERE idPartida=:idPartida AND idPregunta=:idPregunta"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idPregunta", $idPregunta); $consulta->execute(); $fila = $consulta->fetch(PDO::FETCH_ASSOC); return (int)$fila["total"] > 0; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al comprobar la pregunta.", 'error_tecnico' => $error->getMessage() ]; } } /** * Vincula un equipo a esta partida en la tabla intermedia 'equipoxpartida'. * Permite registrar qué grupos están participando en este torneo. */ public function registrarEquipoEnPartida($idEquipo){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("INSERT INTO equipoxpartida (idPartida, idEquipo) VALUES (:idPartida, :idEquipo)"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->bindParam(":idEquipo", $idEquipo); $consulta->execute(); return [ "exito" => "El equipo se vinculó a la partida correctamente.", "exito_tecnico" => $conexion->lastInsertId() ]; } catch (PDOException $error) { return [ "error" => "Ocurrió un error al asignar el equipo a la partida.", "error_tecnico" => $error->getMessage() ]; } } /** * Obtiene todos los equipos que están compitiendo en esta partida. * Es útil para mostrar la lista de rivales antes de empezar a responder. */ public function getEquiposParticipantes(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT exp.idEquipoxPartida, e.idEquipo, e.nombreEquipo FROM equipoxpartida exp INNER JOIN equipo e ON exp.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida ORDER BY e.nombreEquipo ASC"); $consulta->bindParam(":idPartida", $this->idPartida); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); // Devuelve el array con los equipos rivales } catch (PDOException $error) { return [ "error" => "Ocurrió un error al recuperar los equipos de la partida.", "error_tecnico" => $error->getMessage() ]; } } /** * Obtiene todos los jugadores reales (Usuarios) que están jugando en esta partida. * Utiliza la tabla 'equipoxusuario' en SQL para cruzar los datos. */ public function getJugadoresDeLaPartida(){ $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $consulta = $conexion->prepare("SELECT DISTINCT u.idUsuario, u.nombreUsuario, u.email, e.idEquipo, e.nombreEquipo FROM equipoxpartida exp INNER JOIN equipoxusuario exu ON exp.idEquipo = exu.idEquipo INNER JOIN usuario u ON exu.idUsuario = u.idUsuario INNER JOIN equipo e ON exu.idEquipo = e.idEquipo WHERE exp.idPartida = :idPartida ORDER BY e.nombreEquipo ASC, u.nombreUsuario ASC"); $consulta->bindParam( ":idPartida", $this->idPartida ); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ "error" => "Ocurrió un error al obtener la lista de jugadores.", "error_tecnico" => $error->getMessage() ]; } } }