// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:flutter/services.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import 'package:flutter/widgets.dart';

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart';

void main() {
  group('FirebaseAnalyticsObserver', () {
    FirebaseAnalytics analytics;
    FirebaseAnalyticsObserver observer;
    final List<String> printLog = <String>[];

    void overridePrint(void Function() func) {
      final ZoneSpecification spec =
          ZoneSpecification(print: (_, __, ___, String msg) {
        // Add to log instead of printing to stdout
        printLog.add(msg);
      });
      return Zone.current.fork(specification: spec).run(func);
    }

    setUp(() {
      printLog.clear();
      analytics = MockFirebaseAnalytics();
      observer = FirebaseAnalyticsObserver(analytics: analytics);
      when(analytics.setCurrentScreen(screenName: anyNamed('screenName')))
          .thenAnswer((Invocation invocation) => Future<void>.value());
    });

    test('setCurrentScreen on route pop', () {
      final PageRoute<dynamic> route = MockPageRoute();
      final PageRoute<dynamic> previousRoute = MockPageRoute();
      when(previousRoute.settings)
          .thenReturn(const RouteSettings(name: 'previousRoute'));

      observer.didPop(route, previousRoute);

      verify(analytics.setCurrentScreen(screenName: 'previousRoute')).called(1);
    });

    test('setCurrentScreen on route push', () {
      final PageRoute<dynamic> route = MockPageRoute();
      final PageRoute<dynamic> previousRoute = MockPageRoute();
      when(route.settings).thenReturn(const RouteSettings(name: 'route'));

      observer.didPush(route, previousRoute);

      verify(analytics.setCurrentScreen(screenName: 'route')).called(1);
    });

    test('uses nameExtractor', () {
      observer = FirebaseAnalyticsObserver(
        analytics: analytics,
        nameExtractor: (RouteSettings settings) => 'foo',
      );
      final PageRoute<dynamic> route = MockPageRoute();
      final PageRoute<dynamic> previousRoute = MockPageRoute();

      observer.didPush(route, previousRoute);

      verify(analytics.setCurrentScreen(screenName: 'foo')).called(1);
    });

    test('handles only ${PlatformException}s', () async {
      observer = FirebaseAnalyticsObserver(
        analytics: analytics,
        nameExtractor: (RouteSettings settings) => 'foo',
      );

      final PageRoute<dynamic> route = MockPageRoute();
      final PageRoute<dynamic> previousRoute = MockPageRoute();

      // Throws non-PlatformExceptions
      when(analytics.setCurrentScreen(screenName: anyNamed('screenName')))
          .thenThrow(ArgumentError());

      expect(() => observer.didPush(route, previousRoute), throwsArgumentError);

      // Print PlatformExceptions
      Future<void> throwPlatformException() async =>
          throw PlatformException(code: 'a');

      when(analytics.setCurrentScreen(screenName: anyNamed('screenName')))
          .thenAnswer((Invocation invocation) => throwPlatformException());

      overridePrint(() => observer.didPush(route, previousRoute));

      await pumpEventQueue();
      expect(
        printLog,
        <String>['$FirebaseAnalyticsObserver: ${PlatformException(code: 'a')}'],
      );
    });

    test('runs onError', () async {
      PlatformException passedException;

      final void Function(PlatformException error) handleError =
          (PlatformException error) {
        passedException = error;
      };

      observer = FirebaseAnalyticsObserver(
        analytics: analytics,
        nameExtractor: (RouteSettings settings) => 'foo',
        onError: handleError,
      );

      final PageRoute<dynamic> route = MockPageRoute();
      final PageRoute<dynamic> previousRoute = MockPageRoute();

      final PlatformException thrownException = PlatformException(code: 'b');
      Future<void> throwPlatformException() async => throw thrownException;

      when(analytics.setCurrentScreen(screenName: anyNamed('screenName')))
          .thenAnswer((Invocation invocation) => throwPlatformException());

      observer.didPush(route, previousRoute);

      await pumpEventQueue();
      expect(passedException, thrownException);
    });
  });
}

class MockFirebaseAnalytics extends Mock implements FirebaseAnalytics {}

class MockPageRoute extends Mock implements PageRoute<dynamic> {}
