#ifndef _RIVE_VEC2D_HPP_
#define _RIVE_VEC2D_HPP_

#include <cstddef>

namespace rive
{
    class Mat2D;
    class Vec2D
    {
    private:
        float m_Buffer[2];

    public:
        Vec2D();
        Vec2D(const Vec2D& copy);
        Vec2D(float x, float y);

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

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

        static void transform(Vec2D& result, const Vec2D& a, const Mat2D& m);
        static void transformDir(Vec2D& result, const Vec2D& a, const Mat2D& m);
        static void subtract(Vec2D& result, const Vec2D& a, const Vec2D& b);
        static void add(Vec2D& result, const Vec2D& a, const Vec2D& b);
        static float length(const Vec2D& a);
        static float lengthSquared(const Vec2D& a);
        static float distance(const Vec2D& a, const Vec2D& b);
        static float distanceSquared(const Vec2D& a, const Vec2D& b);
        static void copy(Vec2D& result, const Vec2D& a);
        static void normalize(Vec2D& result, const Vec2D& a);
        static float dot(const Vec2D& a, const Vec2D& b);
        static void lerp(Vec2D& o, const Vec2D& a, const Vec2D& b, float f);
        static void scale(Vec2D& o, const Vec2D& a, float scale);
        static void
        scaleAndAdd(Vec2D& o, const Vec2D& a, const Vec2D& b, float scale);
        static void negate(Vec2D& o, const Vec2D& a);
    };

    inline Vec2D operator*(const Mat2D& a, const Vec2D& b)
    {
        Vec2D result;
        Vec2D::transform(result, b, a);
        return result;
    }

    inline Vec2D operator-(const Vec2D& a, const Vec2D& b)
    {
        Vec2D result;
        Vec2D::subtract(result, a, b);
        return result;
    }

    inline Vec2D operator+(const Vec2D& a, const Vec2D& b)
    {
        Vec2D result;
        Vec2D::add(result, a, b);
        return result;
    }

    inline bool operator==(const Vec2D& a, const Vec2D& b)
    {
        return a[0] == b[0] && a[1] == b[1];
    }
    inline bool operator!=(const Vec2D& a, const Vec2D& b)
    {
        return a[0] != b[0] || a[1] != b[1];
    }
} // namespace rive
#endif