// 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 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/context/builder.dart';
import 'package:analyzer/src/workspace/simple.dart';
import 'package:analyzer/src/workspace/workspace.dart';
import 'package:package_config/packages.dart';

/**
 * Information about a default Dart workspace.
 *
 * A BasicWorkspace should only be used when no other workspace type is valid.
 */
class BasicWorkspace extends SimpleWorkspace {
  /**
   * The singular package in this workspace.
   *
   * Each basic workspace is itself one package.
   */
  BasicWorkspacePackage _theOnlyPackage;

  BasicWorkspace._(
      ResourceProvider provider, String root, ContextBuilder builder)
      : super(provider, root, builder);

  @override
  WorkspacePackage findPackageFor(String filePath) {
    final Folder folder = provider.getFolder(filePath);
    if (provider.pathContext.isWithin(root, folder.path)) {
      _theOnlyPackage ??= new BasicWorkspacePackage(root, this);
      return _theOnlyPackage;
    } else {
      return null;
    }
  }

  /**
   * Find the basic workspace that contains the given [path].
   *
   * As a [BasicWorkspace] is not defined by any marker files or build
   * artifacts, this simply creates a BasicWorkspace with [path] as the [root]
   * (or [path]'s parent if [path] points to a file).
   */
  static BasicWorkspace find(
      ResourceProvider provider, String path, ContextBuilder builder) {
    Resource resource = provider.getResource(path);
    if (resource is File) {
      path = resource.parent.path;
    }
    return new BasicWorkspace._(provider, path, builder);
  }
}

/**
 * Information about a package defined in a [BasicWorkspace].
 *
 * Separate from [Packages] or package maps, this class is designed to simply
 * understand whether arbitrary file paths represent libraries declared within
 * a given package in a [BasicWorkspace].
 */
class BasicWorkspacePackage extends WorkspacePackage {
  final String root;

  final BasicWorkspace workspace;

  BasicWorkspacePackage(this.root, this.workspace);

  @override
  bool contains(String path) {
    // There is a 1-1 relationship between [BasicWorkspace]s and
    // [BasicWorkspacePackage]s. If a file is in a package's workspace, then it
    // is in the package as well.
    return workspace.provider.pathContext.isWithin(root, path);
  }
}
