#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_I2C_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_I2C_H_

#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>

#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "io/ioctl.h"
#include "io/smbus/kernel_dev.h"
#include "io/smbus/smbus.h"
#include "time/clock.h"
#include "tlbmc/hal/fru_scanner.h"
#include "tlbmc/utils/fru_utils.h"

namespace milotic_tlbmc {

constexpr int kI2cFruScanStart = 0x50;
constexpr int kI2cFruScanEnd = 0x57;

// Context for the scan.
struct ScanContext {
  // Map of bus to addresses that have already been scanned.
  absl::flat_hash_map<size_t, absl::flat_hash_set<size_t>> fru_addresses_list;
};

class FruScannerI2c : public FruScanner {
 public:
  struct Options {
    std::string root_dir;
    std::string i2c_dev_dir;
    absl::flat_hash_map<size_t, std::optional<absl::flat_hash_set<size_t>>>
        bus_block_list;
  };

  static std::unique_ptr<FruScannerI2c> Create(const Options& options);

  absl::StatusOr<std::vector<std::unique_ptr<I2cFruInfo>>> ScanAllI2cFrus()
      const override;

  absl::StatusOr<std::unique_ptr<I2cFruInfo>> GetI2cFruInfoFromBus(
      int bus, int address, absl::Duration delay_between_reads) const override;

  absl::StatusOr<std::unique_ptr<I2cFruInfo>> ScanDirectI2cFru(
      int bus, int address, absl::Duration delay_between_reads) const;

 protected:
  FruScannerI2c(
      absl::string_view root_dir, absl::string_view i2c_dev_dir,
      const absl::flat_hash_map<
          size_t, std::optional<absl::flat_hash_set<size_t>>>& bus_block_list)
      : root_dir_(root_dir),
        bus_block_list_(bus_block_list),
        sys_ioctl_(),
        smbus_access_(std::make_unique<ecclesia::KernelSmbusAccess>(
            std::string(i2c_dev_dir), &sys_ioctl_)) {}

  void FindI2CDevices(const absl::flat_hash_set<int>& i2c_buses,
                      BusMap& bus_map) const;

  std::pair<std::vector<uint8_t>, bool> ReadFruContentsFromI2c(
      int i2c_bus, int address,
      absl::Duration delay_between_reads = absl::ZeroDuration()) const;

  // Returns the list of valid FRU addresses found on the given i2c bus.
  // devices: Map of address to FRU data.
  // skip_list: List of addresses to skip.
  // root_found: List of addresses found at root bus.
  absl::flat_hash_set<size_t> FindI2cEeproms(
      int i2cBus, const std::shared_ptr<DeviceMap>& devices,
      absl::string_view root_dir,
      const absl::flat_hash_set<size_t>& root_blocked_addresses,
      absl::flat_hash_set<size_t>& root_found_addresses) const;

  std::string root_dir_;
  const absl::flat_hash_map<size_t, std::optional<absl::flat_hash_set<size_t>>>
      bus_block_list_;
  ecclesia::SysIoctl sys_ioctl_;
  std::unique_ptr<ecclesia::SmbusAccessInterface> smbus_access_;
  ecclesia::Clock* clock_ = ecclesia::Clock::RealClock();
};

}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_I2C_H_
