// 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/dart/data_driven.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
import 'package:meta/meta.dart';

/// The data related to an element that has been renamed.
class Rename extends Change<SimpleIdentifier> {
  /// The new name of the element.
  final String newName;

  /// Initialize a newly created transform to describe a renaming of an element
  /// to the [newName].
  Rename({@required this.newName});

  @override
  void apply(DartFileEditBuilder builder, DataDrivenFix fix,
      SimpleIdentifier nameNode) {
    if (fix.element.kind == 'constructor') {
      var parent = nameNode.parent;
      if (parent is ConstructorName) {
        if (nameNode != null && newName.isEmpty) {
          // The constructor was renamed from a named constructor to an unnamed
          // constructor.
          builder.addDeletion(range.startEnd(parent.period, parent));
        } else if (nameNode == null && newName.isNotEmpty) {
          // The constructor was renamed from an unnamed constructor to a named
          // constructor.
          builder.addSimpleInsertion(parent.end, '.$newName');
        } else {
          // The constructor was renamed from a named constructor to another
          // named constructor.
          builder.addSimpleReplacement(range.node(nameNode), newName);
        }
      } else if (parent is MethodInvocation) {
        if (newName.isEmpty) {
          // The constructor was renamed from a named constructor to an unnamed
          // constructor.
          builder.addDeletion(range.startEnd(parent.operator, nameNode));
        } else {
          // The constructor was renamed from a named constructor to another
          // named constructor.
          builder.addSimpleReplacement(range.node(nameNode), newName);
        }
      } else if (parent is TypeName && parent.parent is ConstructorName) {
        // The constructor was renamed from an unnamed constructor to a named
        // constructor.
        builder.addSimpleInsertion(parent.end, '.$newName');
      } else {
        // The constructor was renamed from a named constructor to another named
        // constructor.
        builder.addSimpleReplacement(range.node(nameNode), newName);
      }
    } else {
      // The name is a simple identifier.
      builder.addSimpleReplacement(range.node(nameNode), newName);
    }
  }

  @override
  SimpleIdentifier validate(DataDrivenFix fix) {
    var node = fix.node;
    if (node is SimpleIdentifier) {
      return node;
    } else if (node is ConstructorName) {
      return node.name;
    }
    return null;
  }
}
