#ifndef _RIVE_KEY_FRAME_DOUBLE_BASE_HPP_
#define _RIVE_KEY_FRAME_DOUBLE_BASE_HPP_
#include "rive/animation/keyframe.hpp"
#include "rive/core/field_types/core_double_type.hpp"
namespace rive {
    class KeyFrameDoubleBase : public KeyFrame {
    protected:
        typedef KeyFrame Super;

    public:
        static const uint16_t typeKey = 30;

        /// Helper to quickly determine if a core object extends another without RTTI
        /// at runtime.
        bool isTypeOf(uint16_t typeKey) const override {
            switch (typeKey) {
                case KeyFrameDoubleBase::typeKey:
                case KeyFrameBase::typeKey:
                    return true;
                default:
                    return false;
            }
        }

        uint16_t coreType() const override { return typeKey; }

        static const uint16_t valuePropertyKey = 70;

    private:
        float m_Value = 0.0f;

    public:
        inline float value() const { return m_Value; }
        void value(float value) {
            if (m_Value == value) {
                return;
            }
            m_Value = value;
            valueChanged();
        }

        Core* clone() const override;
        void copy(const KeyFrameDoubleBase& object) {
            m_Value = object.m_Value;
            KeyFrame::copy(object);
        }

        bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
            switch (propertyKey) {
                case valuePropertyKey:
                    m_Value = CoreDoubleType::deserialize(reader);
                    return true;
            }
            return KeyFrame::deserialize(propertyKey, reader);
        }

    protected:
        virtual void valueChanged() {}
    };
} // namespace rive

#endif