#ifndef _RIVE_DIRTY_FLAGS_HPP_
#define _RIVE_DIRTY_FLAGS_HPP_
#include <type_traits>

namespace rive {
enum class ComponentDirt : unsigned short {
    None = 0,

    Dependents = 1 << 0,

    /// General flag for components are dirty (if this is up, the update
    /// cycle runs). It gets automatically applied with any other dirt.
    Components = 1 << 1,

    /// Draw order needs to be re-computed.
    DrawOrder = 1 << 2,

    /// Path is dirty and needs to be rebuilt.
    Path = 1 << 3,

    /// Skin needs to recompute bone transformations.
    Skin = 1 << 3,

    /// Vertices have changed, re-order cached lists.
    Vertices = 1 << 4,

    /// Used by any component that needs to recompute their local transform.
    /// Usually components that have their transform dirty will also have
    /// their worldTransform dirty.
    Transform = 1 << 5,

    /// Used by any component that needs to update its world transform.
    WorldTransform = 1 << 6,

    /// Marked when the stored render opacity needs to be updated.
    RenderOpacity = 1 << 7,

    /// Dirt used to mark some stored paint needs to be rebuilt or that we
    /// just want to trigger an update cycle so painting occurs.
    Paint = 1 << 8,

    /// Used by the gradients track when the stops need to be re-ordered.
    Stops = 1 << 9,

    /// Blend modes need to be updated
    // TODO: do we need this?
    // BlendMode = 1 << 9,

    // Everything is dirty.
    Filthy = 0xFFFF
};

inline constexpr ComponentDirt operator&(ComponentDirt lhs, ComponentDirt rhs) {
    return static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) &
                                      static_cast<std::underlying_type<ComponentDirt>::type>(rhs));
}

inline constexpr ComponentDirt operator^(ComponentDirt lhs, ComponentDirt rhs) {
    return static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) ^
                                      static_cast<std::underlying_type<ComponentDirt>::type>(rhs));
}

inline constexpr ComponentDirt operator|(ComponentDirt lhs, ComponentDirt rhs) {
    return static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) |
                                      static_cast<std::underlying_type<ComponentDirt>::type>(rhs));
}

inline constexpr ComponentDirt operator~(ComponentDirt rhs) {
    return static_cast<ComponentDirt>(~static_cast<std::underlying_type<ComponentDirt>::type>(rhs));
}

inline ComponentDirt& operator|=(ComponentDirt& lhs, ComponentDirt rhs) {
    lhs = static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) |
                                     static_cast<std::underlying_type<ComponentDirt>::type>(rhs));

    return lhs;
}

inline ComponentDirt& operator&=(ComponentDirt& lhs, ComponentDirt rhs) {
    lhs = static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) &
                                     static_cast<std::underlying_type<ComponentDirt>::type>(rhs));

    return lhs;
}

inline ComponentDirt& operator^=(ComponentDirt& lhs, ComponentDirt rhs) {
    lhs = static_cast<ComponentDirt>(static_cast<std::underlying_type<ComponentDirt>::type>(lhs) ^
                                     static_cast<std::underlying_type<ComponentDirt>::type>(rhs));

    return lhs;
}
} // namespace rive
#endif