// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "libmems/iio_event.h"

#include <base/logging.h>
#include <base/strings/string_number_conversions.h>

namespace libmems {

IioEvent::~IioEvent() = default;

bool IioEvent::SetEnabledAndCheck(bool en) {
  SetEnabled(en);
  return en == IsEnabled();
}

bool IioEvent::MatchMask(uint64_t mask) {
  if (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) != chan_type_)
    return false;

  if (IIO_EVENT_CODE_EXTRACT_TYPE(mask) != event_type_)
    return false;

  if (direction_ != iio_event_direction::IIO_EV_DIR_EITHER &&
      IIO_EVENT_CODE_EXTRACT_DIR(mask) != direction_) {
    return false;
  }

  if (channel_ != -1 && IIO_EVENT_CODE_EXTRACT_CHAN(mask) != channel_)
    return false;

  return true;
}

iio_chan_type IioEvent::GetChannelType() const {
  return chan_type_;
}

iio_event_type IioEvent::GetEventType() const {
  return event_type_;
}

iio_event_direction IioEvent::GetDirection() const {
  return direction_;
}

int IioEvent::GetChannelNumber() const {
  return channel_;
}

base::Optional<int64_t> IioEvent::ReadNumberAttribute(
    const std::string& name) const {
  base::Optional<std::string> value = ReadStringAttribute(name);
  if (!value.has_value())
    return base::nullopt;

  int64_t number;
  if (!base::StringToInt64(value.value(), &number)) {
    LOG(ERROR) << "Cannot convert string to int64: " << value.value();
    return base::nullopt;
  }

  return number;
}

base::Optional<double> IioEvent::ReadDoubleAttribute(
    const std::string& name) const {
  base::Optional<std::string> value = ReadStringAttribute(name);
  if (!value.has_value())
    return base::nullopt;

  double number;
  if (!base::StringToDouble(value.value(), &number)) {
    LOG(ERROR) << "Cannot convert string to double: " << value.value();
    return base::nullopt;
  }

  return number;
}

bool IioEvent::WriteNumberAttribute(const std::string& name, int64_t value) {
  return WriteStringAttribute(name, base::NumberToString(value));
}

bool IioEvent::WriteDoubleAttribute(const std::string& name, double value) {
  return WriteStringAttribute(name, base::NumberToString(value));
}

IioEvent::IioEvent(iio_chan_type chan_type,
                   iio_event_type event_type,
                   iio_event_direction direction,
                   int channel)
    : chan_type_(chan_type),
      event_type_(event_type),
      direction_(direction),
      channel_(channel) {}

}  // namespace libmems
