#ifndef _RIVE_STATE_TRANSITION_FLAGS_HPP_
#define _RIVE_STATE_TRANSITION_FLAGS_HPP_

#include <type_traits>

namespace rive {
    enum class StateTransitionFlags : unsigned char {
        None = 0,

        /// Whether the transition is disabled.
        Disabled = 1 << 0,

        /// Whether the transition duration is a percentage or time in ms.
        DurationIsPercentage = 1 << 1,

        /// Whether exit time is enabled.
        EnableExitTime = 1 << 2,

        /// Whether the exit time is a percentage or time in ms.
        ExitTimeIsPercentage = 1 << 3,

        /// Whether the animation is held at exit or if it keeps advancing
        /// during mixing.
        PauseOnExit = 1 << 4

    };

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

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

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

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

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

        return lhs;
    }

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

        return lhs;
    }

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

        return lhs;
    }
} // namespace rive
#endif