// 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 'package:file/file.dart';
import 'package:process/process.dart';

import '../base/common.dart';
import '../base/logger.dart';
import '../base/process.dart';
import 'fuchsia_sdk.dart';

// Usage: ffx [-c <config>] [-e <env>] [-t <target>] [-T <timeout>] [-v] [<command>] [<args>]

// Fuchsia's developer tool

// Options:
//   -c, --config      override default configuration
//   -e, --env         override default environment settings
//   -t, --target      apply operations across single or multiple targets
//   -T, --timeout     override default proxy timeout
//   -v, --verbose     use verbose output
//   --help            display usage information

// Commands:
//   config            View and switch default and user configurations
//   daemon            Interact with/control the ffx daemon
//   target            Interact with a target device or emulator

/// A simple wrapper for the Fuchsia SDK's 'ffx' tool.
class FuchsiaFfx {
  FuchsiaFfx({
    required FuchsiaArtifacts? fuchsiaArtifacts,
    required Logger logger,
    required ProcessManager processManager,
  })  : _fuchsiaArtifacts = fuchsiaArtifacts,
        _logger = logger,
        _processUtils =
            ProcessUtils(logger: logger, processManager: processManager);

  final FuchsiaArtifacts? _fuchsiaArtifacts;
  final Logger _logger;
  final ProcessUtils _processUtils;

  /// Returns a list of attached devices as a list of strings with entries
  /// formatted as follows:
  ///
  /// abcd::abcd:abc:abcd:abcd%qemu scare-cable-skip-joy
  Future<List<String>?> list({Duration? timeout}) async {
    final File? ffx = _fuchsiaArtifacts?.ffx;
    if (ffx == null || !ffx.existsSync()) {
      throwToolExit('Fuchsia ffx tool not found.');
    }
    final List<String> command = <String>[
      ffx.path,
      if (timeout != null)
        ...<String>['-T', '${timeout.inSeconds}'],
      'target',
      'list',
      '--format',
      's'
    ];
    final RunResult result = await _processUtils.run(command);
    if (result.exitCode != 0) {
      _logger.printError('ffx failed: ${result.stderr}');
      return null;
    }
    if (result.stderr.contains('No devices found')) {
      return null;
    }
    return result.stdout.split('\n');
  }

  /// Returns the address of the named device.
  ///
  /// The string [deviceName] should be the name of the device from the
  /// 'list' command, e.g. 'scare-cable-skip-joy'.
  Future<String?> resolve(String deviceName) async {
    final File? ffx = _fuchsiaArtifacts?.ffx;
    if (ffx == null || !ffx.existsSync()) {
      throwToolExit('Fuchsia ffx tool not found.');
    }
    final List<String> command = <String>[
      ffx.path,
      'target',
      'list',
      '--format',
      'a',
      deviceName,
    ];
    final RunResult result = await _processUtils.run(command);
    if (result.exitCode != 0) {
      _logger.printError('ffx failed: ${result.stderr}');
      return null;
    }
    return result.stdout.trim();
  }
}
