#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 "hal_common_config.pb.h"
#include "tlbmc/hal/sysfs/hwmon.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 HwmonSysfs& hwmon_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 HalCommonConfig& config) const {
    return config.bus() == config_.hal_common_config().bus() &&
           config.address() == config_.hal_common_config().address();
  }

  const HalCommonConfig& GetHalCommonConfig() const {
    return config_.hal_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_
