#include "rive/math/aabb.hpp"
#include <cmath>

using namespace rive;

AABB::AABB() : buffer{0} {}

AABB::AABB(const AABB& copy)
{
	buffer[0] = copy.buffer[0];
	buffer[1] = copy.buffer[1];
	buffer[2] = copy.buffer[2];
	buffer[3] = copy.buffer[3];
}

AABB::AABB(float minX, float minY, float maxX, float maxY) :
    buffer{minX, minY, maxX, maxY}
{
}

void AABB::center(Vec2D& out, const AABB& a)
{
	out[0] = (a[0] + a[2]) * 0.5f;
	out[1] = (a[1] + a[3]) * 0.5f;
}

void AABB::size(Vec2D& out, const AABB& a)
{
	out[0] = a[2] - a[0];
	out[1] = a[3] - a[1];
}

void AABB::extents(Vec2D& out, const AABB& a)
{
	out[0] = (a[2] - a[0]) * 0.5;
	out[1] = (a[3] - a[1]) * 0.5;
}

void AABB::combine(AABB& out, const AABB& a, const AABB& b) {}

bool AABB::contains(const AABB& a, const AABB& b)
{
	return a[0] <= b[0] && a[1] <= b[1] && b[2] <= a[2] && b[3] <= a[3];
}

bool AABB::isValid(const AABB& a)
{
	float dx = a[2] - a[0];
	float dy = a[3] - a[1];
	return dx >= 0.0f && dy >= 0.0f && std::isfinite(a[0]) &&
	       std::isfinite(a[1]) && std::isfinite(a[2]) && std::isfinite(a[3]);
}

bool AABB::testOverlap(const AABB& a, const AABB& b)
{
	float d1x = b[0] - a[2];
	float d1y = b[1] - a[3];

	float d2x = a[0] - b[2];
	float d2y = a[1] - b[3];

	if (d1x > 0.0 || d1y > 0.0)
	{
		return false;
	}

	if (d2x > 0.0 || d2y > 0.0)
	{
		return false;
	}

	return true;
}

bool AABB::areIdentical(const AABB& a, const AABB& b)
{
	return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3];
}

float AABB::width() const { return buffer[2] - buffer[0]; }

float AABB::height() const { return buffer[3] - buffer[1]; }

float AABB::perimeter() const
{
	float wx = buffer[2] - buffer[0];
	float wy = buffer[3] - buffer[1];
	return 2.0 * (wx + wy);
}

void AABB::transform(AABB& out, const AABB& a, const Mat2D& matrix)
{
	Vec2D p1(a[0], a[1]);
	Vec2D p2(a[2], a[1]);
	Vec2D p3(a[2], a[3]);
	Vec2D p4(a[0], a[3]);

	Vec2D::transform(p1, p1, matrix);
	Vec2D::transform(p2, p2, matrix);
	Vec2D::transform(p3, p3, matrix);
	Vec2D::transform(p4, p4, matrix);

	out[0] = std::fmin(p1[0], std::fmin(p2[0], std::fmin(p3[0], p4[0])));
	out[1] = std::fmin(p1[1], std::fmin(p2[1], std::fmin(p3[1], p4[1])));
	out[2] = std::fmax(p1[0], std::fmax(p2[0], std::fmax(p3[0], p4[0])));
	out[3] = std::fmax(p1[1], std::fmax(p2[1], std::fmax(p3[1], p4[1])));
}
