import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:tane/app.dart';
import 'package:tane/i18n/strings.g.dart';
import 'package:tane/ui/intro_screen.dart';

import '../support/test_support.dart';

void main() {
  Widget standalone(VoidCallback onDone) => TranslationProvider(
    child: MaterialApp(home: IntroScreen(onDone: onDone)),
  );

  testWidgets('carousel advances through slides and finishes', (tester) async {
    LocaleSettings.setLocaleSync(AppLocale.en);
    var done = false;

    await tester.pumpWidget(standalone(() => done = true));
    await tester.pumpAndSettle();

    // First slide + a "Next" button (not "Get started" yet).
    expect(find.text('The seed that brought you here'), findsOneWidget);
    expect(find.text('Next'), findsOneWidget);
    expect(find.text('Get started'), findsNothing);

    // Advance to the last of the five slides.
    for (var i = 0; i < 4; i++) {
      await tester.tap(find.text('Next'));
      await tester.pumpAndSettle();
    }

    expect(find.text('To sow is to multiply'), findsOneWidget);
    expect(find.text('Get started'), findsOneWidget);

    await tester.tap(find.text('Get started'));
    await tester.pumpAndSettle();
    expect(done, isTrue);
  });

  testWidgets('Skip finishes immediately', (tester) async {
    LocaleSettings.setLocaleSync(AppLocale.en);
    var done = false;

    await tester.pumpWidget(standalone(() => done = true));
    await tester.pumpAndSettle();

    await tester.tap(find.text('Skip'));
    await tester.pumpAndSettle();
    expect(done, isTrue);
  });

  testWidgets('first launch opens on the intro and marks it seen', (
    tester,
  ) async {
    LocaleSettings.setLocaleSync(AppLocale.en);
    final db = newTestDatabase();
    addTearDown(db.close);
    final onboarding = newTestOnboardingStore(introSeen: false);

    await tester.pumpWidget(
      TranslationProvider(
        child: TaneApp(
          repository: newTestRepository(db),
          species: newTestSpeciesRepository(db),
          onboarding: onboarding,
          showIntro: true,
        ),
      ),
    );
    await tester.pumpAndSettle();

    // The carousel is shown, not the home menu.
    expect(find.text('The seed that brought you here'), findsOneWidget);

    await tester.tap(find.text('Skip'));
    await tester.pumpAndSettle();

    // Lands on home, and the intro is now remembered as seen.
    expect(find.text('Your inventory'), findsOneWidget);
    expect(await onboarding.introSeen(), isTrue);
    await disposeTree(tester);
  });
}
