// Copyright (c) 2022, 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:_fe_analyzer_shared/src/scanner/errors.dart';
import 'package:analysis_server/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/protocol/protocol_internal.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/src/dart/error/syntactic_errors.g.dart';
import 'package:analyzer/src/utilities/cancellation.dart';

/// A request handler for the completion domain.
abstract class CompletionHandler extends LegacyHandler {
  /// Initialize a newly created handler to be able to service requests for the
  /// [server].
  CompletionHandler(super.server, super.request, super.cancellationToken);

  /// Return `true` if completion is disabled and the handler should return. If
  /// `true` is returned then a response will already have been returned, so
  /// subclasses should not return a second response.
  bool get completionIsDisabled {
    if (!server.options.featureSet.completion) {
      sendResponse(Response.invalidParameter(
        request,
        'request',
        'The completion feature is not enabled',
      ));
      return true;
    }
    return false;
  }
}

/// A request handler for the legacy protocol.
abstract class LegacyHandler {
  /// The analysis server that is using this handler to process a request.
  final AnalysisServer server;

  /// The request being handled.
  final Request request;

  /// The token used in order to allow the request to be cancelled. Not all
  /// handlers support cancelling a request.
  final CancellationToken cancellationToken;

  /// Initialize a newly created handler to be able to service requests for the
  /// [server].
  LegacyHandler(this.server, this.request, this.cancellationToken);

  /// Handle the [request].
  Future<void> handle();

  /// Return the number of syntactic errors in the list of [errors].
  int numberOfSyntacticErrors(List<AnalysisError> errors) {
    var numScanParseErrors = 0;
    for (var error in errors) {
      if (error.errorCode is ScannerErrorCode ||
          error.errorCode is ParserErrorCode) {
        numScanParseErrors++;
      }
    }
    return numScanParseErrors;
  }

  /// Send the [response] to the client.
  void sendResponse(Response response) {
    server.sendResponse(response);
  }

  /// Send a response to the client that is associated with the given [request]
  /// and whose body if the given [result].
  void sendResult(ResponseResult result) {
    sendResponse(result.toResponse(request.id));
  }

  /// Send a notification built from the given [params].
  void sendSearchResults(SearchResultsParams params) {
    server.sendNotification(params.toNotification());
  }
}
