#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
