// Copyright (c) 2018, 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 'dart:async';

import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
import 'package:analysis_server/lsp_protocol/protocol_special.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
import 'package:analysis_server/src/services/correction/sort_members.dart';

class SortMembersCommandHandler extends SimpleEditCommandHandler {
  SortMembersCommandHandler(LspAnalysisServer server) : super(server);

  @override
  String get commandName => 'Sort Members';

  @override
  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
    if (arguments == null || arguments.length != 1 || arguments[0] is! String) {
      return ErrorOr.error(new ResponseError(
        ServerErrorCodes.InvalidCommandArguments,
        '$commandName requires a single String parameter containing the path of a Dart file',
        null,
      ));
    }

    // Get the version of the doc before we calculate edits so we can send it back
    // to the client so that they can discard this edit if the document has been
    // modified since.
    final path = arguments.single;
    final docIdentifier = server.getVersionedDocumentIdentifier(path);

    var driver = server.getAnalysisDriver(path);
    final result = await driver?.parseFile(path);
    if (result == null) {
      return ErrorOr.error(new ResponseError(
        ServerErrorCodes.FileNotAnalyzed,
        '$commandName is only available for analyzed files',
        null,
      ));
    }
    final code = result.content;
    final unit = result.unit;

    if (hasScanParseErrors(result.errors)) {
      return ErrorOr.error(new ResponseError(
        ServerErrorCodes.FileHasErrors,
        'Unable to $commandName because the file contains parse errors',
        path,
      ));
    }

    final sorter = new MemberSorter(code, unit);
    final edits = sorter.sort();
    return await sendSourceEditsToClient(docIdentifier, unit, edits);
  }
}
