// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

class ComparisonResult {
  /// Certainty in a positive match. Values between 0 and 1, where 0 implies
  /// [isMatch] must equal [false], and 1 implies a direct string (or substring)
  /// match.
  ///
  /// This score is:
  ///   a) only relevant during fuzzy matching (it is always 1 or 0 during
  ///      strict matching), and
  ///   b) relative based on our threshold for a given match.
  ///
  /// For example, confidence of 0.1 means something like our Levenshtein
  /// distance threshold for success was <=10 and this comparison had a distance
  /// of 9. It could also mean our threshold was <=50 and this comparison had
  /// distance of 45, or any other similar ratio.
  final double confidence;

  static final ComparisonResult failure = ComparisonResult._failure();

  const ComparisonResult._failure() : confidence = 0;
  const ComparisonResult.strict({bool isMatch}) : confidence = isMatch ? 1 : 0;
  const ComparisonResult.withConfidence(this.confidence);

  factory ComparisonResult.fromAverage(List<ComparisonResult> results) {
    double totalConfidence = 0;
    // Sum the total confidence
    for (var result in results) totalConfidence += result.confidence;
    // Complete average calculation
    return ComparisonResult.withConfidence(totalConfidence / results.length);
  }

  /// All gte-zero confidences indicate a positive comparison.
  bool get isMatch => confidence > 0;

  static ComparisonResult bestResult(
    ComparisonResult result1,
    ComparisonResult result2,
  ) =>
      result1.confidence > result2.confidence ? result1 : result2;

  @override
  String toString() => '<ComparisonResult: $confidence />';
}
