// Copyright (c) 2019, 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.

/// Abstractions for the different sources of truth for different packages.

import 'dart:convert';
import 'dart:io';

import 'package:nnbd_migration/src/fantasyland/fantasy_workspace.dart';
import 'package:nnbd_migration/src/utilities/subprocess_launcher.dart';
import 'package:path/path.dart' as path;

/// Return a resolved path including the home directory in place of tilde
/// references.
String resolveTildePath(String originalPath) {
  if (originalPath == null || !originalPath.startsWith('~/')) {
    return originalPath;
  }

  String homeDir;

  if (Platform.isWindows) {
    homeDir = path.absolute(Platform.environment['USERPROFILE']);
  } else {
    homeDir = path.absolute(Platform.environment['HOME']);
  }

  return path.join(homeDir, originalPath.substring(2));
}

/// The pub cache inherited by this process.
final String defaultPubCache =
    Platform.environment['PUB_CACHE'] ?? resolveTildePath('~/.pub-cache');
final String defaultPlaygroundPath =
    Platform.environment['TRIAL_MIGRATION_PLAYGROUND'] ??
        resolveTildePath('~/.nnbd_trial_migration');
Uri get thisSdkUri => Uri.file(thisSdkRepo);

class Playground {
  final String playgroundPath;

  /// If [clean] is true, this will delete the playground.  Otherwise,
  /// if it exists it will assume it is properly constructed.
  Playground(this.playgroundPath, bool clean) {
    Directory playground = Directory(playgroundPath);
    if (clean) {
      if (playground.existsSync()) {
        playground.deleteSync(recursive: true);
      }
    }
    if (!playground.existsSync()) playground.createSync();
  }

  /// Build an environment for subprocesses.
  Map<String, String> get env => {'PUB_CACHE': pubCachePath};

  String get pubCachePath => path.join(playgroundPath, '.pub-cache');
}

/// Returns the path to the SDK repository this script is a part of.
final String thisSdkRepo = () {
  var maybeSdkRepoDir = Platform.script.toFilePath();
  while (maybeSdkRepoDir != path.dirname(maybeSdkRepoDir)) {
    maybeSdkRepoDir = path.dirname(maybeSdkRepoDir);
    if (File(path.join(maybeSdkRepoDir, 'README.dart-sdk')).existsSync()) {
      return maybeSdkRepoDir;
    }
  }
  throw UnsupportedError(
      'Script ${Platform.script} using this library must be within the SDK repository');
}();

/// Abstraction for an unmanaged package.
class ManualPackage extends Package {
  final String _packagePath;
  ManualPackage(this._packagePath) : super(_packagePath);

  @override
  List<String> get migrationPaths => [_packagePath];
}

/// Abstraction for a fantasy-land package.
class FantasyLandPackage extends Package {
  final String name;
  final FantasyWorkspace fantasyLand;

  FantasyLandPackage._(this.name, this.fantasyLand) : super('${name}__flat');

  static Future<FantasyLandPackage> fantasyLandPackageFactory(
      String name, Playground playground) async {
    return FantasyLandPackage._(
        name,
        await buildFantasyLand(
            name, [], path.join(playground.playgroundPath, '${name}__flat')));
  }

  @override
  // TODO(jcollins-g): traverse [fantasyLand.subPackages] and calculate paths to migrate.
  List<String> get migrationPaths => throw UnimplementedError;
}

/// Abstraction for a package fetched via Git.
class GitPackage extends Package {
  final String _clonePath;
  final bool _keepUpdated;
  final String label;
  final Playground _playground;

  GitPackage._(this._clonePath, this._playground, this._keepUpdated,
      {String name, this.label = 'master'})
      : super(name ?? _buildName(_clonePath));

  static Future<GitPackage> gitPackageFactory(
      String clonePath, Playground playground, bool keepUpdated,
      {String name, String label = 'master'}) async {
    GitPackage gitPackage = GitPackage._(clonePath, playground, keepUpdated,
        name: name, label: label);
    await gitPackage._init();
    return gitPackage;
  }

  /// Calculate the "humanish" name of the clone (see `git help clone`).
  static String _buildName(String clonePath) {
    if (Directory(clonePath).existsSync()) {
      // assume we are cloning locally
      return path.basename(clonePath);
    }
    List<String> pathParts = clonePath.split(_pathAndPeriodSplitter);
    int indexOfName = pathParts.lastIndexOf('git') - 1;
    if (indexOfName < 0) {
      throw ArgumentError(
          'GitPackage can not figure out the name for $clonePath, pass it in manually?');
    }
    return pathParts[indexOfName];
  }

  static RegExp _pathAndPeriodSplitter = new RegExp('[\\/.]');

  /// Initialize the package with a shallow clone.  Run only once per
  /// [GitPackage] instance.
  Future<void> _init() async {
    if (_keepUpdated || !await Directory(packagePath).exists()) {
      // Clone or update.
      if (await Directory(packagePath).exists()) {
        await launcher.runStreamed('git', ['pull'],
            workingDirectory: packagePath);
      } else {
        await launcher.runStreamed('git',
            ['clone', '--branch=$label', '--depth=1', _clonePath, packagePath],
            workingDirectory: _playground.playgroundPath);
        await launcher.runStreamed('git', ['checkout', '-b', '_test_migration'],
            workingDirectory: packagePath);
        await launcher.runStreamed(
            'git', ['branch', '--set-upstream-to', 'origin/$label'],
            workingDirectory: packagePath);
        // TODO(jcollins-g): allow for migrating dependencies?
      }
      await pubTracker.runFutureFromClosure(() =>
          launcher.runStreamed('pub', ['get'], workingDirectory: packagePath));
    }
  }

  SubprocessLauncher _launcher;
  SubprocessLauncher get launcher =>
      _launcher ??= SubprocessLauncher('$name-$label', _playground.env);

  String _packagePath;
  String get packagePath =>
      // TODO(jcollins-g): allow packages from subdirectories of clones
      _packagePath ??= path.join(_playground.playgroundPath, '$name-$label');

  @override
  List<String> get migrationPaths => [_packagePath];

  @override
  String toString() {
    return '$_clonePath ($label)' + (_keepUpdated ? ' [synced]' : '');
  }
}

/// Abstraction for a package fetched via pub.
class PubPackage extends Package {
  PubPackage(String name, [String version]) : super(name) {
    throw UnimplementedError();
  }

  @override
  // TODO: implement packagePath
  List<String> get migrationPaths => throw UnimplementedError();
}

/// Abstraction for a package located within pkg or third_party/pkg.
class SdkPackage extends Package {
  /// Where to find packages.  Constructor searches in-order.
  static List<String> _searchPaths = [
    'pkg',
    path.join('third_party', 'pkg'),
  ];

  SdkPackage(String name) : super(name) {
    for (String potentialPath
        in _searchPaths.map((p) => path.join(thisSdkRepo, p, name))) {
      if (Directory(potentialPath).existsSync()) {
        _packagePath = potentialPath;
      }
    }
    if (_packagePath == null)
      throw ArgumentError('Package $name not found in SDK');
  }

  /* late final */ String _packagePath;
  @override
  List<String> get migrationPaths => [_packagePath];

  @override
  String toString() => path.relative(_packagePath, from: thisSdkRepo);
}

/// Base class for pub, github, SDK, or possibly other package sources.
abstract class Package {
  final String name;

  Package(this.name);

  /// Returns the set of directories for this package.
  List<String> get migrationPaths;

  @override
  String toString() => name;
}

/// Abstraction for compiled Dart SDKs (not this repository).
class Sdk {
  /// The root of the compiled SDK.
  /* late final */ String sdkPath;

  Sdk(String sdkPath) {
    this.sdkPath = path.canonicalize(sdkPath);
  }

  /// Returns true if the SDK was built with --nnbd.
  ///
  /// May throw if [sdkPath] is invalid, or there is an error parsing
  /// the libraries.json file.
  bool get isNnbdSdk {
    // TODO(jcollins-g): contact eng-prod for a more foolproof detection method
    String libraries = path.join(sdkPath, 'lib', 'libraries.json');
    var decodedJson = JsonDecoder().convert(File(libraries).readAsStringSync());
    return ((decodedJson['comment:1'] as String).contains('sdk_nnbd'));
  }
}
