#include "declaration.h"

Automate::Automate(int test)
{
    system("cls");
    cout << "***Initialisation de l'automate***"<<endl;
//Objet permmettant d'ouvrir le fichier texte
    ifstream lectureFile;

    if (test==1)
    {lectureFile.open("automates_tests/test1.txt");}
    else if (test==2)
    {lectureFile.open("automates_tests/test2.txt");}
    else if (test==3)
    {lectureFile.open("automates_tests/test3.txt");}
    else if (test==4)
    {lectureFile.open("automates_tests/test4.txt");}
    else if (test==5)
    {lectureFile.open("automates_tests/test5.txt");}
    else if (test==6)
    {lectureFile.open("automates_tests/test6.txt");}
    else if (test==7)
    {lectureFile.open("automates_tests/test7.txt");}
    else if (test==8)
    {lectureFile.open("automates_tests/test8.txt");}
    else if (test==9)
    {lectureFile.open("automates_tests/test9.txt");}
    else if (test==10)
    {lectureFile.open("automates_tests/test10.txt");}
    else if (test==11)
    {lectureFile.open("automates_tests/test11.txt");}
    else if (test==12)
    {lectureFile.open("automates_tests/test12.txt");}
    else if (test==13)
    {lectureFile.open("automates_tests/test13.txt");}
    else if (test==14)
    {lectureFile.open("automates_tests/test14.txt");}
    else if (test==15)
    {lectureFile.open("automates_tests/test15.txt");}
    else if (test==16)
    {lectureFile.open("automates_tests/test16.txt");}
    else if (test==17)
    {lectureFile.open("automates_tests/test17.txt");}
    else if (test==18)
    {lectureFile.open("automates_tests/test18.txt");}
    else if (test==19)
    {lectureFile.open("automates_tests/test19.txt");}
    else if (test==20)
    {lectureFile.open("automates_tests/test20.txt");}


                                                //declaration des chaines de lecture des differents champs
    string buffer_parcours;
    string etats_initiaux;
    string etats_finaux;
    string derniere_lettre_alphabet;
    string dernier_etat;
    string buffer_transition;

    do
    {
        lectureFile >> buffer_parcours;             //"Etat initiaux et finaux"
    }while(buffer_parcours!="finaux");

    lectureFile >> etats_initiaux;                  //etats initiaux dans un string
    lectureFile >> etats_finaux;                    //etats finaux dans un string
    lectureFile >> buffer_parcours;                 //"Alphabet"
    lectureFile >> alphabet_max;        //derniere lettre alphabet dans un string
    lectureFile >> buffer_parcours;                 //"Etat"
    lectureFile >> dernier_etat;                    //dernier etat dans un string

    nb_etats = dernier_etat[0] - 48;             // Creation Etats Basiques

    for(int i=0;i<nb_etats;i++)
    {
        Etat etat_cree(i+1);
        tab_etats_basiques.push_back(etat_cree);
    }
                                                    // Mise ŕ "true" des etats initiaux
    for(int i=0 ; i<etats_initiaux.size() ; i++)            //parcours des états initiaux retenus
    {
        for(int j=0;j<tab_etats_basiques.size() ;j++)       //parcours de tous les états basiques
        {
          if(tab_etats_basiques[j].numero==etats_initiaux[i]-48)
            {
                tab_etats_basiques[j].initial=true;
                cout << endl <<"L'etat " << tab_etats_basiques[j].numero <<" est initial" <<endl;
            }
        }

    }

                                                    // Mise ŕ "true" des etats finaux
    for(int i=0 ; i<etats_finaux.size() ; i++)            //parcours des états finaux retenus
    {
        for(int j=0;j<tab_etats_basiques.size() ;j++)       //parcours de tous les états basiques
        {
            if(tab_etats_basiques[j].numero==etats_finaux[i]-48)
            {
                tab_etats_basiques[j].final=true;
                cout << endl <<"L'etat " << tab_etats_basiques[j].numero <<" est final" <<endl;
            }
        }

    }

cout <<endl<< "Voici le fichier charge" << endl<< endl ;
    lectureFile >> buffer_parcours;                  //"Automate"
                                                    //boucle des etats dans des strings
    bool fin=false;
    do
    {
        lectureFile >> buffer_transition;   //par exemple : "1a1"

        if(buffer_transition=="$")
        {fin=true;}
        else
        {
            int rang_etat_1 = buffer_transition[0]-49;
            char lettre_trans = buffer_transition[1];
            int rang_etat_2 = buffer_transition[2]-49;
            cout << rang_etat_1+1<< lettre_trans  << rang_etat_2+1<<endl;

            if(lettre_trans!=tab_etats_basiques[rang_etat_1].tab_transitions.back().lettre) //est-ce que c'est une nouvele transition?
            {
                Transition nouvelle_transition(lettre_trans);
                tab_etats_basiques[rang_etat_1].tab_transitions.push_back(nouvelle_transition);
            }
            Ptr_etat nouv_Ptr_etat;
            nouv_Ptr_etat.ptr_sur_etat = &tab_etats_basiques[rang_etat_2];
            tab_etats_basiques[rang_etat_1].tab_transitions.back().tabPointeur.push_back(nouv_Ptr_etat);
        }
    }while(!fin);
cout << endl;
    system("pause");
}
