local jecs = require("@jecs")
local world = jecs.World.new()

local Position = world:component()
local Velocity = world:component()
local Name = world:component()

local Vector3
do
	Vector3 = {}
	Vector3.__index = Vector3

	function Vector3.new(x, y, z)
		x = x or 0
		y = y or 0
		z = z or 0
		return setmetatable({ X = x, Y = y, Z = z }, Vector3)
	end

	function Vector3.__add(left, right)
		return Vector3.new(left.X + right.X, left.Y + right.Y, left.Z + right.Z)
	end

	function Vector3.__mul(left, right)
		if typeof(right) == "number" then
			return Vector3.new(left.X * right, left.Y * right, left.Z * right)
		end
		return Vector3.new(left.X * right.X, left.Y * right.Y, left.Z * right.Z)
	end

	Vector3.one = Vector3.new(1, 1, 1)
	Vector3.zero = Vector3.new()
end

-- Create a few test entities for a Position, Velocity query
local e1 = world:entity()
world:set(e1, Name, "e1")
world:set(e1, Position, Vector3.new(10, 20, 30))
world:set(e1, Velocity, Vector3.new(1, 2, 3))

local e2 = world:entity()
world:set(e2, Name, "e2")
world:set(e2, Position, Vector3.new(10, 20, 30))
world:set(e2, Velocity, Vector3.new(4, 5, 6))

-- This entity will not match as it does not have Position, Velocity
local e3 = world:entity()
world:set(e3, Name, "e3")
world:set(e3, Position, Vector3.new(10, 20, 30))

-- Create an uncached query for Position, Velocity.
for entity, p, v in world:query(Position, Velocity) do
	-- Iterate entities matching the query
	p.X += v.X
	p.Y += v.Y
	p.Z += v.Z

	print(`{world:get(entity, Name)}: \{{p.X}, {p.Y}, {p.Z}}`)
end

-- Output:
--  e2: {14, 25, 36}
--  e1: {11, 22, 33}
