namespace MoonTools.ECS;

public abstract class System : EntityComponentReader
{
	internal MessageDepot MessageDepot;
	public FilterBuilder FilterBuilder => new FilterBuilder(ComponentDepot);

	public System(World world)
	{
		world.AddSystem(this);
	}

	internal void RegisterMessageDepot(MessageDepot messageDepot)
	{
		MessageDepot = messageDepot;
	}

	public abstract void Update(TimeSpan delta);

	protected Entity CreateEntity()
	{
		return EntityStorage.Create();
	}

	protected void Set<TComponent>(in Entity entity, in TComponent component) where TComponent : struct
	{
		ComponentDepot.Set<TComponent>(entity.ID, component);
	}

	protected void Remove<TComponent>(in Entity entity) where TComponent : struct
	{
		ComponentDepot.Remove<TComponent>(entity.ID);
	}

	protected ReadOnlySpan<TMessage> ReadMessages<TMessage>() where TMessage : struct
	{
		return MessageDepot.Read<TMessage>();
	}

	protected bool SomeMessage<TMessage>() where TMessage : struct
	{
		return MessageDepot.Some<TMessage>();
	}

	protected void Destroy(in Entity entity)
	{
		ComponentDepot.OnEntityDestroy(entity.ID);
		EntityStorage.Destroy(entity);
	}
}