// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. 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:convert';
import 'dart:io';

import 'package:dartdev/src/analytics.dart';
import 'package:test/test.dart';

import 'utils.dart';

List<Map> extractAnalytics(ProcessResult result) {
  return LineSplitter.split(result.stderr)
      .where((line) => line.startsWith('[analytics]: '))
      .map((line) => json.decode(line.substring('[analytics]: '.length)) as Map)
      .toList();
}

void main() {
  group('DisabledAnalytics', disabledAnalyticsObject);

  group('Sending analytics', () {
    test('help', () {
      final p = project(logAnalytics: true);
      final result = p.runSync('help', []);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'help'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'help',
            'label': null,
            'value': null
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'help',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });
    test('create', () {
      final p = project(logAnalytics: true);
      final result = p.runSync('create', ['-tpackage-simple', 'name']);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'create'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'create',
            'label': null,
            'value': null,
            'cd1': '0',
            'cd3': ' template ',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'create',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });

    test('pub get', () {
      final p = project(logAnalytics: true);
      final result = p.runSync('pub', ['get', '--dry-run']);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          // TODO(sigurdm): this should be pub/get
          'message': {'viewName': 'pub'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'pub',
            'label': null,
            'value': null,
            'cd1': '0',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'pub',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });

    test('format', () {
      final p = project(logAnalytics: true);
      final result = p.runSync('format', ['-l80']);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'format'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'format',
            'label': null,
            'value': null,
            'cd1': '0',
            'cd3': ' line-length ',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'format',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });

    test('run', () {
      final p = project(
          mainSrc: 'void main(List<String> args) => print(args)',
          logAnalytics: true);
      final result = p.runSync('run', [
        '--no-pause-isolates-on-exit',
        '--enable-asserts',
        'lib/main.dart',
        '--argument'
      ]);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'run'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'run',
            'label': null,
            'value': null,
            'cd1': '0',
            'cd3': ' enable-asserts pause-isolates-on-exit ',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'run',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });

    test('run --enable-experiments', () {
      final p = project(
          mainSrc: 'void main(List<String> args) => print(args)',
          logAnalytics: true);
      final result = p.runSync('--enable-experiment=non-nullable', [
        'run',
        'lib/main.dart',
      ]);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'run'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'run',
            'label': null,
            'value': null,
            'cd1': '0',
            'cd2': ' non-nullable ',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'run',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });

    test('compile', () {
      final p = project(
          mainSrc: 'void main(List<String> args) => print(args);',
          logAnalytics: true);
      final result = p
          .runSync('compile', ['kernel', 'lib/main.dart', '-o', 'main.kernel']);
      expect(extractAnalytics(result), [
        {
          'hitType': 'screenView',
          'message': {'viewName': 'compile/kernel'}
        },
        {
          'hitType': 'event',
          'message': {
            'category': 'dartdev',
            'action': 'compile/kernel',
            'label': null,
            'value': null,
            'cd1': '0',
            'cd3': ' output ',
          }
        },
        {
          'hitType': 'timing',
          'message': {
            'variableName': 'compile/kernel',
            'time': isA<int>(),
            'category': 'commands',
            'label': null
          }
        }
      ]);
    });
  });
}

void disabledAnalyticsObject() {
  test('object', () {
    var diabledAnalytics = DisabledAnalytics('trackingId', 'appName');
    expect(diabledAnalytics.trackingId, 'trackingId');
    expect(diabledAnalytics.applicationName, 'appName');
    expect(diabledAnalytics.enabled, isFalse);
    expect(diabledAnalytics.firstRun, isFalse);
  });
}
