// 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:analysis_server/src/protocol_server.dart' hide Element;
import 'package:analysis_server/src/services/correction/status.dart';
import 'package:analysis_server/src/services/correction/util.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/generated/java_core.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';

/// [InlineLocalRefactoring] implementation.
class InlineLocalRefactoringImpl extends RefactoringImpl
    implements InlineLocalRefactoring {
  final SearchEngine searchEngine;
  final ResolvedUnitResult resolveResult;
  final int offset;
  final CorrectionUtils utils;

  _InitialState? _initialState;

  InlineLocalRefactoringImpl(this.searchEngine, this.resolveResult, this.offset)
      : utils = CorrectionUtils(resolveResult);

  @override
  String get refactoringName => 'Inline Local Variable';

  @override
  int get referenceCount {
    return _initialState?.references.length ?? 0;
  }

  @override
  String? get variableName {
    return _initialState?.element.name;
  }

  @override
  Future<RefactoringStatus> checkFinalConditions() {
    var result = RefactoringStatus();
    return Future.value(result);
  }

  @override
  Future<RefactoringStatus> checkInitialConditions() async {
    // prepare variable
    var offsetNode = NodeLocator(offset).searchWithin(resolveResult.unit);
    if (offsetNode is! SimpleIdentifier) {
      return _noLocalVariableStatus();
    }

    var element = offsetNode.staticElement;
    if (element is! LocalVariableElement) {
      return _noLocalVariableStatus();
    }

    var helper = AnalysisSessionHelper(resolveResult.session);
    var declarationResult = await helper.getElementDeclaration(element);
    var node = declarationResult?.node;
    if (node is! VariableDeclaration) {
      return _noLocalVariableStatus();
    }
    // validate node declaration
    var declarationStatement = _declarationStatement(node);
    if (declarationStatement == null) {
      return _noLocalVariableStatus();
    }
    // should have initializer at declaration
    var initializer = node.initializer;
    if (initializer == null) {
      var message = format(
        "Local variable '{0}' is not initialized at declaration.",
        element.displayName,
      );
      return RefactoringStatus.fatal(
        message,
        newLocation_fromNode(node),
      );
    }
    // prepare references
    var references = await searchEngine.searchReferences(element);
    // should not have assignments
    for (var reference in references) {
      if (reference.kind != MatchKind.READ) {
        var message = format(
          "Local variable '{0}' is assigned more than once.",
          [element.displayName],
        );
        return RefactoringStatus.fatal(
          message,
          newLocation_fromMatch(reference),
        );
      }
    }
    // done
    _initialState = _InitialState(
      element: element,
      node: node,
      initializer: initializer,
      declarationStatement: declarationStatement,
      references: references,
    );
    return RefactoringStatus();
  }

  @override
  Future<SourceChange> createChange() {
    var change = SourceChange(refactoringName);
    var unitElement = resolveResult.unit.declaredElement!;
    var state = _initialState!;
    // remove declaration
    {
      var range = utils.getLinesRangeStatements([(state.declarationStatement)]);
      doSourceChange_addElementEdit(
          change, unitElement, newSourceEdit_range(range, ''));
    }
    // prepare initializer
    var initializer = state.initializer;
    var initializerCode = utils.getNodeText(initializer);
    // replace references
    for (var reference in state.references) {
      var editRange = reference.sourceRange;
      // prepare context
      var offset = editRange.offset;
      var node = utils.findNode(offset)!;
      var parent = node.parent;
      // prepare code
      String codeForReference;
      if (parent is InterpolationExpression) {
        var target = parent.parent;
        if (target is StringInterpolation &&
            initializer is SingleStringLiteral &&
            !initializer.isRaw &&
            initializer.isSingleQuoted == target.isSingleQuoted &&
            (!initializer.isMultiline || target.isMultiline)) {
          editRange = range.node(parent);
          // unwrap the literal being inlined
          var initOffset = initializer.contentsOffset;
          var initLength = initializer.contentsEnd - initOffset;
          codeForReference = utils.getText(initOffset, initLength);
        } else if (_shouldBeExpressionInterpolation(parent, initializer)) {
          codeForReference = '{$initializerCode}';
        } else {
          codeForReference = initializerCode;
        }
      } else if (_shouldUseParenthesis(initializer, node)) {
        codeForReference = '($initializerCode)';
      } else {
        codeForReference = initializerCode;
      }
      // do replace
      doSourceChange_addElementEdit(change, unitElement,
          newSourceEdit_range(editRange, codeForReference));
    }
    // done
    return Future.value(change);
  }

  @override
  bool isAvailable() {
    return !_checkOffset().hasFatalError;
  }

  /// Checks if [offset] is a variable that can be inlined.
  RefactoringStatus _checkOffset() {
    var offsetNode = NodeLocator(offset).searchWithin(resolveResult.unit);
    if (offsetNode is! SimpleIdentifier) {
      return _noLocalVariableStatus();
    }

    var element = offsetNode.staticElement;
    if (element is! LocalVariableElement) {
      return _noLocalVariableStatus();
    }

    return RefactoringStatus();
  }

  RefactoringStatus _noLocalVariableStatus() {
    return RefactoringStatus.fatal(
      'Local variable declaration or reference must be selected '
      'to activate this refactoring.',
    );
  }

  static VariableDeclarationStatement? _declarationStatement(
    VariableDeclaration declaration,
  ) {
    var declarationList = declaration.parent;
    if (declarationList is VariableDeclarationList) {
      var statement = declarationList.parent;
      if (statement is VariableDeclarationStatement) {
        var parent = statement.parent;
        if (parent is Block || parent is SwitchCase) {
          return statement;
        }
      }
    }
    return null;
  }

  static bool _shouldBeExpressionInterpolation(
      InterpolationExpression target, Expression expression) {
    var targetType = target.beginToken.type;
    return targetType == TokenType.STRING_INTERPOLATION_IDENTIFIER &&
        expression is! SimpleIdentifier;
  }

  static bool _shouldUseParenthesis(Expression init, AstNode node) {
    // check precedence
    var initPrecedence = getExpressionPrecedence(init);
    if (initPrecedence < getExpressionParentPrecedence(node)) {
      return true;
    }
    // special case for '-'
    var parent = node.parent;
    if (init is PrefixExpression && parent is PrefixExpression) {
      if (parent.operator.type == TokenType.MINUS) {
        var initializerOperator = init.operator.type;
        if (initializerOperator == TokenType.MINUS ||
            initializerOperator == TokenType.MINUS_MINUS) {
          return true;
        }
      }
    }
    // no () is needed
    return false;
  }
}

class _InitialState {
  final LocalVariableElement element;
  final VariableDeclaration node;
  final Expression initializer;
  final VariableDeclarationStatement declarationStatement;
  final List<SearchMatch> references;

  _InitialState({
    required this.element,
    required this.node,
    required this.initializer,
    required this.declarationStatement,
    required this.references,
  });
}
