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

#ifndef CHROMEOS_DBUS_FAKE_MEDIA_ANALYTICS_CLIENT_H_
#define CHROMEOS_DBUS_FAKE_MEDIA_ANALYTICS_CLIENT_H_

#include "base/callback.h"
#include "base/component_export.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "chromeos/dbus/media_analytics_client.h"
#include "chromeos/dbus/media_perception/media_perception.pb.h"

namespace chromeos {

// MediaAnalyticsClient is used to communicate with a media analytics process
// running outside of Chrome.
class COMPONENT_EXPORT(CHROMEOS_DBUS) FakeMediaAnalyticsClient
    : public MediaAnalyticsClient {
 public:
  FakeMediaAnalyticsClient();
  ~FakeMediaAnalyticsClient() override;

  // Inherited from MediaAnalyticsClient.
  void AddObserver(Observer* observer) override;
  void RemoveObserver(Observer* observer) override;
  void GetState(DBusMethodCallback<mri::State> callback) override;
  void SetState(const mri::State& state,
                DBusMethodCallback<mri::State> callback) override;
  void GetDiagnostics(DBusMethodCallback<mri::Diagnostics> callback) override;
  void BootstrapMojoConnection(base::ScopedFD file_descriptor,
                               VoidDBusMethodCallback callback) override;

  // Inherited from DBusClient.
  void Init(dbus::Bus* bus) override;

  // Fires a fake media perception event.
  bool FireMediaPerceptionEvent(const mri::MediaPerception& media_perception);

  // Sets the object to be returned from GetDiagnostics.
  void SetDiagnostics(const mri::Diagnostics& diagnostics);

  // Sets the state of the media analytics process to SUSPENDED.
  void SetStateSuspended();

  void set_process_running(bool running) { process_running_ = running; }

  bool process_running() const { return process_running_; }

 private:
  // Echoes back the previously set state.
  void OnState(DBusMethodCallback<mri::State> callback);

  // Runs callback with the Diagnostics proto provided in SetDiagnostics.
  void OnGetDiagnostics(DBusMethodCallback<mri::Diagnostics> callback);

  // Notifies observers with a MediaPerception proto provided in
  // FireMediaPerceptionEvent.
  void OnMediaPerception(const mri::MediaPerception& media_perception);

  // Observers for receiving MediaPerception proto messages.
  base::ObserverList<Observer>::Unchecked observer_list_;

  // A fake current state for the media analytics process.
  mri::State current_state_;

  // A fake diagnostics object to be returned by the GetDiagnostics.
  mri::Diagnostics diagnostics_;

  // Whether the fake media analytics was started (for example by the fake
  // upstart client) - If not set, all requests to this client will fail.
  bool process_running_;

  base::WeakPtrFactory<FakeMediaAnalyticsClient> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(FakeMediaAnalyticsClient);
};

}  // namespace chromeos

#endif  // CHROMEOS_DBUS_FAKE_MEDIA_ANALYTICS_CLIENT_H_
