#include "AntennaGeometryBuilder.h"

#include <BRepBuilderAPI_MakeEdge.hxx>
#include <gp_Pnt.hxx>
#include "TopTools_IndexedMapOfShape.hxx"

namespace nglib {
#include "nglib.h"
}

using namespace std;

void createAntennaTemplateGeometry(TopoDS_Shape* shape)
{
	using namespace nglib;

	Ng_OCC_Geometry* occ_geom;

	Ng_Mesh* occ_mesh;

	Ng_Meshing_Parameters mp;

	TopTools_IndexedMapOfShape FMap;

	Ng_OCC_TopTools_IndexedMapOfShape* occ_fmap = (Ng_OCC_TopTools_IndexedMapOfShape*)&FMap;

	// Result of Netgen Operations
	Ng_Result ng_res;

	// Initialise the Netgen Core library
	Ng_Init();

	cout << "Before geom" << endl;
	occ_geom = Cenos_OCC_ShapeToGeometry((Ng_TopoDS_Shape*)shape);
	cout << "After geom" << endl;

	occ_mesh = Ng_NewMesh();

	ng_res = Ng_OCC_GetFMap(occ_geom, occ_fmap);

	cout << "ng_res = " << ng_res << endl;

	if (!FMap.Extent())
	{
		cout << "Error retrieving Face map...." << endl;
		return;
	}

	cout << "Successfully extracted the Face Map....:" << FMap.Extent() << endl;

    mp.uselocalh = 1;
    mp.elementsperedge = 2.0;
    mp.elementspercurve = 2.0;
    mp.maxh = 10.0;
    mp.grading = 0.2;
    mp.closeedgeenable = 0;
    mp.closeedgefact = 1.0;
    mp.optsurfmeshenable = 1;
    mp.fineness = 0.8;


    cout << "Setting Local Mesh size....." << endl;
    cout << "OCC Mesh Pointer before call = " << occ_mesh << endl;
    Ng_OCC_SetLocalMeshSize(occ_geom, occ_mesh, &mp);
    cout << "Local Mesh size successfully set....." << endl;
    cout << "OCC Mesh Pointer after call = " << occ_mesh << endl;

    cout << "Creating Edge Mesh....." << endl;
    ng_res = Ng_OCC_GenerateEdgeMesh(occ_geom, occ_mesh, &mp);
    if (ng_res != NG_OK)
    {
        Ng_DeleteMesh(occ_mesh);
        cout << "Error creating Edge Mesh.... Aborting!!" << endl;
        return;
    }
    else
    {
        cout << "Edge Mesh successfully created....." << endl;
        cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
    }

    cout << "Creating Surface Mesh....." << endl;

    ng_res = Ng_OCC_GenerateSurfaceMesh(occ_geom, occ_mesh, &mp);
    if (ng_res != NG_OK)
    {
        Ng_DeleteMesh(occ_mesh);
        cout << "Error creating Surface Mesh..... Aborting!!" << endl;
        return;
    }
    else
    {
        cout << "Surface Mesh successfully created....." << endl;
        cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
        cout << "Number of surface elements = " << Ng_GetNSE(occ_mesh) << endl;
    }

    cout << "Creating Volume Mesh....." << endl;

    ng_res = Ng_GenerateVolumeMesh(occ_mesh, &mp);

    cout << "Volume Mesh successfully created....." << endl;
    cout << "Number of points = " << Ng_GetNP(occ_mesh) << endl;
    cout << "Number of volume elements = " << Ng_GetNE(occ_mesh) << endl;

    cout << "Saving Mesh as VOL file....." << endl;
    std::string str("TestBoxes");
    str.append(".gmsh");

    //netgen::WriteGmsh2Format(mesh, geometry, str);
    Cenos_ExportMeshToGmesh2(occ_mesh, str.c_str());

	/*std::list<gp_Pnt> point_list;
	for (size_t i = 0; i < 11; i++)
	{
		gp_Pnt aPnt1(0, 0, 0);
		point_list.push_back(aPnt1);
	}





	BRepFill_Filling makeFilling(2);
	for (size_t i = 1; i
	{
		BRepBuilderAPI_MakeEdge makeEdge(m_vecEdgePoints[i - 1], m_vecEdgePoints[i]);
		makeFilling.Add(makeEdge.Edge(), GeomAbs_C0);
	}

	for (size_t i = 0; i
	{
		makeFilling.Add(m_vecFacePoints[i]);
	}

	makeFilling.Build();
	face = makeFilling.Face();*/
}