import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:ocideck/models/slide.dart';
import 'package:ocideck/widgets/slides/slide_preview.dart';

Widget _host(Slide slide) {
  return MaterialApp(
    home: Scaffold(
      body: Center(
        child: SizedBox(
          width: 800,
          height: 450,
          child: SlidePreviewWidget(slide: slide),
        ),
      ),
    ),
  );
}

void main() {
  testWidgets('two-bullet columns render their optional headings', (
    tester,
  ) async {
    final slide = Slide.create(SlideType.twoBullets).copyWith(
      title: 'Vergelijking',
      columnTitle1: 'Voordelen',
      columnTitle2: 'Nadelen',
      bullets: const ['Snel', 'Goedkoop'],
      bullets2: const ['Complex'],
    );

    await tester.pumpWidget(_host(slide));
    await tester.pump();

    expect(find.text('Voordelen'), findsOneWidget);
    expect(find.text('Nadelen'), findsOneWidget);
    // Heading sits above the bullets of its column.
    final headingTop = tester.getTopLeft(find.text('Voordelen')).dy;
    final bulletTop = tester.getTopLeft(find.text('Snel')).dy;
    expect(headingTop, lessThan(bulletTop));
    expect(tester.takeException(), isNull);
  });

  testWidgets('two-bullet columns without headings render no heading text', (
    tester,
  ) async {
    final slide = Slide.create(SlideType.twoBullets).copyWith(
      title: 'Geen koppen',
      bullets: const ['Links'],
      bullets2: const ['Rechts'],
    );

    await tester.pumpWidget(_host(slide));
    await tester.pump();

    expect(find.text('Links'), findsOneWidget);
    expect(find.text('Rechts'), findsOneWidget);
    expect(tester.takeException(), isNull);
  });

  testWidgets('bullets slide renders an optional subheading below the title', (
    tester,
  ) async {
    final slide = Slide.create(SlideType.bullets).copyWith(
      title: 'Agenda',
      subtitle: 'Vandaag',
      bullets: const ['Punt een', 'Punt twee'],
    );

    await tester.pumpWidget(_host(slide));
    await tester.pump();

    expect(find.text('Agenda'), findsOneWidget);
    expect(find.text('Vandaag'), findsOneWidget);
    final titleTop = tester.getTopLeft(find.text('Agenda')).dy;
    final subTop = tester.getTopLeft(find.text('Vandaag')).dy;
    final bulletTop = tester.getTopLeft(find.text('Punt een')).dy;
    expect(titleTop, lessThan(subTop));
    expect(subTop, lessThan(bulletTop));
    expect(tester.takeException(), isNull);
  });
}
