#ifndef _RIVE_AABB_HPP_
#define _RIVE_AABB_HPP_

#include "rive/math/mat2d.hpp"
#include "rive/math/vec2d.hpp"
#include <cstddef>

namespace rive {
    struct IAABB {
        int32_t left, top, right, bottom;
        
        constexpr int width() const { return right - left; }
        constexpr int height() const { return bottom - top; }
        constexpr bool empty() const { return width() <= 0 || height() <= 0; }

        IAABB inset(int dx, int dy) const {
            return {left + dx, top + dy, right - dx, bottom - dy};
        }
        IAABB offset(int dx, int dy) const {
            return {left + dx, top + dy, right + dx, bottom + dy};
        }
    };

    class AABB {
    public:
        union {
            float buffer[4];
            struct {
                float minX, minY, maxX, maxY;
            };
        };

    public:
        AABB() : buffer{0} {}
        AABB(const AABB& o) :
            minX(o.minX), minY(o.minY), maxX(o.maxX), maxY(o.maxY)
        {}

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

        AABB(const IAABB& o) :
            AABB((float)o.left, (float)o.top, (float)o.right, (float)o.bottom)
        {}

        bool operator==(const AABB& o) const {
            return minX == o.minX && minY == o.minY &&
                   maxX == o.maxX && maxY == o.maxY;
        }
        bool operator!=(const AABB& o) const {
            return !(*this == o);
        }

        inline const float* values() const { return buffer; }

        float& operator[](std::size_t idx) { return buffer[idx]; }
        const float& operator[](std::size_t idx) const { return buffer[idx]; }

        static bool contains(const AABB& a, const AABB& b);
        static bool isValid(const AABB& a);
        static bool testOverlap(const AABB& a, const AABB& b);
        static bool areIdentical(const AABB& a, const AABB& b);
        static void transform(AABB& out, const AABB& a, const Mat2D& matrix);

        float left() const { return minX; }
        float top() const { return minY; }
        float right() const { return maxX; }
        float bottom() const { return maxY; }

        float width() const { return maxX - minX; }
        float height() const { return maxY - minY; }
        Vec2D size() const {
            return {width(), height()};
        }
        Vec2D center() const {
            return {(minX + maxX) * 0.5f, (minY + maxY) * 0.5f};
        }

        AABB inset(float dx, float dy) const {
            AABB r = {minX + dx, minY + dy, maxX - dx, maxY - dy};
            assert(r.width() >= 0);
            assert(r.height() >= 0);
            return r;
        }
        AABB offset(float dx, float dy) const {
            return {minX + dx, minY + dy, maxX + dx, maxY + dy};
        }

        IAABB round() const;
    };

} // namespace rive
#endif
