// Copyright 2022 The Fuchsia 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 SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_FAKE_DISPLAY_STACK_H_
#define SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_FAKE_DISPLAY_STACK_H_

#include <fidl/fuchsia.hardware.display/cpp/wire.h>
#include <fidl/fuchsia.sysmem2/cpp/wire.h>
#include <lib/driver/testing/cpp/driver_runtime.h>
#include <lib/driver/testing/cpp/scoped_global_logger.h>
#include <lib/zx/result.h>

#include <memory>
#include <optional>

#include "src/graphics/display/lib/fake-display-stack/fake-coordinator-harness.h"
#include "src/graphics/display/lib/fake-display-stack/fake-display-engine-harness.h"
#include "src/graphics/display/lib/fake-display-stack/sysmem-service-provider.h"

namespace fake_display {

// FakeDisplayStack creates and holds a FakeDisplay device as well as the
// Sysmem device and the display coordinator Controller which are attached to
// the fake display device and clients can connect to.
class FakeDisplayStack {
 public:
  FakeDisplayStack(std::unique_ptr<SysmemServiceProvider> sysmem_service_provider,
                   const FakeDisplayDeviceConfig& device_config);

  FakeDisplayStack(const FakeDisplayStack&) = delete;
  FakeDisplayStack(FakeDisplayStack&&) = delete;
  FakeDisplayStack& operator=(const FakeDisplayStack&) = delete;
  FakeDisplayStack& operator=(FakeDisplayStack&&) = delete;

  ~FakeDisplayStack();

  // Must not be called after SyncShutdown().
  FakeDisplay& display_engine();

  // Must not be called after SyncShutdown().
  fidl::ClientEnd<fuchsia_sysmem2::Allocator> ConnectToSysmemAllocatorV2();

  // Must be called at least once.
  //
  // Join all threads providing display and sysmem protocols, and remove all
  // the devices bound to the mock root device.
  void SyncShutdown();

  // Serves coordinator services to the returned directory.
  //
  // Must not be called after `SyncShutdown()`.
  fidl::ClientEnd<fuchsia_io::Directory> ServeCoordinator();

  // Serves coordinator services to the process's outgoing directory.
  //
  // Must not be called after `SyncShutdown()`.
  void ServeCoordinatorToProcessOutgoingDirectory();

 private:
  bool shutdown_ = false;

  std::optional<fdf_testing::ScopedGlobalLogger> logger_;

  std::shared_ptr<fdf_testing::DriverRuntime> driver_runtime_;
  std::unique_ptr<SysmemServiceProvider> sysmem_service_provider_;

  FakeDisplayEngineHarness display_engine_harness_;
  FakeCoordinatorHarness coordinator_harness_;
};

}  // namespace fake_display

#endif  // SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_FAKE_DISPLAY_STACK_H_
