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

library sdk_source;

import 'dart:async';

import '../../pkg/path/lib/path.dart' as path;

import 'io.dart';
import 'package.dart';
import 'pubspec.dart';
import 'sdk.dart' as sdk;
import 'source.dart';
import 'utils.dart';
import 'version.dart';

/// A package source that uses libraries from the Dart SDK.
class SdkSource extends Source {
  final String name = "sdk";
  final bool shouldCache = false;

  /// SDK packages are not individually versioned. Instead, their version is
  /// inferred from the revision number of the SDK itself.
  Future<Pubspec> describe(PackageId id) {
    return defer(() {
      var packageDir = _getPackagePath(id);
      // TODO(rnystrom): What if packageDir is null?
      var pubspec = new Pubspec.load(id.name, packageDir, systemCache.sources);
      // Ignore the pubspec's version, and use the SDK's.
      return new Pubspec(id.name, sdk.version, pubspec.dependencies,
          pubspec.environment);
    });
  }

  /// Since all the SDK files are already available locally, installation just
  /// involves symlinking the SDK library into the packages directory.
  Future<bool> install(PackageId id, String destPath) {
    return defer(() {
      var path = _getPackagePath(id);
      if (path == null) return false;

      return createPackageSymlink(id.name, path, destPath).then((_) => true);
    });
  }

  /// Gets the path in the SDK's "pkg" directory to the directory containing
  /// package [id]. Returns `null` if the package could not be found.
  String _getPackagePath(PackageId id) {
    var pkgPath = path.join(sdk.rootDirectory, "pkg", id.description);
    return dirExists(pkgPath) ? pkgPath : null;
  }
}
