#pragma once

#include "config.h"

#include "group.hpp"
#include "manager.hpp"

#include <nlohmann/json.hpp>
#include <sdeventplus/utility/timer.hpp>

#include <queue>
#include <vector>

namespace phosphor
{
namespace led
{

/** @class LampTest
 *  @brief Manager LampTest feature
 */
class LampTest
{
  public:
    LampTest() = delete;
    ~LampTest() = default;
    LampTest(const LampTest&) = delete;
    LampTest& operator=(const LampTest&) = delete;
    LampTest(LampTest&&) = delete;
    LampTest& operator=(LampTest&&) = delete;

    /** @brief Constructs LED LampTest
     *
     * Constructs timer and when the timeout occurs, the stop method is called
     * back to stop timer and also end the lamp test.
     *
     * @param[in] event   - sd event handler
     * @param[in] manager - reference to manager instance
     */
    LampTest(const sdeventplus::Event& event, Manager& manager) :
        timer(event, [this](auto&) { timeOutHandler(); }), manager(manager),
        groupObj(nullptr)
    {
        // Get the force update and/or skipped physical LEDs names from the
        // lamp-test-led-overrides.json file during lamp
        getPhysicalLEDNamesFromJson(LAMP_TEST_LED_OVERRIDES_JSON);
    }

    /** @brief the lamp test request handler
     *
     * If lamp test is running (Asserted=true) and if user requests to stop lamp
     * test (Asserted input=false), Stop operation will not take place and set
     * the Asserted to true itself. LampTest Asserted is/can be set to false
     * only when the lamptest timer expires.
     *
     *  @param[in]  group    -  Pointer to Group object
     *  @param[in]  value    -  true: start lamptest
     *                          false: stop lamptest
     *
     *  @return Whether lamp test request is handled successfully or not.
     */
    bool requestHandler(Group* group, bool value);

    /** @brief Update physical LEDs states during lamp test and the lamp test is
     *         running
     *
     *  @param[in]  ledsAssert    -  LEDs that are to be asserted newly or to a
     *                               different state
     *  @param[in]  ledsDeAssert  -  LEDs that are to be Deasserted
     *
     *  @return Is running lamp test, true running
     */
    bool processLEDUpdates(const ActionSet& ledsAssert,
                           const ActionSet& ledsDeAssert);

    /** @brief Clear LEDs triggered by lamptest
     * When system reboots during lamptest, leds triggered by lamptest needs to
     * be cleared in the upcoming boot. This method clears all the leds along
     * with the persisted lamp test indicator file so that there is no sign of
     * lamptest.
     */
    static void clearLamps();

  private:
    /** @brief Timer used for LEDs lamp test period */
    sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;

    /** @brief Reference to Manager object */
    Manager& manager;

    /** @brief Pointer to Group object */
    Group* groupObj;

    /** all the Physical paths */
    std::vector<std::string> physicalLEDPaths;

    /** @brief Queue to save LED states during lamp test */
    std::queue<std::pair<ActionSet, ActionSet>> updatedLEDsDuringLampTest;

    /** @brief Get state of the lamp test operation */
    bool isLampTestRunning{false};

    /** @brief Physical LED states prior to lamp test */
    ActionSet physicalLEDStatesPriorToLampTest;

    /** @brief Vector of names of physical LEDs, whose changes will be forcibly
     *         updated even during lamp test. */
    std::vector<std::string> forceUpdateLEDs;

    /** @brief Vector of names of physical LEDs, that will be exempted from lamp
     *         test */
    std::vector<std::string> skipUpdateLEDs;

    /** @brief Start and restart lamp test depending on what is the current
     *         state. */
    void start();

    /** @brief Stop lamp test. */
    void stop();

    /** @brief This method gets called when the lamp test procedure is done as
     *         part of timeout. */
    void timeOutHandler();

    /** @brief Restore the physical LEDs states after the lamp test finishes */
    void restorePhysicalLedStates();

    /** @brief Store the physical LEDs states before the lamp test start */
    void storePhysicalLEDsStates();

    /** @brief Returns action enum based on string
     *
     *  @param[in]  str - Action string
     *
     *  @return enumeration equivalent of the passed in string
     */
    static Layout::Action getActionFromString(const std::string& str);

    /** @brief Notify host to start / stop the lamp test
     *
     *  @param[in]  value   -  the Asserted property value
     */
    static void doHostLampTest(bool value);

    /** @brief Get physical LED names from lamp test JSON config file
     *
     *  @param[in]  path - path of LED JSON file
     *
     *  return
     */
    void getPhysicalLEDNamesFromJson(const fs::path& path);
};

} // namespace led
} // namespace phosphor
