// 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_I2C_TEMPERATURE_H_
#define FUCHSIA_SDK_EXAMPLES_CC_I2C_TEMPERATURE_H_

#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <fidl/fuchsia.hardware.i2c/cpp/wire.h>
#include <fidl/sample.i2ctemperature/cpp/wire.h>
#include <lib/driver2/namespace.h>
#include <lib/driver2/structured_logger.h>
#include <lib/fdf/cpp/dispatcher.h>
#include <lib/sys/component/llcpp/outgoing_directory.h>
#include <lib/zx/status.h>

#include "i2c_channel.h"

namespace i2c_temperature {

// Sample driver for a virtual temperature sensor device connected to an I2C bus controller.
class I2cTemperatureDriver : public fidl::WireServer<sample_i2ctemperature::Device> {
 public:
  I2cTemperatureDriver(async_dispatcher_t* dispatcher,
                       fidl::WireSharedClient<fuchsia_driver_framework::Node> node,
                       driver::Namespace ns, driver::Logger logger)
      : dispatcher_(dispatcher),
        node_(std::move(node)),
        outgoing_(component::OutgoingDirectory::Create(dispatcher)),
        ns_(std::move(ns)),
        logger_(std::move(logger)) {}

  virtual ~I2cTemperatureDriver() = default;

  static constexpr const char* Name() { return "i2c-temperature"; }

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

  // sample.i2ctemperature/Device:
  void ReadTemperature(ReadTemperatureRequestView request,
                       ReadTemperatureCompleter::Sync& completer);
  void ResetSensor(ResetSensorRequestView request, ResetSensorCompleter::Sync& completer);

 private:
  zx::status<> Run(fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir);

  zx::status<> SetupI2cChannel();

  async_dispatcher_t* const dispatcher_;

  fidl::WireSharedClient<fuchsia_driver_framework::Node> node_;

  component::OutgoingDirectory outgoing_;
  driver::Namespace ns_;
  driver::Logger logger_;

  std::unique_ptr<I2cChannel> i2c_channel_;
};

}  // namespace i2c_temperature

#endif  // FUCHSIA_SDK_EXAMPLES_CC_I2C_TEMPERATURE_H_
