// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "diagnostics/cros_healthd/cros_healthd_mojo_service.h"

#include <sys/types.h>

#include <utility>

#include <base/check.h>
#include <base/logging.h>

#include "diagnostics/cros_healthd/fetchers/process_fetcher.h"
#include "mojo/cros_healthd_probe.mojom.h"

namespace diagnostics {
namespace mojo_ipc = ::chromeos::cros_healthd::mojom;
namespace network_health_ipc = ::chromeos::network_health::mojom;

CrosHealthdMojoService::CrosHealthdMojoService(
    Context* context,
    FetchAggregator* fetch_aggregator,
    BluetoothEvents* bluetooth_events,
    LidEvents* lid_events,
    PowerEvents* power_events,
    AudioEvents* audio_events,
    UdevEvents* udev_events)
    : context_(context),
      fetch_aggregator_(fetch_aggregator),
      bluetooth_events_(bluetooth_events),
      lid_events_(lid_events),
      power_events_(power_events),
      audio_events_(audio_events),
      udev_events_(udev_events) {
  DCHECK(context_);
  DCHECK(fetch_aggregator_);
  DCHECK(bluetooth_events_);
  DCHECK(lid_events_);
  DCHECK(power_events_);
  DCHECK(audio_events_);
  DCHECK(udev_events_);
}

CrosHealthdMojoService::~CrosHealthdMojoService() = default;

void CrosHealthdMojoService::AddBluetoothObserver(
    mojo::PendingRemote<
        chromeos::cros_healthd::mojom::CrosHealthdBluetoothObserver> observer) {
  bluetooth_events_->AddObserver(std::move(observer));
}

void CrosHealthdMojoService::AddLidObserver(
    mojo::PendingRemote<chromeos::cros_healthd::mojom::CrosHealthdLidObserver>
        observer) {
  lid_events_->AddObserver(std::move(observer));
}

void CrosHealthdMojoService::AddPowerObserver(
    mojo::PendingRemote<chromeos::cros_healthd::mojom::CrosHealthdPowerObserver>
        observer) {
  power_events_->AddObserver(std::move(observer));
}

void CrosHealthdMojoService::AddNetworkObserver(
    mojo::PendingRemote<network_health_ipc::NetworkEventsObserver> observer) {
  context_->network_health_adapter()->AddObserver(std::move(observer));
}

void CrosHealthdMojoService::AddAudioObserver(
    mojo::PendingRemote<chromeos::cros_healthd::mojom::CrosHealthdAudioObserver>
        observer) {
  audio_events_->AddObserver(std::move(observer));
}

void CrosHealthdMojoService::ProbeProcessInfo(
    uint32_t process_id, ProbeProcessInfoCallback callback) {
  ProcessFetcher(context_, static_cast<pid_t>(process_id))
      .FetchProcessInfo(std::move(callback));
}

void CrosHealthdMojoService::ProbeTelemetryInfo(
    const std::vector<ProbeCategoryEnum>& categories,
    ProbeTelemetryInfoCallback callback) {
  return fetch_aggregator_->Run(categories, std::move(callback));
}

void CrosHealthdMojoService::GetServiceStatus(
    GetServiceStatusCallback callback) {
  auto response = chromeos::cros_healthd::mojom::ServiceStatus::New();
  response->network_health_bound =
      context_->network_health_adapter()->ServiceRemoteBound();
  response->network_diagnostics_bound =
      context_->network_diagnostics_adapter()->ServiceRemoteBound();
  std::move(callback).Run(std::move(response));
}

void CrosHealthdMojoService::AddProbeReceiver(
    mojo::PendingReceiver<
        chromeos::cros_healthd::mojom::CrosHealthdProbeService> receiver) {
  probe_receiver_set_.Add(this /* impl */, std::move(receiver));
}

void CrosHealthdMojoService::AddEventReceiver(
    mojo::PendingReceiver<
        chromeos::cros_healthd::mojom::CrosHealthdEventService> receiver) {
  event_receiver_set_.Add(this /* impl */, std::move(receiver));
}

void CrosHealthdMojoService::AddSystemReceiver(
    mojo::PendingReceiver<
        chromeos::cros_healthd::mojom::CrosHealthdSystemService> receiver) {
  system_receiver_set_.Add(this /* impl */, std::move(receiver));
}

}  // namespace diagnostics
