import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart';
import 'package:integration_test/integration_test.dart';

import 'package:fluffychat/main.dart' as app;

import 'users.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('Integration Test', () {
    test('Check server availability', () async {
      final response = await get(Uri.parse('$homeserver/_matrix/static/'));
      expect(response.statusCode, 200);
    }, timeout: const Timeout(Duration(seconds: 10)));
    testWidgets('Test if the app starts', (WidgetTester tester) async {
      app.main();
      await tester.pumpAndSettle();

      await Future.delayed(const Duration(seconds: 10));

      await tester.pumpAndSettle();

      expect(find.text('Connect'), findsOneWidget);
      expect(find.text('Homeserver'), findsOneWidget);

      final input = find.byType(TextField);

      expect(input, findsOneWidget);

      await tester.enterText(input, homeserver);
      await tester.testTextInput.receiveAction(TextInputAction.done);
      await tester.pumpAndSettle();

      // in case registration is allowed
      try {
        await tester.tap(find.text('Login'));
        await tester.pumpAndSettle();
      } catch (e) {
        log('Registration is not allowed. Proceeding with login...');
      }
      await tester.pumpAndSettle();

      final inputs = find.byType(TextField);

      await tester.enterText(inputs.first, Users.alice.name);
      await tester.enterText(inputs.last, Users.alice.password);
      await tester.testTextInput.receiveAction(TextInputAction.done);
    });
  });
}