#ifndef __M_SIMULATION_H
#define __M_SIMULATION_H 

#include "m_mass.h"

class Simulation
{
public:
	unsigned int nb_masses;	// nombre de masses
	Mass			   **m;				// Tableau de pointeurs de Mass

	// n Masses ponctuelles de masse M
	Simulation(unsigned int n, float  M) 
	{
		nb_masses = n;
		m = new Mass* [nb_masses];			// On créée notre tableau de pointeurs

		for (unsigned int i=0;i<nb_masses;i++)
			m[i] = new Mass(M);
	}

	// n Masses ponctuelles de masse M
	Simulation(unsigned int n, float  *M) 
	{
		nb_masses = n;
		m = new Mass* [nb_masses];			// On créée notre tableau de pointeurs
		for (unsigned int i=0;i<nb_masses;i++)
			m[i] = new Mass(M[i]);
	}

	~Simulation()
	{
		for (int a = 0; a < nb_masses; ++a)		// we will delete all of them
		{
			delete [] m[a];
			m[a] = 0;
		}
			
		delete [] m;
		m = 0;
	}

	// effacer
	virtual void Release()
	{
		for (int a = 0; a < nb_masses; ++a)		// we will delete all of them
		{
			delete [] m[a];
			m[a] = 0;
		}
			
		delete [] m;
		m = 0;
	}
	
	
	virtual void Init()	
	{
		for (int a = 0; a < nb_masses; ++a)	
			m[a]->initForce();	
	}

	virtual void Solve()	 = 0;

	virtual void Simulate(float dt)					// Une itération de delta_t
	{
		for (int a = 0; a < nb_masses; ++a)		// a chaque itération ,on bouge chaque masses
			m[a]->Simulation(dt);
	}

	virtual void Operate(float dt)			// la procédure entière
	{
		Init();										// 1: On remet a 0 les forces
		Solve();										// 2: On les applique
		Simulate(dt);								// 3: Simulation
	}


	Mass* getMass(int index)
	{
		if (index < 0 || index >= nb_masses)		// Si c'est pas dans les dimensions
			return 0;											// on retourne 0
		return m[index];									// On a la masse choisie
	}

};


#endif