/*
 * Copyright 2022 Rive
 */

#ifndef _RIVE_HITTEST_HPP_
#define _RIVE_HITTEST_HPP_

#include "rive/span.hpp"
#include "rive/math/aabb.hpp"
#include "rive/math/path_types.hpp"
#include "rive/math/vec2d.hpp"

#include <cstdint>
#include <vector>

namespace rive {

    class HitTester {
        std::vector<int> m_DW; // width * height delta-windings
        Vec2D m_First, m_Prev;
        Vec2D m_offset;
        float m_height;
        int m_IWidth, m_IHeight;
        bool m_ExpectsMove;

        void recurse_cubic(Vec2D b, Vec2D c, Vec2D d, int count);

    public:
        HitTester() {}
        HitTester(const IAABB& area) { reset(area); }

        void reset();
        void reset(const IAABB& area);

        void move(Vec2D);
        void line(Vec2D);
        void quad(Vec2D, Vec2D);
        void cubic(Vec2D, Vec2D, Vec2D);
        void close();

        void addRect(const AABB&, const Mat2D&, PathDirection = PathDirection::ccw);

        bool test(FillRule = rive::FillRule::nonZero);

        static bool testMesh(Vec2D point, Span<Vec2D> verts, Span<uint16_t> indices);
        static bool testMesh(const IAABB&, Span<Vec2D> verts, Span<uint16_t> indices);
    };

} // namespace rive
#endif
