#include "tlbmc/sensors/nic_sensor.h"

#include <memory>
#include <optional>
#include <string>

#include "absl/log/log.h"
#include "absl/status/statusor.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "nic_telemetry_config.pb.h"
#include "sensor_instance_properties.pb.h"
#include "tlbmc/hal/nic_veeprom/interface.h"
#include "veeprom.pb.h"
#include "resource.pb.h"
#include "sensor.pb.h"
#include "tlbmc/sensors/sync_polling_sensor.h"

namespace milotic_tlbmc {

absl::StatusOr<std::shared_ptr<NicSensor>> NicSensor::Create(
    const NicTelemetryInstance& instance_config,
    const EntityCommonConfig& entity_common_config,
    const std::shared_ptr<boost::asio::io_context>& io_context,
    const nic_veeprom::Accessor& accessor,
    std::optional<NotificationCb> on_batch_notify) {
  SensorInstanceProperties instance_properties =
      instance_config.instance_properties();
  auto telemetry_name = static_cast<nic_veeprom::NicTelemetryName>(
      instance_config.telemetry_name());
  std::string sensor_name = nic_veeprom::NicTelemetryName_Name(telemetry_name);
  constexpr absl::string_view kNicTelemetryNamePrefix = "NIC_TELEMETRY_NAME_";
  if (absl::StartsWith(sensor_name, kNicTelemetryNamePrefix)) {
    sensor_name = sensor_name.substr(kNicTelemetryNamePrefix.size());
  }
  sensor_name =
      absl::StrCat(entity_common_config.board_config_key(), "_", sensor_name);
  instance_properties.set_name(sensor_name);
  instance_properties.set_unit(accessor.GetSensorUnit(telemetry_name));
  return std::make_shared<NicSensor>(Token(), instance_config.telemetry_name(),
                                     entity_common_config, instance_properties,
                                     io_context, accessor, on_batch_notify);
}

NicSensor::NicSensor(Token token, nic_veeprom::NicTelemetryName telemetry_name,
                     const EntityCommonConfig& entity_common_config,
                     const SensorInstanceProperties& sensor_instance_properties,
                     const std::shared_ptr<boost::asio::io_context>& io_context,
                     const nic_veeprom::Accessor& accessor,
                     std::optional<NotificationCb> on_batch_notify)
    : SyncPollingSensor(CreateStaticAttributes(sensor_instance_properties,
                                               /*hal_common_config=*/{},
                                               entity_common_config),
                        sensor_instance_properties.thresholds(), io_context,
                        on_batch_notify),
      telemetry_name_(telemetry_name),
      accessor_(accessor) {}

absl::StatusOr<SensorValue> NicSensor::ReadSensorData() {
  absl::StatusOr<std::shared_ptr<const SensorValue>> result =
      accessor_.GetSensorValue(telemetry_name_);
  if (!result.ok()) {
    return absl::Status(result.status().code(),
                        absl::StrCat("Failed to read sensor value with error: ",
                                     result.status().message()));
  }
  return *result.value();
}

}  // namespace milotic_tlbmc
