// Copyright (c) 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 'dart:convert';
import 'dart:io';

import 'package:path/path.dart' as path;

import 'package:flutter_devicelab/framework/adb.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart';

void main() {
  task(() async {
    final Device device = await devices.workingDevice;
    await device.unlock();
    final Directory appDir = dir(path.join(flutterDirectory.path, 'dev/integration_tests/ui'));
    await inDirectory(appDir, () async {
      final Completer<Null> ready = Completer<Null>();
      print('run: starting...');
      final Process run = await startProcess(
        path.join(flutterDirectory.path, 'bin', 'flutter'),
        <String>['--suppress-analytics', 'run', '--release', '-d', device.deviceId, 'lib/main.dart'],
        isBot: false, // we just want to test the output, not have any debugging info
      );
      final List<String> stdout = <String>[];
      final List<String> stderr = <String>[];
      int runExitCode;
      run.stdout
        .transform(utf8.decoder)
        .transform(const LineSplitter())
        .listen((String line) {
          print('run:stdout: $line');
          stdout.add(line);
          if (line.contains('To quit, press "q".'))
            ready.complete();
        });
      run.stderr
        .transform(utf8.decoder)
        .transform(const LineSplitter())
        .listen((String line) {
          print('run:stderr: $line');
          stdout.add(line);
        });
      run.exitCode.then((int exitCode) { runExitCode = exitCode; });
      await Future.any<dynamic>(<Future<dynamic>>[ ready.future, run.exitCode ]);
      if (runExitCode != null)
        throw 'Failed to run test app; runner unexpected exited, with exit code $runExitCode.';
      run.stdin.write('q');
      await run.exitCode;
      if (stderr.isNotEmpty)
        throw 'flutter run --release had output on standard error.';
      if (stdout.first.startsWith('Building flutter tool...'))
        stdout.removeAt(0);
      if (stdout.first.startsWith('Running "flutter packages get" in ui...'))
        stdout.removeAt(0);
      if (stdout.first.startsWith('Initializing gradle...'))
        stdout.removeAt(0);
      if (stdout.first.startsWith('Resolving dependencies...'))
        stdout.removeAt(0);
      if (!(stdout.first.startsWith('Launching lib/main.dart on ') && stdout.first.endsWith(' in release mode...')))
        throw 'flutter run --release had unexpected first line: ${stdout.first}';
      stdout.removeAt(0);
      if (!stdout.first.startsWith('Gradle task \'assembleRelease\'...'))
        throw 'flutter run --release had unexpected second line: ${stdout.first}';
      stdout.removeAt(0);
      if (!(stdout.first.startsWith('Built build/app/outputs/apk/release/app-release.apk (') && stdout.first.endsWith('MB).')))
        throw 'flutter run --release had unexpected third line: ${stdout.first}';
      stdout.removeAt(0);
      if (stdout.first.startsWith('Installing build/app/outputs/apk/app.apk...'))
        stdout.removeAt(0);
      if (stdout.join('\n') != '\nTo quit, press "q".\n\nApplication finished.') {
        throw 'flutter run --release had unexpected output after third line:\n'
            '${stdout.join('\n')}';
      }
    });
    return TaskResult.success(null);
  });
}
