import 'package:flutter_test/flutter_test.dart';
import 'package:farolero/modelos/gamificacion_usuario.dart';
import 'package:farolero/modelos/usuario.dart';
import 'package:farolero/servicios/servicio_perfil_usuario.dart';

void main() {
  group('EstadisticasPerfilUsuario', () {
    test('sube fuego con rendimientos decrecientes y tope diario', () {
      var stats = const EstadisticasPerfilUsuario();
      final fecha = DateTime(2026, 5, 9);

      for (var i = 0; i < 20; i++) {
        stats = stats.registrarPartida(victoria: false, fecha: fecha);
      }

      expect(stats.fuego, 25);
      expect(stats.subidaFuegoHoy, 25);
      expect(stats.partidasHoy, 20);
    });

    test('permite descansar un dia sin penalizar y penaliza dias extra', () {
      final inicial = EstadisticasPerfilUsuario(
        fuego: 50,
        fechaUltimaPartidaIso: DateTime(2026, 5, 1).toIso8601String(),
      );

      final unDiaDespues = inicial.registrarPartida(
        victoria: false,
        fecha: DateTime(2026, 5, 2),
      );
      final tresDiasDespues = inicial.registrarPartida(
        victoria: false,
        fecha: DateTime(2026, 5, 4),
      );

      expect(unDiaDespues.fuego, 56);
      expect(tresDiasDespues.fuego, 48);
    });

    test('calcula medallas principales sin usar llama para partidas jugadas', () {
      final stats = const EstadisticasPerfilUsuario(
        partidasJugadas: 10,
        partidasGanadas: 1,
        fuego: 20,
      );

      expect(stats.medallas, contains('habitual'));
      expect(stats.medallas, contains('brasa'));
      expect(stats.medallas, isNot(contains('llama_suave')));
      expect(stats.medallasPrincipales, contains('habitual'));
    });
  });

  test('Usuario serializa fuego y medallas', () {
    final usuario = Usuario(
      id: 'u1',
      nombre: 'León',
      fuego: 42,
      medallas: const ['brasa', 'habitual'],
    );

    final restaurado = Usuario.fromJson(usuario.toJson());

    expect(restaurado.nombre, 'León');
    expect(restaurado.fuego, 42);
    expect(restaurado.medallas, ['brasa', 'habitual']);
  });

  test('los avatares de capibara están disponibles en el perfil', () {
    expect(
      ServicioPerfilUsuario.avatares,
      contains('assets/avatars/avatar_79.png'),
    );
    expect(
      ServicioPerfilUsuario.avatares,
      contains('assets/avatars/avatar_84.png'),
    );
  });
}
