// Copyright (c) 2012, 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 'dart:async';

import 'package:path/path.dart' as p;

import '../io.dart';
import '../validator.dart';

/// A validator that validates a package's top-level directories.
class DirectoryValidator extends Validator {
  static final _pluralNames = [
    'benchmarks',
    'docs',
    'examples',
    'tests',
    'tools',
  ];

  static String docRef = 'See https://dart.dev/tools/pub/package-layout.';

  @override
  Future<void> validate() async {
    final visited = <String>{};
    for (final file in files) {
      // Find the topmost directory name of [file].
      final dir = p.join(
        package.dir,
        p.split(p.relative(file, from: package.dir)).first,
      );
      if (!visited.add(dir)) continue;
      if (!dirExists(dir)) continue;

      final dirName = p.basename(dir);
      if (_pluralNames.contains(dirName)) {
        // Cut off the "s"
        var singularName = dirName.substring(0, dirName.length - 1);
        warnings.add('Rename the top-level "$dirName" directory to '
            '"$singularName".\n'
            'The Pub layout convention is to use singular directory '
            'names.\n'
            'Plural names won\'t be correctly identified by Pub and other '
            'tools.\n$docRef');
      }

      if (dirName.contains(RegExp(r'^samples?$'))) {
        warnings.add('Rename the top-level "$dirName" directory to "example".\n'
            'This allows Pub to find your examples and create "packages" '
            'directories for them.\n$docRef');
      }
    }
  }
}
