import 'package:flutter_test/flutter_test.dart';
import 'package:livekit_client/livekit_client.dart';
import 'package:pyramid/features/voice_channel/livekit_call_manager.dart';

/// Vertragstests für die Streaming-Qualitäts-Presets (M4,
/// `docs/STREAMING_60FPS.md`). Nagelt fest, was `startScreenShare` und das
/// SENDEN-Menü voraussetzen: jede Auflösung hat eine Encoding-Zeile, die
/// 60-FPS-Presets tragen wirklich 60 FPS und genug Bitrate dafür.
/// (Das echte Publish-Verhalten – sender.parameters.encodings im Call –
/// braucht zwei verbundene Clients und bleibt ein Gerätetest.)
void main() {
  test('Jedes Auflösungs-Preset hat genau eine Encoding-Zeile (und umgekehrt)',
      () {
    expect(
      LiveKitCallManager.qualityPresets.keys.toSet(),
      LiveKitCallManager.screenShareEncodings.keys.toSet(),
      reason: 'qualityPresets und screenShareEncodings müssen dieselben '
          'Keys haben – sonst fällt ein Menü-Eintrag auf den Fallback zurück',
    );
  });

  test('60-FPS-Presets: wirklich 60 FPS, hohe Bitrate, richtige Auflösung',
      () {
    for (final key in ['hd60', 'fhd60']) {
      final enc = LiveKitCallManager.screenShareEncodings[key]!;
      expect(enc.maxFramerate, 60, reason: '$key muss 60 FPS tragen');
      expect(enc.maxBitrate, greaterThanOrEqualTo(4_000_000),
          reason: '$key: zu wenig Bitrate für 60 FPS → Encoder ruckelt');
      expect(LiveKitCallManager.isHighFpsPreset(key), isTrue);
    }
    expect(LiveKitCallManager.qualityPresets['hd60']!.dimensions,
        VideoParametersPresets.h720_169.dimensions);
    expect(LiveKitCallManager.qualityPresets['fhd60']!.dimensions,
        VideoParametersPresets.h1080_169.dimensions);
  });

  test('60-FPS-Preset hat mehr Bitrate als sein Standard-Pendant', () {
    final enc = LiveKitCallManager.screenShareEncodings;
    expect(enc['hd60']!.maxBitrate, greaterThan(enc['hd']!.maxBitrate));
    expect(enc['fhd60']!.maxBitrate, greaterThan(enc['fhd']!.maxBitrate));
  });

  test('Bestands-Presets unverändert (kein Verhaltenssprung für Uta)', () {
    final enc = LiveKitCallManager.screenShareEncodings;
    expect(enc['sd'], const VideoEncoding(maxBitrate: 500_000, maxFramerate: 10));
    expect(enc['hd'], const VideoEncoding(maxBitrate: 1_500_000, maxFramerate: 15));
    expect(enc['fhd'], const VideoEncoding(maxBitrate: 2_500_000, maxFramerate: 20));
    expect(enc['4k'], const VideoEncoding(maxBitrate: 4_000_000, maxFramerate: 30));
    for (final key in ['sd', 'hd', 'fhd', '4k']) {
      expect(LiveKitCallManager.isHighFpsPreset(key), isFalse,
          reason: '$key darf NICHT als 60-FPS-Preset behandelt werden '
              '(sonst verliert es Simulcast)');
    }
  });
}
