// Copyright (c) 2020, 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 '../watcher.dart';

/// A factory to produce custom watchers for specific file paths.
class _CustomWatcherFactory {
  final String id;
  final DirectoryWatcher Function(String path, {Duration pollingDelay})
      createDirectoryWatcher;
  final FileWatcher Function(String path, {Duration pollingDelay})
      createFileWatcher;

  _CustomWatcherFactory(
      this.id, this.createDirectoryWatcher, this.createFileWatcher);
}

/// Registers a custom watcher.
///
/// Each custom watcher must have a unique [id] and the same watcher may not be
/// registered more than once.
/// [createDirectoryWatcher] and [createFileWatcher] should return watchers for
/// the file paths they are able to handle. If the custom watcher is not able to
/// handle the path it should reuturn null.
/// The paths handled by each custom watch may not overlap, at most one custom
/// matcher may return a non-null watcher for a given path.
///
/// When a file or directory watcher is created the path is checked against each
/// registered custom watcher, and if exactly one custom watcher is available it
/// will be used instead of the default.
void registerCustomWatcher(
  String id,
  DirectoryWatcher Function(String path, {Duration pollingDelay})
      createDirectoryWatcher,
  FileWatcher Function(String path, {Duration pollingDelay}) createFileWatcher,
) {
  if (_customWatcherFactories.containsKey(id)) {
    throw ArgumentError('A custom watcher with id `$id` '
        'has already been registered');
  }
  _customWatcherFactories[id] = _CustomWatcherFactory(
      id,
      createDirectoryWatcher ?? (_, {pollingDelay}) => null,
      createFileWatcher ?? (_, {pollingDelay}) => null);
}

/// Tries to create a custom [DirectoryWatcher] and returns it.
///
/// Returns `null` if no custom watcher was applicable and throws a [StateError]
/// if more than one was.
DirectoryWatcher createCustomDirectoryWatcher(String path,
    {Duration pollingDelay}) {
  DirectoryWatcher customWatcher;
  String customFactoryId;
  for (var watcherFactory in _customWatcherFactories.values) {
    if (customWatcher != null) {
      throw StateError('Two `CustomWatcherFactory`s applicable: '
          '`$customFactoryId` and `${watcherFactory.id}` for `$path`');
    }
    customWatcher =
        watcherFactory.createDirectoryWatcher(path, pollingDelay: pollingDelay);
    customFactoryId = watcherFactory.id;
  }
  return customWatcher;
}

/// Tries to create a custom [FileWatcher] and returns it.
///
/// Returns `null` if no custom watcher was applicable and throws a [StateError]
/// if more than one was.
FileWatcher createCustomFileWatcher(String path, {Duration pollingDelay}) {
  FileWatcher customWatcher;
  String customFactoryId;
  for (var watcherFactory in _customWatcherFactories.values) {
    if (customWatcher != null) {
      throw StateError('Two `CustomWatcherFactory`s applicable: '
          '`$customFactoryId` and `${watcherFactory.id}` for `$path`');
    }
    customWatcher =
        watcherFactory.createFileWatcher(path, pollingDelay: pollingDelay);
    customFactoryId = watcherFactory.id;
  }
  return customWatcher;
}

final _customWatcherFactories = <String, _CustomWatcherFactory>{};
