#ifndef PROJECT_SURFACE_POINTS_ON_POLY_H
#define PROJECT_SURFACE_POINTS_ON_POLY_H

#include <vtkUnstructuredGridAlgorithm.h>
#include <vtkIdList.h>
#include <vector>
#include <vtkPolyData.h>
#include <vtkKdTree.h>
#include <vtkStaticCellLinks.h>

class ProjectSurfacePointsOnPoly : public vtkUnstructuredGridAlgorithm {
public:
	static ProjectSurfacePointsOnPoly *New();
	vtkTypeMacro(ProjectSurfacePointsOnPoly, vtkUnstructuredGridAlgorithm);
	ProjectSurfacePointsOnPoly();
	int FillInputPortInformation(int, vtkInformation *info) override;
	vtkTypeBool RequestData(vtkInformation *request,
							vtkInformationVector **inputVector,
							vtkInformationVector *outputVector) override;
	vtkSetMacro(affectedNeighborsCount, int);
	vtkGetMacro(affectedNeighborsCount, int);

	vtkSetMacro(RadiusScale, double);

protected:
	int affectedNeighborsCount = 0;
	double RadiusScale;
	vtkIntArray *isSurface = nullptr;

	~ProjectSurfacePointsOnPoly() override = default;

	void moveSurfacePoint(vtkUnstructuredGrid *tetMesh,
                             vtkPolyData *polyMesh,
                             vtkIdType pointId,
                             std::vector<double> &motionVectors,
                             std::vector<unsigned> &numberOfAffectors,
                             vtkKdTree *polyMeshKdTree,
                             vtkKdTree *tetMeshKdTree,
                             vtkStaticCellLinks *links);
};


#endif
