
#pragma once

#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <chrono>
#include <sstream>
#include <string>
#include "Mesh.h"
#include "Mesh_IO.h"

class OFMesh_IO : public Mesh_IO
{

public:
	OFMesh_IO();

	//instances of virtual functions for reading and writing mesh
	void readMesh(std::string&, Mesh*);

	void writeMesh(std::string&, Mesh*);


private:
	void writePoints(std::string&, Mesh* mesh);
	void writeFaces(std::string&, Mesh* mesh);
	void writeOwner(std::string&, Mesh* mesh);
	void writeNeighbour(std::string&, Mesh* mesh);
	void writeBoundary(std::string&, Mesh* mesh);

	void calculateFaces(Mesh* mesh);

	std::vector<Face> faces;

	// OF specific boundary writing
	// for boundary file
	std::vector<std::string> boundary_names;
	std::map<std::string,int> boundary_lenght;
	std::map<std::string, int> boundary_start;

	//translate node ids to their OF ids 
	std::map<int, int> nodes_for_of;
	//translate cell ids to their OF ids 
	std::map<int, int> cells_for_of;

};
