-- based of of plan9's Rectangle struct
-- rect.max is not counted as "in" the rectangle
Rect = {}
Rect.__index = Rect

function Rect:fromPoints(pt1, pt2)
	local o = { min = pt1, max = pt2 }
	setmetatable(o, self)
	return o
end

function Rect:getPoints()
	return self.min, self.max
end


function Rect:fromCoords(x1, y1, x2, y2)
	return Rect:fromPoints(Point:new(x1, y1), Point:new(x2, y2))
end

function Rect:getCoords()
	return self.min.x, self.min.y, self.max.x, self.max.y
end

-- clone refers to a deep copy
function Rect:clone()
	return Rect:fromCoords(self.min.x, self.min.y, self.max.x, self.max.y)
end

-- make sure min and max refer to the correct corners
-- acts in place, returns self
function Rect:fix()
	if self.min.x > self.max.x then
		self.min.x, self.max.x = self.max.x, self.min.x
	end
	if self.min.y > self.max.y then
		self.min.y, self.max.y = self.max.y, self.min.y
	end
end

function Rect:width()
	return self.max.x - self.min.x
end

function Rect:height()
	return self.max.y - self.min.y
end

function Rect:size()
	return Point:new(self:width(), self:height())
end

function Rect:__add(pt)
	return Rect:fromPoints(self.min + pt, self.max + pt)
end

function Rect:corners()
	return {
		self.min:copy(), -- top left
		Point:new(self.max.x, self.min.y), -- top right
		Point:new(self.min.x, self.max.y), -- bottom left
		self.max:copy(), -- bottom right
	}
end

function Rect:containsPoint(pt)
	return pt.x >= self.min.x
	and pt.y >= self.min.y
	and pt.x <= self.max.x
	and	pt.y <= self.max.y
end

function Rect:overlapsRect(other)
	return self.min.x	<	other.max.x
	and self.max.x		>	other.min.x
	and self.min.y		<	other.max.y
	and self.max.y		>	other.min.y
end

function Rect:draw(style)
	love.graphics.rectangle(style, self.min.x - Camera.pos.x, self.min.y - Camera.pos.y, self:width(), self:height())
end

function Rect:__tostring()
	return "Rect["..tostring(self.min).." "..tostring(self.max).."]"
end
