#include "CirclePlane.h"

namespace shapes {
CirclePlane::CirclePlane(float radius,
                         const std::shared_ptr<material::Material>& material)
    : radius(radius), material(material) {
}
std::optional<cam::Hit> CirclePlane::intersect(const cam::Ray& r) const {
	util::Vec3 n(0, 1, 0);
	util::Vec3 x0 = r.x0;
	util::Vec3 d = r.d;

	if (util::dot(d, n) > 0) {
		n = n * -1;
	}
	float a = util::dot(d, n);
	if (a == 0) {
		return std::nullopt;
	} else {
		float t = -x0[1] / d[1];
		util::Vec3 t_hitpoint = r(t);

		if (r.in_range(t) && t_hitpoint.length() <= radius) {
			return std::optional<cam::Hit>({t_hitpoint, n, t, material});
		} else {
			return std::nullopt;
		}
	}
}
util::AxisAlignedBoundingBox CirclePlane::bounds() const {
	return util::AxisAlignedBoundingBox(util::Vec3(-radius, 0, -radius),
	                                    util::Vec3(radius, 0, radius));
}
}  // namespace shapes