#pragma once
#include "topology/GeometryData.h"
#include "MeshGenerator.h"
#include "MeshParameters.h"
#include "nlohmann/json.hpp"

using json = nlohmann::json;

class AutoMeshSize
{
public:
	AutoMeshSize(std::shared_ptr<GeometryData> gd, std::shared_ptr<MeshGenerator> mg, json physics_json, json mesh_params);
	void assign();
	double max_mesh_size;
	double mesh_density_factor; // mesh size multiplication factor
	json generateMeshSetupJson();
	json applyMultiplier(json meshSetup);
	void applyMeshSetupJson(json meshSetup);
private:
	std::shared_ptr<GeometryData> geom_data;
	std::shared_ptr<MeshGenerator> mesh_generator;
	json meshing_config; // is read from /configYaml/meshing/base.yaml

	std::map<std::string, std::shared_ptr<MeshParameters>> getMeshParameters(std::shared_ptr<Group>);
	std::map<std::string, std::pair<double, double>> domain_skinparams;
	double getScalingFactor(std::shared_ptr<Group> gr, std::string type);
	std::vector<std::shared_ptr<Group>> getSortedGroups(std::vector<std::shared_ptr<Group>> groups);

	void analyzePhysics(json physics_json);
	json AutoMeshSize::getRefinmentJson(std::shared_ptr<Group> gr);
};


