/**
 *  \brief     Entity class.
 *  \details   Used to store properties of entities. Entities are domains, boundaries, lines.
 *  \author    vadims
 *  \date      May 9, 2017
 *  \bug       Not all memory is freed when deleting an object of this class.
 *  \warning   Improper use can crash your application
 *  \copyright CENOS LLC
 */

#pragma once

class Element;
class Node;

#include <string>
#include <set>
#include "nlohmann/json.hpp"
#include "topology/TopoEntity.h"
#include "MeshParameters.h"
#include "NetgenWrapper/NetgenWrapper.h"

using json = nlohmann::json;

class MeshEntity: public TopoEntity
{
public:
	~MeshEntity();
	MeshEntity(TopoDS_Shape shape, std::string name, int id = 0);

	//constructor without passing shape
	MeshEntity::MeshEntity(std::string name, int id);

	MeshEntity::MeshEntity(const MeshEntity& that);

	MeshEntity::MeshEntity(const std::shared_ptr<MeshEntity> that);

	void addElement(std::shared_ptr<Element>);
	void addNode(std::shared_ptr<Node>);

	std::vector<std::shared_ptr<Element>> getElements();
	std::vector<std::shared_ptr<Node>> getNodes();

	bool hasNetgenMesh();
	void setMeshParameters(std::shared_ptr<MeshParameters>);
	std::shared_ptr<MeshParameters> getMeshParameters();
	NetgenMesh_ getNetgenMesh();
	NetgenLocalH* getNetgenLocalH();
	void setNetgenMesh(NetgenMesh_);
	void setNetgenLocalH(NetgenLocalH*);

private:
	std::vector<std::weak_ptr<Element>> elements; ///< Elements in the entity.
	std::vector<std::weak_ptr<Node>> nodes; ///< Elements in the entity.
	std::shared_ptr<MeshParameters> mesh_params; //mesh parameters for mesh sizing.
	NetgenMesh_ ng_mesh;
	NetgenLocalH* ng_localh;

};

typedef std::shared_ptr<MeshEntity> MeshEntity_;
