#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include "mesh_struct.h"
#include "mesh_func.h"
#include "mesh_utils.h"


int main(int argc, char **argv) 
{
	//char filename[128] = "../models/breast.msh";
	char fileMesh[128] = "./pre_mesh.txt";
	char filePosition[128] = "./pre_pos.txt";
	char fileDOF[128] = "./pre_dof.txt";
	char fileMSH[128] = "./breast_pre_surgery.msh";

	char fileTXT[128] = "./breast_pre_surgery.txt";
	char posTXT[128] = "./breast_pre_surgery_pos.txt";
	char dofTXT[128] = "./breast_pre_surgery_dof.txt";

	printf("\nLoading Mesh\n");
	
	Mesh *breastMesh = loadMesh_txt(fileMesh);
	Position *breastPos = loadPosition_txt(filePosition);
	DOF *breastDOF = loadDOF_txt(fileDOF);
	initPosition(breastMesh, breastPos);
	initDOF(breastMesh, breastDOF);
	SParams *breastParams = initParams();
	AuxArch *breastAux = initAuxiliarStructs(breastDOF);
	
	printf("\nNum Nodes: %d\nNum Faces: %d\nNum Cells: %d\n Num Chass: %d\n Num Skin: %d\n", breastMesh->nodes->size, breastMesh->faces->size_all, breastMesh->cells->size, breastMesh->faces->size_chass, breastMesh->faces->size_skin);

	int who = RUSAGE_SELF;
	struct rusage usage;

	clock_t time_clock;
	time_clock = clock();

	recalc_normals(breastMesh, breastPos);

	simulation(breastMesh, breastPos, breastDOF, breastParams, breastAux);
	getrusage(who, &usage);

	time_clock = clock() - time_clock;
	printf("\n\n This action took %f seconds\n\n", ((float)time_clock) / CLOCKS_PER_SEC);

	printf("\n\nMemory Consumption: %ld \n\n",usage.ru_maxrss);

	printf("Writing msh and txt file");
	writeFile_msh(fileMSH, breastMesh, breastPos);
	for(int i = 0; i < breastPos->size; i++)
	{
		breastMesh->nodes->x[i] = breastPos->px[i];
		breastMesh->nodes->y[i] = breastPos->py[i];
		breastMesh->nodes->z[i] = breastPos->pz[i];
	}
	
	writeMesh_txt(fileTXT, breastMesh);
	writePosition_txt(posTXT, breastPos);
	writeDOF_txt(dofTXT, breastDOF);

	printf("\nCleaning Mesh\n");
	cleanAll(breastMesh, breastPos, breastDOF, breastParams, breastAux);
	return 0;
}
