--Transform v0.1
local transform = {}

function transform.new(newX, newY, rotation, scale)
	
	local newT = {}
	
	newT.position = { x = newX, y = newY }	
	newT.rotation = rotation or 0
	newT.scale = scale or 1
	
	function newT.Translate(newx, newy)
		
		if type(newx) ~= 'number' then -- Not a Number
			if type(newx) == 'table' and newx.x == nil then -- Table
				newy = newx[2]
				newx = newx[1]
			elseif newx.x ~= nil then --Vector
				newy = newx.y
				newx = newx.x
			end
		end
		
		newT.position.x = newT.position.x + newx
		newT.position.y = newT.position.y + newy
	end
	
	function newT.Set(newx, newy, newrot, newscale)
		newT.position.x = newx
		newT.position.y = newy
		newT.rotation = newrot or newT.rotation
		newT.scale = newscale or newT.scale
	end
	
	function newT.GetNewPosition(newx, newy)
		return newT.position.x + newx, newT.position.y + newy	
	end
	
	function newT.Request(newx, newy, colliderID)
		
		local c = collider.colliders[colliderID]
		local collisions = nil 
		local collisionsY = nil
		
		if c.type == 'box' then
			collisions = collider.overlapBox(newT.position.x + newx, newT.position.y, c.width, c.height)
			collisionsY = collider.overlapBox(newT.position.x, newT.position.y + newy, c.width, c.height)
		else 
			collisions = collider.overlapCircle(newT.position.x + newx, newT.position.y, c.radius)
			collisionsY = collider.overlapCircle(newT.position.x, newT.position.y + newy, c.radius)
		end
		
		local moveMult = {1, 1}
		
		for k,v in pairs(collisions) do
			if v.trigger == false and v.ID ~= c.ID then
				moveMult[1] = 0
				break
			end
		end
		
		for k,v in pairs(collisionsY) do
			if v.trigger == false and v.ID ~= c.ID then
				moveMult[2] = 0
				break
			end
		end
		
		for k,v in pairs(collisionsY) do table.insert(collisions, v) end
		
		for k,v in pairs(collisions) do 
			c.collisions[v.ID] = v
			v.collisions[c.ID] = c
		end

		newT.Translate(newx * moveMult[1], newy * moveMult[2])
	end
	
	function newT.get()
		return newT.position.x, newT.position.y, newT.rotation, newT.scale
	end
	
	return newT
end

return transform