// 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 FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_
#define FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_

#include <fidl/fuchsia.device.fs/cpp/wire.h>
#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <fidl/fuchsia.hardware.pci/cpp/wire.h>
#include <fidl/fuchsia.hardware.qemuedu/cpp/wire.h>
#include <lib/async/dispatcher.h>
#include <lib/driver2/namespace.h>
#include <lib/driver2/record_cpp.h>
#include <lib/driver2/structured_logger.h>
#include <lib/fdf/cpp/dispatcher.h>
#include <lib/mmio/mmio.h>
#include <lib/sys/component/llcpp/outgoing_directory.h>
#include <lib/zx/interrupt.h>
#include <lib/zx/status.h>

#include <memory>
#include <optional>

namespace qemu_edu {

class QemuEduDriver
    : public fidl::WireServer<fuchsia_hardware_qemuedu::Device> {
 public:
  QemuEduDriver(async_dispatcher_t* dispatcher,
                fidl::WireSharedClient<fuchsia_driver_framework::Node> node,
                driver::Namespace ns, driver::Logger logger)
      : outgoing_(component::OutgoingDirectory::Create(dispatcher)),
        node_(std::move(node)),
        ns_(std::move(ns)),
        logger_(std::move(logger)) {}
  virtual ~QemuEduDriver() = default;

  static constexpr const char* Name() { return "qemu-edu"; }

  static zx::status<std::unique_ptr<QemuEduDriver>> Start(
      fuchsia_driver_framework::wire::DriverStartArgs& start_args,
      fdf::UnownedDispatcher dispatcher,
      fidl::WireSharedClient<fuchsia_driver_framework::Node> node,
      driver::Namespace ns, driver::Logger logger);

  // fuchsia.hardware.qemuedu/Device implementation.
  void ComputeFactorial(ComputeFactorialRequestView request,
                        ComputeFactorialCompleter::Sync& completer);
  void LivenessCheck(LivenessCheckRequestView request,
                     LivenessCheckCompleter::Sync& completer);

 private:
  zx::status<> MapInterruptAndMmio(
      fidl::ClientEnd<fuchsia_hardware_pci::Device> pci);
  zx::status<> Run(async_dispatcher* dispatcher,
                   fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir);

  component::OutgoingDirectory outgoing_;
  fidl::WireSharedClient<fuchsia_driver_framework::Node> node_;
  driver::Namespace ns_;
  driver::Logger logger_;
  fidl::WireClient<fuchsia_device_fs::Exporter> exporter_;

  std::optional<fdf::MmioBuffer> mmio_;
  zx::interrupt irq_;

  uint32_t major_version_ = 0;
  uint32_t minor_version_ = 0;
};

}  // namespace qemu_edu

#endif  // FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_
