// Copyright (c) 2021, 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:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/services/completion/filtering/fuzzy_matcher.dart';

final _identifierPattern = RegExp(r'([_a-zA-Z][_a-zA-Z0-9]*)');

/// Filters and scores [suggestions] according to how well they match the
/// [pattern]. Sorts [suggestions] by the score, relevance, and name.
List<CompletionSuggestionBuilder> fuzzyFilterSort({
  required String pattern,
  required List<CompletionSuggestionBuilder> suggestions,
}) {
  var matcher = FuzzyMatcher(pattern, matchStyle: MatchStyle.SYMBOL);

  double score(CompletionSuggestionBuilder suggestion) {
    var textToMatch = suggestion.completion;

    if (suggestion.kind == CompletionSuggestionKind.KEYWORD ||
        suggestion.kind == CompletionSuggestionKind.NAMED_ARGUMENT) {
      var identifier = _identifierPattern.matchAsPrefix(textToMatch)?.group(1);
      if (identifier == null) {
        return -1;
      }
      textToMatch = identifier;
    }

    return matcher.score(textToMatch);
  }

  var scored = suggestions
      .map((e) => _FuzzyScoredSuggestion(e, score(e)))
      .where((e) => e.score > 0)
      .toList();

  scored.sort((a, b) {
    // Prefer what the user requested by typing.
    if (a.score > b.score) {
      return -1;
    } else if (a.score < b.score) {
      return 1;
    }

    // Then prefer what is more relevant in the context.
    if (a.suggestion.relevance != b.suggestion.relevance) {
      return b.suggestion.relevance - a.suggestion.relevance;
    }

    // Other things being equal, sort by name.
    return a.suggestion.completion.compareTo(b.suggestion.completion);
  });

  return scored.map((e) => e.suggestion).toList();
}

/// [CompletionSuggestion] scored using [FuzzyMatcher].
class _FuzzyScoredSuggestion {
  final CompletionSuggestionBuilder suggestion;
  final double score;

  _FuzzyScoredSuggestion(this.suggestion, this.score);
}
