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

import '../utils.dart';
import '../validator.dart';

/// A validator that the name of a package is legal and matches the library name
/// in the case of a single library.
class NameValidator extends Validator {
  @override
  Future validate() {
    return Future.sync(() {
      _checkName(entrypoint.root.name);

      var libraries = _libraries(files);

      if (libraries.length == 1) {
        var libName = path.basenameWithoutExtension(libraries[0]);
        if (libName == entrypoint.root.name) return;
        warnings.add('The name of "${libraries[0]}", "$libName", should match '
            'the name of the package, "${entrypoint.root.name}".\n'
            'This helps users know what library to import.');
      }
    });
  }

  /// Returns a list of all libraries in the current package as paths relative
  /// to the package's root directory.
  List<String> _libraries(List<String> files) {
    var libDir = entrypoint.root.path('lib');
    return filesBeneath('lib', recursive: true)
        .map((file) => path.relative(file, from: path.dirname(libDir)))
        .where(
          (file) =>
              !path.split(file).contains('src') &&
              path.extension(file) == '.dart',
        )
        .toList();
  }

  void _checkName(String name) {
    final description = 'Package name "$name"';
    if (name == '') {
      errors.add('$description may not be empty.');
    } else if (!RegExp(r'^[a-zA-Z0-9_]*$').hasMatch(name)) {
      errors.add('$description may only contain letters, numbers, and '
          'underscores.\n'
          'Using a valid Dart identifier makes the name usable in Dart code.');
    } else if (!RegExp(r'^[a-zA-Z_]').hasMatch(name)) {
      errors.add('$description must begin with a letter or underscore.\n'
          'Using a valid Dart identifier makes the name usable in Dart code.');
    } else if (reservedWords.contains(name.toLowerCase())) {
      errors.add('$description may not be a reserved word in Dart.\n'
          'Using a valid Dart identifier makes the name usable in Dart code.');
    } else if (RegExp(r'[A-Z]').hasMatch(name)) {
      warnings.add('$description should be lower-case. Maybe use '
          '"${_unCamelCase(name)}"?');
    }
  }

  String _unCamelCase(String source) {
    var builder = StringBuffer();
    var lastMatchEnd = 0;
    for (var match in RegExp(r'[a-z]([A-Z])').allMatches(source)) {
      builder
        ..write(source.substring(lastMatchEnd, match.start + 1))
        ..write('_')
        ..write(match.group(1)!.toLowerCase());
      lastMatchEnd = match.end;
    }
    builder.write(source.substring(lastMatchEnd));
    return builder.toString().toLowerCase();
  }
}
