#ifndef _RIVE_VEC2D_HPP_
#define _RIVE_VEC2D_HPP_

#include "rive/rive_types.hpp"

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

    public:
        constexpr Vec2D() : m_Buffer{0.0f, 0.0f} {}
        constexpr Vec2D(float x, float y) : m_Buffer{x, y} {}
        constexpr Vec2D(const Vec2D&) = default;

        float x() const { return m_Buffer[0]; }
        float y() const { return m_Buffer[1]; }
        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]; }

        float lengthSquared() const {
            return x() * x() + y() * y();
        }
        float length() const;
        Vec2D normalized() const;

        Vec2D operator-() const { return { -x(), -y() }; }

        void operator*=(float s) {
            m_Buffer[0] *= s;
            m_Buffer[1] *= s;
        }

        friend inline Vec2D operator-(const Vec2D& a, const Vec2D& b) {
            return {a[0] - b[0], a[1] - b[1]};
        }

        static Vec2D lerp(const Vec2D& a, const Vec2D& b, float f);
        static Vec2D transformDir(const Vec2D& a, const Mat2D& m);

        static float dot(Vec2D a, Vec2D b) {
            return a[0] * b[0] + a[1] * b[1];
        }
        static Vec2D scaleAndAdd(Vec2D a, Vec2D b, float scale) {
            return {
                a[0] + b[0] * scale,
                a[1] + b[1] * scale,
            };
        }
        static float distance(const Vec2D& a, const Vec2D& b) {
            return (a - b).length();
        }
        static float distanceSquared(const Vec2D& a, const Vec2D& b) {
            return (a - b).lengthSquared();
        }

        Vec2D& operator+=(Vec2D v) {
            m_Buffer[0] += v[0];
            m_Buffer[1] += v[1];
            return *this;
        }
        Vec2D& operator-=(Vec2D v) {
            m_Buffer[0] -= v[0];
            m_Buffer[1] -= v[1];
            return *this;
        }
    };

    inline Vec2D operator*(const Vec2D& v, float s) {
        return { v[0] * s, v[1] * s };
    }
    inline Vec2D operator*(float s, const Vec2D& v) {
        return { v[0] * s, v[1] * s };
    }
    inline Vec2D operator/(const Vec2D& v, float s) {
        return { v[0] / s, v[1] / s };
    }

    inline Vec2D 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];
    }
    inline bool operator!=(const Vec2D& a, const Vec2D& b) {
        return a[0] != b[0] || a[1] != b[1];
    }
} // namespace rive
#endif
