#include "jobs\Job.h"
#include "BasicTemplate.h"
#include "topology/geometryData.h"
#include "misc/ProgressIndicator.hpp"
#include "TemplateType.h"
#include "setup/physics.hpp"


class TemplateBuilder
{
public:
	TemplateBuilder(std::shared_ptr<Job> job);

	void buildTemplate();
	void generateMesh();
	void generateGeometry();
	GeometryData_ getGeometryData();
	GeometryData_ getMeshingData();
	void setProgressIndicator(std::shared_ptr<ProgressIndicator>);

	void setStopper(bool*);
	bool validate(std::string &);

private:
	std::string project_path;
	json params;
	std::vector<BasicTemplate_> templates;
	GeometryData_ geom_data;
	std::shared_ptr<ProgressIndicator> progress;
	bool* stopper;

	templateType getTemplateType(json params);

	double mesh_density_factor;
	std::vector<Physics> physics;
	LengthUnit unit;

	double calculatePadding();
	std::pair<double, double> calculateGlobalMeshSizing();
};