// 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.

#ifndef LIBMEMS_IIO_EVENT_H_
#define LIBMEMS_IIO_EVENT_H_

#include <iio.h>

#include <linux/iio/events.h>
#include <linux/iio/types.h>
#include <optional>
#include <string>

#include "libmems/export.h"

namespace libmems {

// The IioEvent represents an event on an IIO device, for example the
// channel: 0, event type: threshold, direction: either in proximity sensor.
// Events can be enabled and/or disabled via this class.
class LIBMEMS_EXPORT IioEvent {
 public:
  virtual ~IioEvent();

  // Returns true if this event is enabled.
  virtual bool IsEnabled() const = 0;

  // Sets this event's enabled status to |en|.
  virtual void SetEnabled(bool en) = 0;

  // Sets the event's enabled status to |en|,
  // and returns true if the event's enabled status matches
  // what was set, false otherwise.
  bool SetEnabledAndCheck(bool en);

  // Checks if the mask (iio_event_data.id) matches this event.
  bool MatchMask(uint64_t mask);

  iio_chan_type GetChannelType() const;
  iio_event_type GetEventType() const;
  iio_event_direction GetDirection() const;
  // Returns -1 if invalid
  int GetChannelNumber() const;

  // Reads the |name| attribute of this event and returns the value
  // as a string. It will return std::nullopt if the attribute cannot
  // be read.
  virtual std::optional<std::string> ReadStringAttribute(
      const std::string& name) const = 0;

  // Reads the |name| attribute of this event and returns the value
  // as a signed number. It will return std::nullopt if the attribute
  // cannot be read or is not a valid number.
  std::optional<int64_t> ReadNumberAttribute(const std::string& name) const;

  // Reads the |name| attribute of this device and returns the value
  // as a double precision floating point. It will return std::nullopt
  // if the attribute cannot be read or is not a valid number.
  std::optional<double> ReadDoubleAttribute(const std::string& name) const;

  // Writes the string |value| to the attribute |name| of this event. Returns
  // false if an error occurs.
  virtual bool WriteStringAttribute(const std::string& name,
                                    const std::string& value) = 0;

  // Writes the number |value| to the attribute |name| of this event. Returns
  // false if an error occurs.
  bool WriteNumberAttribute(const std::string& name, int64_t value);

  // Writes the floating point |value| to the attribute |name| of this event.
  // Returns false if an error occurs.
  bool WriteDoubleAttribute(const std::string& name, double value);

 protected:
  IioEvent(iio_chan_type chan_type,
           iio_event_type event_type,
           iio_event_direction direction,
           int channel);
  IioEvent(const IioEvent&) = delete;
  IioEvent& operator=(const IioEvent&) = delete;

  const iio_chan_type chan_type_;
  const iio_event_type event_type_;
  const iio_event_direction direction_;
  const int channel_;  // -1 if invalid
};

}  // namespace libmems

#endif  // LIBMEMS_IIO_EVENT_H_
