import 'package:flutter_test/flutter_test.dart';
import 'package:farolero/modelos/inicio_partida_multijugador.dart';

void main() {
  group('InicioPartidaMultijugador', () {
    test('agrupa varios jugadores controlados por el mismo cliente', () {
      final asignaciones = [
        const AsignacionJugador(
          jugadorId: 'ana',
          nombre: 'Ana',
          clientId: 'host',
          endpointId: null,
        ),
        const AsignacionJugador(
          jugadorId: 'juan',
          nombre: 'Juan',
          clientId: 'host',
          endpointId: null,
        ),
        const AsignacionJugador(
          jugadorId: 'sofia',
          nombre: 'Sofía',
          clientId: 'cliente-sofia',
          endpointId: 'endpoint-2',
        ),
      ];
      final impostores = {'juan': true};

      final payloads = InicioPartidaMultijugador.crearPayloadsPorCliente(
        asignaciones: asignaciones,
        palabraSecreta: 'mate',
        categoria: 'objetos',
        impostoresPorJugadorId: impostores,
      );

      expect(payloads['host']?.jugadores.map((j) => j.jugadorId), [
        'ana',
        'juan',
      ]);
      expect(payloads['host']?.jugadores.first.palabra, 'mate');
      expect(payloads['host']?.jugadores.last.esImpostor, isTrue);
      expect(payloads['host']?.jugadores.last.palabra, isNull);
      expect(payloads['cliente-sofia']?.endpointId, 'endpoint-2');
      expect(payloads['cliente-sofia']?.jugadores.single.nombre, 'Sofía');
    });

    test('restaura payload completo desde json', () {
      final payload = InicioPartidaCliente(
        clientId: 'cliente-sofia',
        endpointId: 'endpoint-2',
        categoria: 'todas',
        jugadores: const [
          JugadorInicioPartida(
            jugadorId: 'sofia',
            nombre: 'Sofía',
            esImpostor: false,
            palabra: 'luna',
          ),
          JugadorInicioPartida(
            jugadorId: 'helena',
            nombre: 'Helena',
            esImpostor: true,
            palabra: null,
          ),
        ],
      );

      final restaurado = InicioPartidaCliente.fromJson(payload.toJson());

      expect(restaurado.clientId, 'cliente-sofia');
      expect(restaurado.endpointId, 'endpoint-2');
      expect(restaurado.jugadores.length, 2);
      expect(restaurado.jugadores.first.palabra, 'luna');
      expect(restaurado.jugadores.last.esImpostor, isTrue);
    });
  });
}
