// Copyright (c) 2019, 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:analyzer/instrumentation/plugin_data.dart';
import 'package:analyzer/instrumentation/service.dart';

/// An [InstrumentationService] that sends messages to multiple services.
class MulticastInstrumentationService implements InstrumentationService {
  final List<InstrumentationService> _services;

  MulticastInstrumentationService(this._services);

  @override
  void logError(String message) {
    for (var service in _services) {
      service.logError(message);
    }
  }

  @override
  void logException(
    Object exception, [
    StackTrace? stackTrace,
    List<InstrumentationServiceAttachment>? attachments,
  ]) {
    for (var service in _services) {
      service.logException(exception, stackTrace, attachments);
    }
  }

  @override
  void logInfo(String message, [dynamic exception]) {
    for (var service in _services) {
      service.logInfo(message, exception);
    }
  }

  @override
  void logLogEntry(
    String level,
    DateTime time,
    String message,
    Object exception,
    StackTrace stackTrace,
  ) {
    for (var service in _services) {
      service.logLogEntry(level, time, message, exception, stackTrace);
    }
  }

  @override
  void logNotification(String notification) {
    for (var service in _services) {
      service.logNotification(notification);
    }
  }

  @override
  void logPluginError(
    PluginData plugin,
    String code,
    String message,
    String stackTrace,
  ) {
    for (var service in _services) {
      service.logPluginError(plugin, code, message, stackTrace);
    }
  }

  @override
  void logPluginException(
    PluginData plugin,
    Object exception,
    StackTrace? stackTrace,
  ) {
    for (var service in _services) {
      service.logPluginException(plugin, exception, stackTrace);
    }
  }

  @override
  void logPluginNotification(String pluginId, String notification) {
    for (var service in _services) {
      service.logPluginNotification(pluginId, notification);
    }
  }

  @override
  void logPluginRequest(String pluginId, String request) {
    for (var service in _services) {
      service.logPluginRequest(pluginId, request);
    }
  }

  @override
  void logPluginResponse(String pluginId, String response) {
    for (var service in _services) {
      service.logPluginResponse(pluginId, response);
    }
  }

  @override
  void logPluginTimeout(PluginData plugin, String request) {
    for (var service in _services) {
      service.logPluginTimeout(plugin, request);
    }
  }

  @override
  void logRequest(String request) {
    for (var service in _services) {
      service.logRequest(request);
    }
  }

  @override
  void logResponse(String response) {
    for (var service in _services) {
      service.logResponse(response);
    }
  }

  @override
  void logVersion(
    String uuid,
    String clientId,
    String clientVersion,
    String serverVersion,
    String sdkVersion,
  ) {
    for (var service in _services) {
      service.logVersion(
        uuid,
        clientId,
        clientVersion,
        serverVersion,
        sdkVersion,
      );
    }
  }

  @override
  void logWatchEvent(String folderPath, String filePath, String changeType) {
    for (var service in _services) {
      service.logWatchEvent(folderPath, filePath, changeType);
    }
  }

  @override
  Future<void> shutdown() {
    return Future.wait(_services.map((s) => s.shutdown()));
  }
}
