// Copyright 2014 The Flutter 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:core';

import 'package:flutter_driver/flutter_driver.dart';
import 'package:fuchsia_remote_debug_protocol/fuchsia_remote_debug_protocol.dart';
import 'package:fuchsia_remote_debug_protocol/logging.dart';

/// Runs through a simple usage of the fuchsia_remote_debug_protocol library:
/// connects to a remote machine at the address in argument 1 (interface
/// optional for argument 2) to drive an application named 'todo_list' by
/// scrolling up and down on the main scaffold.
///
/// Make sure to set up your application (you can change the name from
/// 'todo_list') follows the setup for testing with the flutter driver:
/// https://flutter.dev/testing/#adding-the-flutter_driver-dependency
///
/// Example usage:
///
///     $ dart examples/driver_todo_list_scroll.dart \
///         fe80::8eae:4cff:fef4:9247 eno1
Future<void> main(List<String> args) async {
  // Log only at info level within the library. If issues arise, this can be
  // changed to [LoggingLevel.all] or [LoggingLevel.fine] to see more
  // information.
  Logger.globalLevel = LoggingLevel.info;
  if (args.isEmpty) {
    print('Expects an IP address and/or network interface');
    return;
  }
  final String address = args[0];
  final String interface = args.length > 1 ? args[1] : '';
  // Example ssh config path for the Fuchsia device after having made a local
  // build.
  const String sshConfigPath =
      '../../../fuchsia/out/x64rel/ssh-keys/ssh_config';
  final FuchsiaRemoteConnection connection =
      await FuchsiaRemoteConnection.connect(address, interface, sshConfigPath);

  const Pattern isolatePattern = 'todo_list';
  print('Finding $isolatePattern');
  final List<IsolateRef> refs =
      await connection.getMainIsolatesByPattern(isolatePattern);

  final IsolateRef ref = refs.first;
  print('Driving ${ref.name}');
  final FlutterDriver driver = await FlutterDriver.connect(
      dartVmServiceUrl: ref.dartVm.uri.toString(),
      isolateNumber: ref.number,
      printCommunication: true,
      logCommunicationToFile: false);
  for (int i = 0; i < 5; ++i) {
    // Scrolls down 300px.
    await driver.scroll(find.byType('Scaffold'), 0.0, -300.0,
        const Duration(milliseconds: 300));
    await Future<void>.delayed(const Duration(milliseconds: 500));
    // Scrolls up 300px.
    await driver.scroll(find.byType('Scaffold'), 300.0, 300.0,
        const Duration(milliseconds: 300));
  }
  await driver.close();
  await connection.stop();
}
