// Copyright (c) 2013, 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 descriptor.utils;

import 'dart:io';

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

/// Returns a single filesystem entry within [parent] whose name matches
/// [pattern]. If [pattern] is a string, looks for an exact match; otherwise,
/// looks for an entry that contains [pattern].
///
/// If there are no entries in [parent] matching [pattern], or more than one,
/// this will throw an exception.
///
/// [type] is used for error reporting. It should be capitalized.
String entryMatchingPattern(String type, String parent, Pattern pattern) {
  if (pattern is String) {
    var fullPath = path.join(parent, pattern);
    if (new File(fullPath).existsSync() || new Directory(fullPath).existsSync()) {
      return fullPath;
    }
    throw "$type not found: '$fullPath'.";
  }

  var matchingEntries = new Directory(parent).listSync()
      .map((entry) => entry is File ? entry.fullPathSync() : entry.path)
      .where((entry) => path.basename(entry).contains(pattern))
      .toList();
  matchingEntries.sort();

  if (matchingEntries.length == 0) {
    throw "No entry found in '$parent' matching ${describePattern(pattern)}.";
  } else if (matchingEntries.length > 1) {
    throw "Multiple entries found in '$parent' matching "
          "${describePattern(pattern)}:\n"
      "${matchingEntries.map((entry) => '* $entry').join('\n')}";
  } else {
    return matchingEntries.first;
  }
}

/// Returns a human-readable description of [pattern].
String describePattern(Pattern pattern) {
  if (pattern is String) return "'$pattern'";
  if (pattern is! RegExp) return '$pattern';

  var flags = new StringBuffer();
  if (!pattern.isCaseSensitive) flags.write('i');
  if (pattern.isMultiLine) flags.write('m');
  return '/${pattern.pattern}/$flags';
}
