// Copyright (c) 2014, 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:analyzer_plugin/protocol/protocol_common.dart';

/// An outcome of a condition checking operation.
class RefactoringStatus {
  /// The current severity of this [RefactoringStatus] - the maximum of the
  /// severities of its [entries].
  RefactoringProblemSeverity? _severity;

  /// A list of [RefactoringProblem]s.
  final List<RefactoringProblem> problems = [];

  /// Creates a new OK [RefactoringStatus].
  RefactoringStatus();

  /// Creates a new [RefactoringStatus] with the ERROR severity.
  factory RefactoringStatus.error(String msg, [Location? location]) {
    var status = RefactoringStatus();
    status.addError(msg, location);
    return status;
  }

  /// Creates a new [RefactoringStatus] with the FATAL severity.
  factory RefactoringStatus.fatal(String msg, [Location? location]) {
    var status = RefactoringStatus();
    status.addFatalError(msg, location);
    return status;
  }

  /// Creates a new [RefactoringStatus] with the WARNING severity.
  factory RefactoringStatus.warning(String msg, [Location? location]) {
    var status = RefactoringStatus();
    status.addWarning(msg, location);
    return status;
  }

  /// Returns `true` if the severity is FATAL or ERROR.
  bool get hasError {
    return _severity == RefactoringProblemSeverity.FATAL ||
        _severity == RefactoringProblemSeverity.ERROR;
  }

  /// Returns `true` if the severity is FATAL.
  bool get hasFatalError => _severity == RefactoringProblemSeverity.FATAL;

  /// Returns `true` if the severity is WARNING.
  bool get hasWarning => _severity == RefactoringProblemSeverity.WARNING;

  /// Return `true` if the severity is `OK`.
  bool get isOK => _severity == null;

  /// Returns the message of the [RefactoringProblem] with highest severity;
  /// may be `null` if no problems.
  String? get message {
    final problem = this.problem;
    if (problem == null) {
      return null;
    }
    return problem.message;
  }

  /// Returns the first [RefactoringProblem] with the highest severity.
  ///
  /// Returns `null` if no entries.
  RefactoringProblem? get problem {
    for (var problem in problems) {
      if (problem.severity == _severity) {
        return problem;
      }
    }
    return null;
  }

  /// Returns the current severity of this [RefactoringStatus].
  RefactoringProblemSeverity? get severity => _severity;

  /// Adds an ERROR problem with the given message and location.
  void addError(String msg, [Location? location]) {
    _addProblem(RefactoringProblem(RefactoringProblemSeverity.ERROR, msg,
        location: location));
  }

  /// Adds a FATAL problem with the given message and location.
  void addFatalError(String msg, [Location? location]) {
    _addProblem(RefactoringProblem(RefactoringProblemSeverity.FATAL, msg,
        location: location));
  }

  /// Merges [other] into this [RefactoringStatus].
  ///
  /// The [other]'s entries are added to this.
  ///
  /// The resulting severity is the more severe of this and [other] severities.
  ///
  /// Merging with `null` is allowed - it has no effect.
  void addStatus(RefactoringStatus? other) {
    if (other == null) {
      return;
    }
    problems.addAll(other.problems);
    _severity = RefactoringProblemSeverity.max(_severity, other.severity);
  }

  /// Adds a WARNING problem with the given message and location.
  void addWarning(String msg, [Location? location]) {
    _addProblem(RefactoringProblem(RefactoringProblemSeverity.WARNING, msg,
        location: location));
  }

  @override
  String toString() {
    var sb = StringBuffer();
    sb.write('<');
    var severity = _severity;
    if (severity == null) {
      sb.write('OK');
    } else {
      sb.write(severity.name);
    }
    if (!isOK) {
      sb.write('\n');
      for (var problem in problems) {
        sb.write('\t');
        sb.write(problem);
        sb.write('\n');
      }
    }
    sb.write('>');
    return sb.toString();
  }

  /// Adds the given [RefactoringProblem] and updates [severity].
  void _addProblem(RefactoringProblem problem) {
    problems.add(problem);
    // update maximum severity
    var severity = problem.severity;
    _severity = RefactoringProblemSeverity.max(_severity, severity);
  }
}
