// 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';

/// An object used to locate a plugin within a package.
class PluginLocator {
  /// The key used in the `pubspec.yaml` file to specify the location of the
  /// analysis plugin.
  static const String analyzerPluginKey = 'analyzer_plugin';

  /// The name of the default plugin directory, located within the `tools`
  /// directory.
  static const String defaultPluginFolderName = 'analyzer_plugin';

  /// The name of the `pubspec.yaml` file.
  static const String pubspecFileName = 'pubspec.yaml';

  /// The name of the `tools` directory, in which the default plugin directory
  /// is located.
  static const String toolsFolderName = 'tools';

  /// The resource provider used to access the file system.
  final ResourceProvider resourceProvider;

  final Map<String, String?> pluginMap = {};

  /// Initialize a newly created plugin locator to use the given
  /// [resourceProvider] to access the file system.
  PluginLocator(this.resourceProvider);

  /// Given the root directory of a package (the [packageRoot]), return the path
  /// to the plugin associated with the package, or `null` if there is no plugin
  /// associated with the package.
  ///
  /// This will look first in the `pubspec.yaml` file in the package root for a
  /// top-level key (`analysis_plugin`) indicating where the plugin is located.
  /// The value associated with the key is expected to be the path of the plugin
  /// relative to the package root. If the directory exists, the it is returned.
  ///
  /// If the key is not defined in the `pubspec.yaml` file, or if the directory
  /// given does not exist, then this method will look for the directory
  /// `tools/analysis_plugin` relative to the package root. If the directory
  /// exists, then it is returned.
  ///
  /// This method does not validate the content of the plugin directory before
  /// returning it.
  String? findPlugin(String packageRoot) {
    return pluginMap.putIfAbsent(packageRoot, () => _findPlugin(packageRoot));
  }

  /// The implementation of [findPlugin].
  String? _findPlugin(String packageRoot) {
    var packageFolder = resourceProvider.getFolder(packageRoot);
    // TODO(brianwilkerson) Re-enable this after deciding how we want to deal
    // with discovery of plugins.
//    import 'package:yaml/yaml.dart';
//    File pubspecFile = packageFolder.getChildAssumingFile(pubspecFileName);
//    if (pubspecFile.exists) {
//      try {
//        YamlDocument document = loadYamlDocument(pubspecFile.readAsStringSync(),
//            sourceUrl: pubspecFile.toUri());
//        YamlNode contents = document.contents;
//        if (contents is YamlMap) {
//          String pluginPath = contents[analyzerPluginKey];
//          if (pluginPath != null) {
//            Folder pluginFolder =
//                packageFolder.getChildAssumingFolder(pluginPath);
//            if (pluginFolder.exists) {
//              return pluginFolder.path;
//            }
//          }
//        }
//      } catch (exception) {
//        // If we can't read the file, or if it isn't valid YAML, then ignore it.
//      }
//    }
    var pluginFolder = packageFolder
        .getChildAssumingFolder(toolsFolderName)
        .getChildAssumingFolder(defaultPluginFolderName);
    if (pluginFolder.exists) {
      return pluginFolder.path;
    }
    return null;
  }
}
