#include "l_systeme.h"
#include <string>
vector<regle>::iterator iterR;
vector<regle>::iterator iterR1;
vector<symbole>::iterator iterS;
vector<symbole>::iterator itSR;
axiome nvax;

//constructeur
l_systeme::l_systeme(int a, axiome ax, vector<regle> lesRegles){
  angle = a;
  unAxiome = ax;
  ensRegle = lesRegles;
  nvax = ax;
}
 
void l_systeme::afficheAxiome(){
  unAxiome.affiche();
}

void l_systeme::afficheRegle(){
  for(iterR = ensRegle.begin(); iterR<ensRegle.end(); iterR++){
    regle r = *iterR;
    r.affiche();
  }
}

void l_systeme::afficheAngle(){
  cout<<"valeur de l'angle: "<<angle<<endl;
}

//************************************************************************
//*permet de developper n niveaux, on parcourt les règles du l_système   *
//*et pour chaque symbole de chaque règle, on regarde si ce symbole est  *
//*égal à un des symboles de l'axiome. Si c'est le cas on insere la règle*
//*associée dans le nouvel axiome (vecteur de symboles) sinon on insère  *
//*le symbole de l'axiome************************************************* 

void l_systeme::developpeNiveau(int n){ 
  nvax = unAxiome;
  vector<symbole> ensSymboleNewAxiome;
  for(int i=0; i<n; i++){
    for(iterR1 = ensRegle.begin(); iterR1<ensRegle.end(); iterR1++){
      vector<symbole> ensSymbAxiomeCourant = nvax.getVector();  
      regle r = *iterR1;
      symbole symboleRegle = r.getSymbole();
      vector<symbole> ensSymbRegle = r.getVector();
      for(iterS = ensSymbAxiomeCourant.begin(); iterS<ensSymbAxiomeCourant.end(); iterS++){
	symbole symboleAxiome = *iterS;      
	if(symboleRegle.getNom() == symboleAxiome.getNom()){
	  for(itSR = ensSymbRegle.begin(); itSR<ensSymbRegle.end(); itSR++){
	    symbole symboleCourant = *itSR;	 
	    ensSymboleNewAxiome.push_back(symboleCourant);
	  } 
	}
	else{
	  ensSymboleNewAxiome.push_back(symboleAxiome);
	}
      }
      nvax = axiome(ensSymboleNewAxiome);
      ensSymboleNewAxiome.clear(); 
    }
    // nvax.affiche();
  }
}

int l_systeme::getAngle(){
  return angle;
}

string l_systeme::getSymbNvAxiome(){
  vector<symbole> listeSymb =  nvax.getVector();
  vector<symbole>::iterator it;
  string nvaxio;
  for(it = listeSymb.begin(); it<listeSymb.end(); it++){
    symbole s= *it;
    nvaxio+=s.getNom();
  }
  //cout<<"axiome est"<<nvaxio;
  return nvaxio;
}

axiome l_systeme::getNouvelAxiome(){
  return nvax;
}
