// Copyright (c) 2017, 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/protocol/protocol.dart';
import 'package:analysis_server/protocol/protocol_constants.dart';
import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/utilities/progress.dart';
import 'package:telemetry/telemetry.dart';

/// Instances of the class [AnalyticsDomainHandler] implement a [RequestHandler]
/// that handles requests in the `analytics` domain.
class AnalyticsDomainHandler implements RequestHandler {
  final AnalysisServer server;

  AnalyticsDomainHandler(this.server);

  Analytics? get analytics => server.analytics;

  String get _clientId => server.options.clientId ?? 'client';

  Response handleEnable(Request request) {
    var params = AnalyticsEnableParams.fromRequest(request);
    final analytics = this.analytics;
    if (analytics != null) {
      analytics.enabled = params.value;
    }
    return AnalyticsEnableResult().toResponse(request.id);
  }

  Response handleIsEnabled(Request request) {
    return AnalyticsIsEnabledResult(analytics?.enabled ?? false)
        .toResponse(request.id);
  }

  @override
  Response? handleRequest(
      Request request, CancellationToken cancellationToken) {
    var requestName = request.method;

    if (requestName == ANALYTICS_REQUEST_IS_ENABLED) {
      return handleIsEnabled(request);
    } else if (requestName == ANALYTICS_REQUEST_ENABLE) {
      return handleEnable(request);
    } else if (requestName == ANALYTICS_REQUEST_SEND_EVENT) {
      return handleSendEvent(request);
    } else if (requestName == ANALYTICS_REQUEST_SEND_TIMING) {
      return handleSendTiming(request);
    }

    return null;
  }

  Response handleSendEvent(Request request) {
    final analytics = this.analytics;
    if (analytics == null) {
      return AnalyticsSendEventResult().toResponse(request.id);
    }

    var params = AnalyticsSendEventParams.fromRequest(request);
    analytics.sendEvent(_clientId, params.action);
    return AnalyticsSendEventResult().toResponse(request.id);
  }

  Response handleSendTiming(Request request) {
    final analytics = this.analytics;
    if (analytics == null) {
      return AnalyticsSendTimingResult().toResponse(request.id);
    }

    var params = AnalyticsSendTimingParams.fromRequest(request);
    analytics.sendTiming(params.event, params.millis, category: _clientId);
    return AnalyticsSendTimingResult().toResponse(request.id);
  }
}
