// 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: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) {
    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);
  }
}
