#ifndef _RIVE_CORE_HPP_
#define _RIVE_CORE_HPP_

#include "rive/rive_types.hpp"
#include "rive/core/binary_reader.hpp"
#include "rive/status_code.hpp"

namespace rive {
    class CoreContext;
    class ImportStack;
    class Core {
    public:
        static const int invalidPropertyKey = 0;
        virtual ~Core() {}
        virtual uint16_t coreType() const = 0;
        virtual bool isTypeOf(uint16_t typeKey) const = 0;
        virtual bool deserialize(uint16_t propertyKey,
                                 BinaryReader& reader) = 0;

        template <typename T> inline bool is() const {
            return isTypeOf(T::typeKey);
        }
        template <typename T> inline T* as() {
            assert(is<T>());
            return reinterpret_cast<T*>(this);
        }

        /// Make a shallow copy of the object.
        virtual Core* clone() const { return nullptr; }

        template <typename T> inline const T* as() const {
            assert(is<T>());
            return reinterpret_cast<const T*>(this);
        }

        /// Called when the object is first added to the context, other objects
        /// may not have resolved their dependencies yet. This is an opportunity
        /// to look up objects referenced by id, but not assume that they in
        /// turn have resolved their references yet. Called during
        /// load/instance.
        virtual StatusCode onAddedDirty(CoreContext* context) {
            return StatusCode::Ok;
        }

        /// Called when all the objects in the context have had onAddedDirty
        /// called. This is an opportunity to reference things referenced by
        /// dependencies. (A path should be able to find a Shape somewhere in
        /// its hierarchy, which may be multiple levels up).
        virtual StatusCode onAddedClean(CoreContext* context) {
            return StatusCode::Ok;
        }

        virtual StatusCode import(ImportStack& importStack) {
            return StatusCode::Ok;
        }
    };
} // namespace rive
#endif
