// 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/src/generated/utilities_general.dart';
import 'package:path/path.dart' as path;

/// Information about the root directory associated with an analysis context.
///
/// Clients may not extend, implement or mix-in this class.
class ContextRoot {
  /// The path context to use when manipulating paths.
  final path.Context pathContext;

  /// The absolute path of the root directory containing the files to be
  /// analyzed.
  final String root;

  /// A list of the absolute paths of files and directories within the root
  /// directory that should not be analyzed.
  final List<String> exclude;

  /// An informative value for the file path that the analysis options were read
  /// from. This value can be `null` if there is no analysis options file or if
  /// the location of the file has not yet been discovered.
  String? optionsFilePath;

  /// Initialize a newly created context root.
  ContextRoot(this.root, this.exclude, {required this.pathContext});

  @override
  int get hashCode {
    int hash = 0;
    hash = JenkinsSmiHash.combine(hash, root.hashCode);
    hash = JenkinsSmiHash.combine(hash, exclude.hashCode);
    return JenkinsSmiHash.finish(hash);
  }

  @override
  bool operator ==(Object other) {
    if (other is ContextRoot) {
      return root == other.root &&
          _listEqual(exclude, other.exclude, (String a, String b) => a == b);
    }
    return false;
  }

  /// Return `true` if the file with the given [filePath] is contained within
  /// this context root. A file contained in a context root if it is within the
  /// context [root] neither explicitly excluded or within one of the excluded
  /// directories.
  bool containsFile(String filePath) {
    if (!pathContext.isWithin(root, filePath)) {
      return false;
    }
    for (String excluded in exclude) {
      if (filePath == excluded || pathContext.isWithin(excluded, filePath)) {
        return false;
      }
    }
    return true;
  }

  /// Compare the lists [listA] and [listB], using [itemEqual] to compare list
  /// elements.
  bool _listEqual<T>(
      List<T>? listA, List<T>? listB, bool Function(T a, T b) itemEqual) {
    if (listA == null) {
      return listB == null;
    }
    if (listB == null) {
      return false;
    }
    if (listA.length != listB.length) {
      return false;
    }
    for (int i = 0; i < listA.length; i++) {
      if (!itemEqual(listA[i], listB[i])) {
        return false;
      }
    }
    return true;
  }
}
