#pragma once

#include <gpioplus/chip.hpp>
#include <gpioplus/handle.hpp>
#include <gpioplus/utility/aspeed.hpp>
#include <phosphor-logging/log.hpp>

#include <exception>
#include <string>

namespace utility
{

/** @brief Set the value of a specified gpio
 *
 *  @param[in] gpioName - GPIO to set
 *  @param[in] activeLow - is pin active at low voltage
 *  @param[in] asserted - is pin in active state
 *
 *  @return bool - success of setting the GPIO
 */
bool gpioSetValue(const std::string& gpioName, bool activeLow, bool asserted)
{
    uint32_t gpioOffset;
    try
    {
        gpioOffset = gpioplus::utility::aspeed::nameToOffset(gpioName);
    }
    catch (const std::logic_error& e)
    {
        phosphor::logging::log<phosphor::logging::level::ERR>(
            "Error in gpioplus - nameToOffset",
            phosphor::logging::entry("ERROR=%s", e.what()));
        return false;
    }

    try
    {
        // TODO: openbmc/phosphor-power-control#1 - Handle cases where gpiochip
        //       could be non-zero.
        gpioplus::Chip chip(0);
        gpioplus::HandleFlags flags(chip.getLineInfo(gpioOffset).flags);
        flags.output = true;
        gpioplus::Handle handle(chip, {{gpioOffset, 0}}, flags, "chassiskill");

        bool value = (asserted ^ activeLow);
        handle.setValues({value});
    }
    catch (const std::exception& e)
    {
        phosphor::logging::log<phosphor::logging::level::ERR>(
            "Error in gpioplus",
            phosphor::logging::entry("ERROR=%s", e.what()));
        return false;
    }

    return true;
}

} // namespace utility
