#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_SENSORS_FAN_CONTROLLER_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_SENSORS_FAN_CONTROLLER_H_

#include <cstdint>
#include <memory>
#include <string_view>
#include <unordered_map>

#include "absl/status/statusor.h"
#include "boost/filesystem/path.hpp"  //NOLINT: boost::filesystem::path is commonly used in BMC
#include "fan_controller_config.pb.h"
#include "i2c_common_config.pb.h"
#include "tlbmc/hal/sysfs/i2c.h"

namespace milotic_tlbmc {

class FanController {
 private:
  class Token;

 public:
  struct Tachometers {
    boost::filesystem::path tach_input;
  };

  struct Pwm {
    boost::filesystem::path pwm;
    boost::filesystem::path pwm_enable;
  };

  // Load the device if not already loaded and returns the controller.
  static absl::StatusOr<std::shared_ptr<FanController>> Create(
      const FanControllerConfig& config, const I2cSysfs& i2c_sysfs);

  // Returns the driver name for the given sensor type.
  static absl::StatusOr<std::string_view> GetDriverName(
      FanControllerType sensor_type);

  // Returns the tachometers of the fan controller.
  const std::unordered_map<uint32_t, Tachometers>& GetIndexToTachs() const {
    return index_to_tachs_;
  }

  // Returns the pwms of the fan controller.
  const std::unordered_map<uint32_t, Pwm>& GetIndexToPwms() const {
    return index_to_pwms_;
  }

  bool ControllerHasSensor(const I2cCommonConfig& config) const {
    return config.bus() == config_.i2c_common_config().bus() &&
           config.address() == config_.i2c_common_config().address();
  }

  const I2cCommonConfig& GetI2cCommonConfig() const {
    return config_.i2c_common_config();
  }

  FanController(Token token, const FanControllerConfig& config,
                const std::unordered_map<uint32_t, Tachometers>& tachs,
                const std::unordered_map<uint32_t, Pwm>& pwms);

 protected:
  FanController() = default;

 private:
  class Token {
   private:
    explicit Token() = default;
    friend FanController;
  };
  const FanControllerConfig config_;
  const std::unordered_map<uint32_t, Tachometers> index_to_tachs_;
  const std::unordered_map<uint32_t, Pwm> index_to_pwms_;
};
}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_SENSORS_FAN_CONTROLLER_H_
