#pragma once

#include "file_descriptor.hpp"

#include <linux/gpio.h>

#include <string>
#include <type_traits>

namespace phosphor
{
namespace gpio
{

typedef std::remove_reference<decltype(
    gpiohandle_request::lineoffsets[0])>::type gpioNum_t;

typedef std::remove_reference<decltype(gpiohandle_data::values[0])>::type
    gpioValue_t;

/**
 * If the GPIO is an input or output
 */
enum class Direction
{
    input,
    output
};

/**
 * The possible values - low or high
 */
enum class Value
{
    low,
    high
};

/**
 * Represents a GPIO.
 *
 * Currently supports reading a GPIO.
 *
 * Write support may be added in the future.
 */
class GPIO
{
  public:
    GPIO() = delete;
    GPIO(const GPIO&) = delete;
    GPIO(GPIO&&) = default;
    GPIO& operator=(const GPIO&) = delete;
    GPIO& operator=(GPIO&&) = default;
    ~GPIO() = default;

    /**
     * Constructor
     *
     * @param[in] device - the GPIO device file
     * @param[in] gpio - the GPIO number
     * @param[in] direction - the GPIO direction
     */
    GPIO(const std::string& device, gpioNum_t gpio, Direction direction) :
        device(device), gpio(gpio), direction(direction)
    {
    }

    /**
     * Reads the GPIO value
     *
     * Requests the GPIO line if it hasn't been done already.
     *
     * @return Value - the GPIO value
     */
    Value read();

    /**
     * Sets the GPIO value to low or high
     *
     * Requests the GPIO line if it hasn't been done already.
     *
     * @param[in] Value - the value to set
     */
    void set(Value value);

  private:
    /**
     * Requests a GPIO line from the GPIO device
     *
     * @param[in] defaultValue - The default value, required for
     *                           output GPIOs only.
     */
    void requestLine(Value defaultValue = Value::high);

    /**
     * The GPIO device name, like /dev/gpiochip0
     */
    const std::string device;

    /**
     * The GPIO number
     */
    const gpioNum_t gpio;

    /**
     * The GPIO direction
     */
    const Direction direction;

    /**
     * File descriptor for the GPIO line
     */
    power::util::FileDescriptor lineFD;
};

} // namespace gpio
} // namespace phosphor
