// Copyright (c) 2020, 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/services/correction/fix/data_driven/change.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';

/// An object that can select a single list of changes from among one or more
/// possible lists.
abstract class ChangesSelector {
  /// Return the list of changes that should be applied based on the [context].
  List<Change>? getChanges(TemplateContext context);
}

/// A changes selector that uses boolean-valued conditions to select the list.
class ConditionalChangesSelector implements ChangesSelector {
  /// A table mapping the expressions to be evaluated to the changes that those
  /// conditions select.
  final Map<Expression, List<Change>> changeMap;

  /// Initialize a newly created conditional changes selector with the changes
  /// in the [changeMap].
  ConditionalChangesSelector(this.changeMap);

  @override
  List<Change>? getChanges(TemplateContext context) {
    for (var entry in changeMap.entries) {
      var value = entry.key.evaluateIn(context);
      if (value is bool && value) {
        return entry.value;
      }
    }
    return null;
  }
}

/// A changes selector that has a single, unconditional list of changes.
class UnconditionalChangesSelector implements ChangesSelector {
  /// The list of changes to be returned.
  final List<Change> changes;

  /// Initialize a newly created changes selector to return the given list of
  /// [changes].
  UnconditionalChangesSelector(this.changes);

  @override
  List<Change> getChanges(TemplateContext context) {
    return changes;
  }
}
