#pragma once

#include "data_types.hpp"

#include <algorithm>
#include <functional>

namespace phosphor
{
namespace dbus
{
namespace monitoring
{

/** @class Filters
 *  @brief Filter interface
 *
 *  Filters of any type can be applied to property value changes.
 */
class Filters
{
  public:
    Filters() = default;
    Filters(const Filters&) = delete;
    Filters(Filters&&) = default;
    Filters& operator=(const Filters&) = delete;
    Filters& operator=(Filters&&) = default;
    virtual ~Filters() = default;

    /** @brief Apply filter operations to a property value. */
    virtual bool operator()(const std::any& value) = 0;
};

/** @class OperandFilters
 *  @brief Filter property values utilzing operand based functions.
 *
 *  When configured, an operand filter is applied to a property value each
 *  time it changes to determine if that property value should be filtered
 *  from being stored or used within a given callback function.
 */
template <typename T>
class OperandFilters : public Filters
{
  public:
    OperandFilters() = delete;
    OperandFilters(const OperandFilters&) = delete;
    OperandFilters(OperandFilters&&) = default;
    OperandFilters& operator=(const OperandFilters&) = delete;
    OperandFilters& operator=(OperandFilters&&) = default;
    virtual ~OperandFilters() = default;
    explicit OperandFilters(const std::vector<std::function<bool(T)>>& _ops) :
        Filters(), ops(std::move(_ops))
    {}

    bool operator()(const std::any& value) override
    {
        for (const auto& filterOps : ops)
        {
            try
            {
                // Apply filter operand to property value
                if (!filterOps(std::any_cast<T>(value)))
                {
                    // Property value should be filtered
                    return true;
                }
            }
            catch (const std::bad_any_cast& bac)
            {
                // Unable to cast property value to filter value type
                // to check filter, continue to next filter op
                continue;
            }
        }

        // Property value should not be filtered
        return false;
    }

  private:
    /** @brief List of operand based filter functions. */
    const std::vector<std::function<bool(T)>> ops;
};

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
