#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_STORE_FACTORY_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_STORE_FACTORY_H_

#include <cstddef>
#include <memory>
#include <vector>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "nlohmann/json_fwd.hpp"
#include "tlbmc/collector/fru_collector.h"
#include "tlbmc/collector/sensor_collector.h"
#include "tlbmc/configs/entity_config.h"
#include "tlbmc/configs/entity_config_json_impl.h"
#include "fru.pb.h"
#include "sensor.pb.h"

namespace milotic_tlbmc {

// Factory to create collectors.
// This is useful for dependency injection for tests.
class CollectorFactory {
 public:
  virtual ~CollectorFactory() = default;
  virtual absl::StatusOr<std::unique_ptr<SensorCollector>>
  CreateSensorCollector(const SensorCollector::Params& params) = 0;
  virtual absl::StatusOr<std::unique_ptr<FruCollector>> CreateFruCollector(
      const FruCollector::Options& options) = 0;
};

class CollectorFactoryImpl : public CollectorFactory {
 public:
  absl::StatusOr<std::unique_ptr<SensorCollector>> CreateSensorCollector(
      const SensorCollector::Params& params) override {
    return SensorCollector::Create(params);
  }

  absl::StatusOr<std::unique_ptr<FruCollector>> CreateFruCollector(
      const FruCollector::Options& options) override {
    return FruCollector::Create(options);
  }
};

// Factory to create a config reader.
// This is useful for dependency injection for tests.
class EntityConfigReader {
 public:
  virtual ~EntityConfigReader() = default;
  virtual absl::Status LoadEntityConfig(absl::string_view config_location) = 0;
  virtual const std::vector<nlohmann::json>& GetConfig()
      const = 0;
  virtual absl::StatusOr<std::unique_ptr<EntityConfig>> CreateEntityConfig(
      const RawFruTable& fru_table, size_t ad_hoc_fru_count) = 0;
};

class EntityConfigReaderImpl : public EntityConfigReader {
 public:
  absl::Status LoadEntityConfig(absl::string_view config_location) override;

  absl::StatusOr<std::unique_ptr<EntityConfig>> CreateEntityConfig(
      const RawFruTable& fru_table, size_t ad_hoc_fru_count) override;

  const std::vector<nlohmann::json>& GetConfig()
      const override;

 private:
  std::vector<nlohmann::json> config_list_;
};

}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_STORE_FACTORY_H_
