# Class GestorPartidas

java.lang.Object
Controlador.GestorPartidas

public class GestorPartidas extends Object
Controlador responsable de gestionar el ciclo de vida de las partidas.

Coordina la creación, pausa, reanudación y finalización de partidas, delegando la persistencia en `GestorPersistencia`.

Version:
  1.2
Author:
  JP-Aceves, Adrián

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `private static int`
  `contadorId`
  Contador global de partidas creadas.
  `private ArrayList<Partida>`
  `listaPartidas`
  Historial de partidas finalizadas durante esta ejecución.
  `private Partida`
  `partidaActual`
  Partida que se está jugando en este momento.
  `private GestorPersistencia`
  `persistencia`
  Capa de persistencia para guardar y recuperar partidas pausadas.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `GestorPartidas(GestorPersistencia persistencia)`
  Construye el gestor con la implementación de persistencia indicada e inicializa el contador de ids leyendo los ficheros existentes en disco.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `String`
  `cargarDatosPartida(int id)`
  Carga el estado serializado de una partida pausada a partir de su id.
  `void`
  `finalizarPartida()`
  Finaliza la partida actual, la añade al historial y elimina su fichero de pausa.
  `ArrayList<Partida>`
  `getListaPartidas()`
  Devuelve el historial completo de partidas finalizadas en esta sesión.
  `Partida`
  `getPartidaActual()`
  Devuelve la partida que se está jugando en este momento.
  `ArrayList<Partida>`
  `getPartidasUsuario(Usuario usuario)`
  Filtra el historial devolviendo solo las partidas en las que participó el usuario.
  `ArrayList<String[]>`
  `getResumenPartidasPausadas()`
  Devuelve un resumen legible de todas las partidas pausadas en disco.
  `private void`
  `inicializarContador()`
  Lee los ids de las partidas pausadas en disco y fija `contadorId` al valor máximo encontrado.
  `Partida`
  `iniciarPartida(Juego juego, ArrayList<Usuario> jugadores)`
  Inicializa el juego y crea una nueva partida con los jugadores indicados.
  `ArrayList<Integer>`
  `listarPartidasPausadas()`
  Devuelve los identificadores de las partidas pausadas almacenadas en disco.
  `ArrayList<Integer>`
  `listarPartidasUsuario(String username)`
  Devuelve solo los ids de partidas pausadas en las que participó `username`.
  `void`
  `pausarPartida()`
  Pausa la partida actual y guarda su estado serializado en disco.
  `Partida`
  `reanudarPartida(int id, String datosCompletos, Juego juego, ArrayList<Usuario> jugadores)`
  Reconstruye y reanuda una partida pausada a partir de los datos cargados de disco.

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### contadorId

    private static int contadorId
    Contador global de partidas creadas. Se inicializa leyendo los ficheros existentes en disco para evitar colisiones de id entre ejecuciones.

  - ### partidaActual

    private Partida partidaActual
    Partida que se está jugando en este momento. `null` si no hay ninguna activa.

  - ### listaPartidas

    private ArrayList<Partida> listaPartidas
    Historial de partidas finalizadas durante esta ejecución.

  - ### persistencia

    private GestorPersistencia persistencia
    Capa de persistencia para guardar y recuperar partidas pausadas.

- ## Constructor Details

  - ### GestorPartidas

    public GestorPartidas(GestorPersistencia persistencia)
    Construye el gestor con la implementación de persistencia indicada e inicializa el contador de ids leyendo los ficheros existentes en disco.
    Parameters:
      `persistencia` - implementación de `GestorPersistencia` a usar

- ## Method Details

  - ### inicializarContador

    private void inicializarContador()
    Lee los ids de las partidas pausadas en disco y fija `contadorId` al valor máximo encontrado. Así cada nueva partida recibe un id único aunque la aplicación se haya reiniciado entre sesiones.

  - ### iniciarPartida

    public Partida iniciarPartida(Juego juego, ArrayList<Usuario> jugadores)
    Inicializa el juego y crea una nueva partida con los jugadores indicados. El id se asigna incrementando `contadorId`, garantizando unicidad entre ejecuciones.
    Parameters:
      `juego` - juego que se va a jugar
      `jugadores` - lista de usuarios que participan
    Returns:
      la `Partida` recién creada

  - ### pausarPartida

    public void pausarPartida()
    Pausa la partida actual y guarda su estado serializado en disco. No hace nada si no hay ninguna partida activa.

  - ### reanudarPartida

    public Partida reanudarPartida(int id, String datosCompletos, Juego juego, ArrayList<Usuario> jugadores)
    Reconstruye y reanuda una partida pausada a partir de los datos cargados de disco. El parámetro `datosCompletos` tiene el formato `"nombreJuego|estadoSerializado"` tal como lo guarda `pausarPartida()`. Para PasaPalabra se llama a `juego.inicializar()` antes de deserializar, porque necesita cargar el rosco desde fichero antes de restaurar los estados.
    Parameters:
      `id` - id de la partida pausada (se reutiliza para la nueva Partida)
      `datosCompletos` - string leído del fichero: "nombreJuego|estadoSerializado"
      `juego` - instancia del juego ya creada con `GestorJuegos.crearJuego()`
      `jugadores` - lista de jugadores que participarán
    Returns:
      la `Partida` ya activa y lista para jugar

  - ### finalizarPartida

    public void finalizarPartida()
    Finaliza la partida actual, la añade al historial y elimina su fichero de pausa. No hace nada si no hay ninguna partida activa.

  - ### listarPartidasPausadas

    public ArrayList<Integer> listarPartidasPausadas()
    Devuelve los identificadores de las partidas pausadas almacenadas en disco.
    Returns:
      lista de ids como `Integer`

  - ### listarPartidasUsuario

    public ArrayList<Integer> listarPartidasUsuario(String username)
    Devuelve solo los ids de partidas pausadas en las que participó `username`. Lee cada fichero y comprueba el campo de jugadores del formato `"nombreJuego|user1,user2|estado"`.

  - ### cargarDatosPartida

    public String cargarDatosPartida(int id)
    Carga el estado serializado de una partida pausada a partir de su id.
    Parameters:
      `id` - identificador de la partida
    Returns:
      string con el estado serializado, o `null` si no existe

  - ### getPartidaActual

    public Partida getPartidaActual()
    Devuelve la partida que se está jugando en este momento.
    Returns:
      `Partida` actual, o `null` si no hay ninguna activa

  - ### getPartidasUsuario

    public ArrayList<Partida> getPartidasUsuario(Usuario usuario)
    Filtra el historial devolviendo solo las partidas en las que participó el usuario.
    Parameters:
      `usuario` - usuario por el que filtrar
    Returns:
      lista de `Partida` que contienen al usuario

  - ### getListaPartidas

    public ArrayList<Partida> getListaPartidas()
    Devuelve el historial completo de partidas finalizadas en esta sesión. Usado por `VentanaAdmin` para mostrar el listado de partidas.
    Returns:
      lista de `Partida` finalizadas

  - ### getResumenPartidasPausadas

    public ArrayList<String[]> getResumenPartidasPausadas()
    Devuelve un resumen legible de todas las partidas pausadas en disco. Cada entrada del array tiene el formato: `"ID | nombreJuego | jugadores"`. Usado por `VentanaAdmin` para mostrar el listado de partidas pausadas.
    Returns:
      lista de Strings con el resumen de cada partida pausada