// Copyright (c) 2017, 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';

/// Provides API parity with the `Platform` class in `dart:io`, but using
/// instance properties rather than static properties. This difference enables
/// the use of these APIs in tests, where you can provide mock implementations.
abstract class Platform {
  /// Creates a new [Platform].
  const Platform();

  /// The number of processors of the machine.
  int get numberOfProcessors;

  /// The path separator used by the operating system to separate
  /// components in file paths.
  String get pathSeparator;

  /// A string (`linux`, `macos`, `windows`, `android`, `ios`, or `fuchsia`)
  /// representing the operating system.
  String get operatingSystem;

  /// Get the local hostname for the system.
  String get localHostname;

  /// True if the operating system is Linux.
  bool get isLinux => (operatingSystem == "linux");

  /// True if the operating system is OS X.
  bool get isMacOS => (operatingSystem == "macos");

  /// True if the operating system is Windows.
  bool get isWindows => (operatingSystem == "windows");

  /// True if the operating system is Android.
  bool get isAndroid => (operatingSystem == "android");

  /// True if the operating system is iOS.
  bool get isIOS => (operatingSystem == "ios");

  /// True if the operating system is Fuchsia
  bool get isFuchsia => (operatingSystem == "fuchsia");

  /// The environment for this process.
  ///
  /// The returned environment is an unmodifiable map whose content is
  /// retrieved from the operating system on its first use.
  ///
  /// Environment variables on Windows are case-insensitive. The map
  /// returned on Windows is therefore case-insensitive and will convert
  /// all keys to upper case. On other platforms the returned map is
  /// a standard case-sensitive map.
  Map<String, String> get environment;

  /// The path of the executable used to run the script in this isolate.
  ///
  /// The path returned is the literal path used to run the script. This
  /// path might be relative or just be a name from which the executable
  /// was found by searching the `PATH`.
  ///
  /// To get the absolute path to the resolved executable use
  /// [resolvedExecutable].
  String get executable;

  /// The path of the executable used to run the script in this
  /// isolate after it has been resolved by the OS.
  ///
  /// This is the absolute path, with all symlinks resolved, to the
  /// executable used to run the script.
  String get resolvedExecutable;

  /// The absolute URI of the script being run in this
  /// isolate.
  ///
  /// If the script argument on the command line is relative,
  /// it is resolved to an absolute URI before fetching the script, and
  /// this absolute URI is returned.
  ///
  /// URI resolution only does string manipulation on the script path, and this
  /// may be different from the file system's path resolution behavior. For
  /// example, a symbolic link immediately followed by '..' will not be
  /// looked up.
  ///
  /// If the executable environment does not support [script] an empty
  /// [Uri] is returned.
  Uri get script;

  /// The flags passed to the executable used to run the script in this
  /// isolate. These are the command-line flags between the executable name
  /// and the script name. Each fetch of `executableArguments` returns a new
  /// list containing the flags passed to the executable.
  List<String> get executableArguments;

  /// The value of the `--package-root` flag passed to the executable
  /// used to run the script in this isolate.  This is the directory in which
  /// Dart packages are looked up.
  ///
  /// If there is no `--package-root` flag, `null` is returned.
  String get packageRoot;

  /// The value of the `--packages` flag passed to the executable
  /// used to run the script in this isolate. This is the configuration which
  /// specifies how Dart packages are looked up.
  ///
  /// If there is no `--packages` flag, `null` is returned.
  String get packageConfig;

  /// The version of the current Dart runtime.
  ///
  /// The returned `String` is formatted as the [semver](http://semver.org)
  /// version string of the current dart runtime, possibly followed by
  /// whitespace and other version and build details.
  String get version;

  /// When stdio is connected to a terminal, whether ANSI codes are supported.
  ///
  /// This value is hard-coded to true, except on Windows where only more recent
  /// versions of Windows 10 support the codes.
  bool get ansiSupported;

  /// Returns a JSON-encoded representation of this platform.
  String toJson() {
    return const JsonEncoder.withIndent('  ').convert(<String, dynamic>{
      'numberOfProcessors': numberOfProcessors,
      'pathSeparator': pathSeparator,
      'operatingSystem': operatingSystem,
      'localHostname': localHostname,
      'environment': environment,
      'executable': executable,
      'resolvedExecutable': resolvedExecutable,
      'script': script.toString(),
      'executableArguments': executableArguments,
      'packageRoot': packageRoot,
      'packageConfig': packageConfig,
      'version': version,
      'ansiSupported': ansiSupported,
    });
  }
}
