import 'package:farolero/modelos/jugador.dart';
import 'package:farolero/modelos/partida.dart';
import 'package:farolero/modelos/snapshot_partida_online.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  test('serializa resultado online preservando acentos y caracteres especiales',
      () {
    final partida = Partida(
      config: const ConfigPartida(categoria: 'animales'),
      jugadores: [
        Jugador(id: 'j1', nombre: 'León', esImpostor: true, eliminado: true),
        Jugador(id: 'j2', nombre: 'María'),
        Jugador(id: 'j3', nombre: 'Óscar'),
      ],
      palabraSecreta: 'Camión',
      categoriaReal: 'Animales fantásticos',
      fase: FaseJuego.resultado,
      historialVotaciones: const [
        ResultadoVotacion(
          eliminadoId: 'j1',
          eliminadoNombre: 'León',
          eraImpostor: true,
          votos: {'j2': 'j1', 'j3': 'j1'},
        ),
      ],
    );

    final snapshot = SnapshotPartidaOnline.desdePartida(
      partida,
      roomId: 'sala-áéíóú',
      revelarPalabra: true,
      revelarImpostores: true,
    );

    final reparsed = SnapshotPartidaOnline.fromJson(snapshot.toJson());

    expect(reparsed.roomId, 'sala-áéíóú');
    expect(reparsed.categoria, 'Animales fantásticos');
    expect(reparsed.palabraSecreta, 'Camión');
    expect(reparsed.jugadores.map((jugador) => jugador.nombre), [
      'León',
      'María',
      'Óscar',
    ]);
    expect(reparsed.resultadoActual?.eliminadoNombre, 'León');
    expect(reparsed.historialVotaciones.single.votos, {'j2': 'j1', 'j3': 'j1'});
    expect(reparsed.impostores, ['León']);
  });

  test('no revela palabra ni impostores salvo que el host lo indique', () {
    final partida = Partida(
      config: const ConfigPartida(categoria: 'lugares'),
      jugadores: [
        Jugador(id: 'j1', nombre: 'Ana', esImpostor: true),
        Jugador(id: 'j2', nombre: 'Beto'),
        Jugador(id: 'j3', nombre: 'Carla'),
      ],
      palabraSecreta: 'Biblioteca',
      categoriaReal: 'Lugares',
      fase: FaseJuego.debate,
    );

    final datos = SnapshotPartidaOnline.desdePartida(partida).toJson();

    expect(datos.containsKey('palabraSecreta'), isFalse);
    expect(datos.containsKey('impostores'), isFalse);
    expect(datos['jugadoresTodos'], hasLength(3));
  });
}
