Entity = class("Entity")

function Entity:initialize(t)
	self.x, self.y = t.x, t.y
	self.spriteSize = {w = t.sprite:getWidth(), h = t.sprite:getHeight()}
	self.size = {w = self.spriteSize.w / 16, h = self.spriteSize.h / 16}
	self.cellShape = t.cellShape or self:cellShapeFromBox(self.size)
	self.name = t.name
	self.color = Color:new(t.color)
	self.collision = t.collision --"none", "moveable", "unmoveable"
	self.sprite = t.sprite
	self.shaAmount = t.sha or 1
	self.onBump = t.onBump or function(self) return true end
	self.tick = t.tick or function(self) return true end

	self.drawOffset = {x = 0, y = 0}
	if self.size.w < 1 or self.size.h < 1 then
		self.drawOffset.x = (drawScale * 16 * self.size.w) / 2
		self.drawOffset.y = (drawScale * 16 * self.size.h) / 2
	end
end

function Entity:getCollision()
	return self.collision
end

function Entity:atGridPos(x, y)
	-- we probably don't need this anymore
	local size = self:getGridSize()
	if x >= self.x and y >= self.y and x < self.x + size.x and y < self.y + size.y then
	  return true
	end
	return false
end

function Entity:getOccupiedCells(coords)
	--we have this offset so we can project what a movement would do
	local offset = coords or {x = 0, y = 0}
	local cells = {}
	local pos = self:getGridPos()

	for _, cell in ipairs(self:getCellShape()) do
		local adjustedCell = {}

		adjustedCell.x = pos.x + cell.x - 1 + offset.x
		adjustedCell.y = pos.y + cell.y - 1 + offset.y
		table.insert(cells, adjustedCell)
	end

	-- print("cels!!!!", cells[1].x, cells[1].y)
	
	return cells
end

function Entity:cellShapeFromBox(box)
	local cells = {}
	for i = 1, box.w do
		for j = 1, box.h do
			table.insert(cells, {x = i, y = j})
		end
	end
	return cells
end

function Entity:getCellShape()
	return self.cellShape
end

function Entity:getDrawBox()
	local drawPos = self:getDrawPos()
	return {x = drawPos.x, y = drawPos.y, w = self.spriteSize.w * drawScale, h = self.spriteSize.h * drawScale}
end

function Entity:getGridBox()
	return {x = self.x, y = self.y, w = self.size.w, h = self.size.h}
end

function Entity:getGridPos()
	return {x = self.x, y = self.y}
end

function Entity:getDrawPos()
	local gridPos = self:getGridPos()
	return {
		x = (gridPos.x - 1) * width / gridWidth + self:sha(),
		y = (gridPos.y - 1) * height / gridHeight + self:sha()
	}
end

function Entity:getGridSize()
	return {x = self.size.w, y = self.size.h}
end

function Entity:occupiesCell(inCell)
	for _, cell in pairs(self:getOccupiedCells()) do
		if cell.x == inCell.x and cell.y == inCell.y then
			return true
		end
	end
	return false
end

function Entity:getname()
	return self.name
end

function Entity:tick()
	return self.tick()
end

function Entity:draw()
	love.graphics.setColor(self.color:set())
	local p = self:getDrawPos()
	love.graphics.draw(self.sprite, p.x + self.drawOffset.x, p.y + self.drawOffset.y, 0, drawScale, drawScale)
end

function Entity:canMove()
	if self:getCollision() == "moveable" then
		return true
	end
	return false
end

function Entity:canPassOver()
	if self:getCollision() == "none" then 
		return true
	end
	return false
end

function Entity:getClass()
	return self.class.name
end

function Entity:getSerializationTable()
	local pos = self:getGridPos()
	local table = {}
	table.x, table.y, table.color = pos.x, pos.y, self.color:getname()
	if self.name then table.name = self.name end
	return table
end

function Entity:move(axis, direction)
	self[axis] = self[axis] + direction
end

function Entity:setSprite(sprite)
	self.sprite = sprite
end

function Entity:sha()
	return math.random(-worldSha, worldSha) * .5
end

function Entity:bump()
	return self:onBump()
end


Entity.static.positionsAreEqual = function(cell1, cell2)
	if cell1.x == cell2.x and cell1.y == cell2.y then
		return true
	end
	return false
end
