#ifndef _RIVE_COMPONENT_HPP_
#define _RIVE_COMPONENT_HPP_
#include "rive/component_dirt.hpp"
#include "rive/generated/component_base.hpp"

#include <vector>

namespace rive
{
	class ContainerComponent;
	class Artboard;

	class Component : public ComponentBase
	{
		friend class Artboard;

	private:
		ContainerComponent* m_Parent = nullptr;
		std::vector<Component*> m_Dependents;

		unsigned int m_GraphOrder;
		Artboard* m_Artboard = nullptr;

	protected:
		ComponentDirt m_Dirt = ComponentDirt::Filthy;

	public:
		inline Artboard* artboard() const { return m_Artboard; }
		StatusCode onAddedDirty(CoreContext* context) override;
		inline ContainerComponent* parent() const { return m_Parent; }
		const std::vector<Component*>& dependents() const
		{
			return m_Dependents;
		}
		void addDependent(Component* component);

		// TODO: re-evaluate when more of the lib is complete...
		// These could be pure virtual but we define them empty here to avoid
		// having to implement them in a bunch of concrete classes that
		// currently don't use this logic.
		virtual void buildDependencies() {}
		virtual void onDirty(ComponentDirt dirt) {}
		virtual void update(ComponentDirt value) {}

		unsigned int graphOrder() const { return m_GraphOrder; }
		bool addDirt(ComponentDirt value, bool recurse = false);
		inline bool hasDirt(ComponentDirt flag) const
		{
			return (m_Dirt & flag) == flag;
		}
		static inline bool hasDirt(ComponentDirt value, ComponentDirt flag)
		{
			return (value & flag) != ComponentDirt::None;
		}

		StatusCode import(ImportStack& importStack) override;
	};
} // namespace rive

#endif
