// Copyright (c) 2016, 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 'package:path/path.dart' as p;

import 'async_package_resolver.dart';
import 'package_resolver.dart';
import 'sync_package_resolver.dart';
import 'utils.dart';

/// A package resolution strategy based on a package root URI.
class PackageRootResolver implements SyncPackageResolver {
  final packageConfigMap = null;
  final packageConfigUri = null;

  final Uri packageRoot;

  PackageResolver get asAsync => new AsyncPackageResolver(this);

  String get processArgument => "--package-root=$packageRoot";

  PackageRootResolver(packageRoot)
      : packageRoot = ensureTrailingSlash(asUri(packageRoot, "packageRoot"));

  Uri resolveUri(packageUri) {
    packageUri = asPackageUri(packageUri, "packageUri");

    // Following [Isolate.resolvePackageUri], "package:foo" resolves to null.
    if (packageUri.pathSegments.length == 1) return null;
    return packageRoot.resolve(packageUri.path);
  }

  Uri urlFor(String package, [String path]) {
    var result = packageRoot.resolve("$package/");
    return path == null ? result : result.resolve(path);
  }

  Uri packageUriFor(url) {
    var packageRootString = packageRoot.toString();
    url = asUri(url, "url").toString();
    if (!p.url.isWithin(packageRootString, url)) return null;

    var relative = p.url.relative(url, from: packageRootString);
    if (!relative.contains("/")) relative += "/";
    return Uri.parse("package:$relative");
  }

  String packagePath(String package) =>
      packagePathForRoot(package, packageRoot);
}
