/*
Si realizzi un programma per la creazione e la consultazione di cataloghi di
vendita di automobili nuove. Il programma, prima di tutto, deve consentire
all'utente l'inserimento dei nuovi modelli, tenendo conto delle versioni e
delle dotazioni di serie o a richiesta (per queste ultime si vuole avere il
prezzo). Quindi il programma deve consentire la consultazione aiutando nella
scelta del modello e nella composizione degli allestimenti, indicando il prezzo
finale. Si realizzi il programma in modo da non limitare in alcun modo il numero
di modelli e di dotazioni per ciascun modello.
*/
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <string.h>

using namespace std;

//DICHIARAZIONE FLUSSO FILE///////////////////////////////////////////
ifstream fin;
ofstream fout;
//DICHIARAZIONE TIPI VARIBILE/////////////////////////////////////////
struct ARTICOLO1
{
    char colore[50];
    double prezzo;
    ARTICOLO1 *next;
};
struct ARTICOLO2
{
    char nome[100];
    double prezzo;
    char optional_alternativi[100];
    char id[3];
    ARTICOLO2 *next;
};
struct ARTICOLO3
{
    char nome[50];
    char optional_serie[500];
    char optional_inseribili[500];
    char motore_nome[50];
    double prezzo;
    ARTICOLO3 *next;
};
struct  AUTOMOBILE
{
   char marca[20];
   char nome[20];
   ARTICOLO1 colore;
   ARTICOLO2 optional;
   ARTICOLO3 allestimento;
   ARTICOLO1 *head_colore;
   ARTICOLO2 *head_optional;
   ARTICOLO3 *head_allestimento;
};
struct LISTA_CATALOGO
{
   AUTOMOBILE catalogo;
   LISTA_CATALOGO *next;
};
//DICHIARAZIONE VARIABILI GLOBALI/////////////////////////////////////
LISTA_CATALOGO *head_catalogo=NULL;
//DICHIARAZIONE FUNZIONI//////////////////////////////////////////////
void menu();
void pulisci();
int help();
int nuova_automobile();
void intercetta();
int dividi_stringa(char *da_dividere, char *divisore, char *diviso_1,char *diviso_2);
double inserisci_numero();
void pausa();
void stampa_optional(ARTICOLO2 *head_opt);
int scegli_automobile();
int categoria_optional(char *id, char *optional_type);
//MAIN FUNCTION///////////////////////////////////////////////////////
int main()
{
      pulisci();
      menu();
      return 0;
}
//MENU'//////////////////////////////////////////////////////////////
void menu()
{
     int scelta_menu;
     do
     {
       pulisci();
       cout<<"1 - Inserisci automobile"<<'\n'
           <<"2 - Scelta automobile"<<'\n'
           <<"3 - Help"<<'\n'<<'\n'
           <<"0 - Esci dal programma"<<'\n'<<'\n'
           <<"Effettua la tua scelta: ";
       cin>>scelta_menu;
       switch(scelta_menu)
       {  case 1:
          {
             nuova_automobile();pausa();break;
          }
          case 2:
          {
             pulisci();scegli_automobile();pausa();break;
          }
          case 3:
          {
             pulisci();help();break;
          }
       }
     }
     while(scelta_menu!=0);
}
//PULISCI SCHERMO////////////////////////////////////////////////////
void pulisci()
{
     system("CLS");
     cout<<"CarCHOSER 1.0 - Riva Antonio - Progetto Esame Informatica 1 - AA 02-03"<<'\n'
         <<"----------------------------------------------------------------------"<<'\n'<<'\n';
}
//HELP////////////////////////////////////////////////////////////////
int help()
{
   char buffer[210];
   int i;
   fin.open("help.help");
   if(fin.fail())
   {  cout<<"!!! File non trovato !!!";
      return 1;
   }
   while(fin.getline(buffer,200,'\n'))
   {  pulisci();
      cout<<buffer<<"\n";
      for(i=0;i<10;i++)
      {  fin.getline(buffer,200,'\n');
         cout<<buffer<<"\n";
      }
      pausa();
   }fin.close();
   return 1;
}
//INSERISCI_automobile///////////////////////////////////////////////////
int nuova_automobile()
{
     ofstream fout;
     ofstream fout1;
     ifstream fin;
     AUTOMOBILE nuovo;
     char buffer[100];
     char buffer1[100];
     char diviso1[100];
     char optional_stessa_categoria[100];
     char checkid[4];
     int scelta_optional;
     int nv_ciclo=0;
     int id_optional=0;
     int stop,stop1,stop2;
     int i,k,j;
     struct OPT_CATEGORIA
     {
       char lista_id[100];
       OPT_CATEGORIA *next;
     };
//MARCA
     cout<<"Inserisci la marca dell'automobile da inserire (max 20 caratteri): "<<'\n';
     intercetta();
     cin.getline(nuovo.marca,19);
//NOME
     cout<<'\n'<<"Inserisci il nome dell'automobile da inserire (max 20 caratteri): "<<'\n';
     cin.getline(nuovo.nome,19);
     fout.open("automobili.txt", ios::app);
     fout<<nuovo.marca<<"<-marca> ";
     fout<<nuovo.nome<<"<-nome> ";
//COLORE
     nv_ciclo=0;
     do
     {
         pulisci();
         cout<<'\n'<<"Inserisci un colore disponibile per questa automobile (max 20 caratteri): "
             <<'\n'<<"scrivi \"stop\" per terminare l\'inserimento"<<'\n';
         cin.getline(nuovo.colore.colore,49);
         if(strcmp(nuovo.colore.colore,"stop"))
         {
            fout<<nuovo.colore.colore<<"<-colore> ";
            cout<<'\n'<<"Inserisci il sovraprezzo per questo colore: ";
            nuovo.colore.prezzo=inserisci_numero();
            fout<<nuovo.colore.prezzo<<"<-euro_colore> ";
         }
         nv_ciclo++;
     }while(strcmp(nuovo.colore.colore,"stop"));
///OPTIONAL
     nv_ciclo=0;
     fout1.open("optional.tmp",ios::out);
     do
     {
         pulisci();
         cout<<'\n'<<"Inserisci un optional disponibile per questa automobile (max 50 caratteri): "
             <<'\n'<<"scrivi \"stop\" per terminare l\'inserimento"<<'\n';
         cin.getline(nuovo.optional.nome,99);
         if(strcmp(nuovo.optional.nome,"stop"))
         {
            cout<<'\n'<<"Inserisci il prezzo in euro di questo articolo: "<<'\n';
            nuovo.optional.prezzo=inserisci_numero();
            id_optional=(111+nv_ciclo);
            fout1<<id_optional<<"<-optional_id> "
                 <<nuovo.optional.nome<<"<-optional> "
                 <<nuovo.optional.prezzo<<"<-euro_optional> "<<'\n';
         }
         nv_ciclo++;
     }while(strcmp(nuovo.optional.nome,"stop"));
     fout1.close();
//OPTIONAL ALTARNATIVI
     ARTICOLO2 *opt;
     ARTICOLO2 *head_opt=NULL;
     ARTICOLO2 *uso_opt;
     fin.open("optional.tmp");
     if(fin.fail())
     {
        cout<<"!!! File non trovato !!!";
        return 1;
     }
     while(fin.getline(buffer,200,'\n'))
     {
         opt=new ARTICOLO2;
         if(opt==NULL)
         {
            cout<<"!! Memoria esaurira !!";
            return 1;
         }
         dividi_stringa(buffer,"<-optional_id> ",opt->id,buffer1);
         dividi_stringa(buffer1,"<-optional> ",opt->nome,buffer);
         dividi_stringa(buffer,"<-euro_optional> ",diviso1,buffer1);
         opt->prezzo=atof(diviso1);
         opt->next=head_opt;
         head_opt=opt;
     }
     fin.close();
//stampa optional
     uso_opt=head_opt;pulisci();
     cout<<"Di seguito verranno stampati gli ID di tutti gli optional inseriti\n"
         <<"precedentemente. E' necessario che l'utente dichiari quali optional\n"
         <<"sono uno l'altarnativa dell'altro. Per eseguire questa operazione\n"
         <<"l'utente deve scrivere uno di seguito agli altri gli id degli \n"
         <<"optional da considerarsi alternative.\n"
         <<"ATTENZIONE, un optional puo' appartenere ad una sola categoria\n"
         <<"se si tenta di riutilizzarlo si perderanno le informazioni\n"
         <<"precedentemente inserite."<<'\n'<<'\n';
     pausa();
     stop=0;
     do
     {
        pulisci();
        stampa_optional(head_opt);
        cout<<'\n'
            <<"Inserire ora gli ID degli optional della stessa classe\n"
            <<"Premi 'stop' per fermarti, 'lista' per rivedere la lista degli optional\n";
        cin.getline(optional_stessa_categoria,99);
        if(strcmp(optional_stessa_categoria,"stop")==0){stop=1;}
        else if(!(strcmp(optional_stessa_categoria,"lista")==0))
        {
//controllo categoria optional
           i=0;
           stop2=0;
           stop1=0;
           do
           {
              for(k=0;k<3;k++)
              {
                 checkid[k]=optional_stessa_categoria[k+(3*i)];
              }
              checkid[3]='\0';
              uso_opt=head_opt;
              do
              {
                if(strcmp(uso_opt->id,checkid)!=0){stop2=1;}
                uso_opt=uso_opt->next;
              }while(uso_opt!=NULL);
              i++;
              if(optional_stessa_categoria[(i*3)-3]=='\0')
              {
                 stop1=1;
              }else if(
                (optional_stessa_categoria[(i*3)-2]=='\0')||
                (optional_stessa_categoria[(i*3)-1]=='\0'))
              {
                 stop1=2;
              }
              if(stop2==0){stop1=2;}
           }while(!((stop1==1)||(stop1==2)));
           if(stop1==2){
              cout<<"\nC'e' stato un errore nel tuo inserimento, reiserire!\n";
           }else{
              i=0;
              stop1=0;
              do
              {
                 for(k=0;k<3;k++)
                 {
                    checkid[k]=optional_stessa_categoria[k+(3*i)];
                 }
                 checkid[3]='\0';
                 uso_opt=head_opt;
                 do
                 {
                   if(strcmp(uso_opt->id,checkid)==0)
                   {
                      strcpy(uso_opt->optional_alternativi,optional_stessa_categoria);
                   }
                   uso_opt=uso_opt->next;
                 }while(uso_opt!=NULL);
                 i++;
                 if(optional_stessa_categoria[(i*3)-3]=='\0')
                 {
                    stop1=1;
                 }
              }while(stop1!=1);
              cout<<"\nInserimento effettuato correttamente!\n";
           }pausa();
        }
     }while(stop!=1);
//scrittura optional
     uso_opt=head_opt;
     do
     {
       fout<<uso_opt->id<<"<-optional_id> ";
       fout<<uso_opt->nome<<"<-optional> ";
       fout<<uso_opt->prezzo<<"<-euro_optional> ";
       fout<<uso_opt->optional_alternativi<<"<-alternativi_optional> ";
       uso_opt=uso_opt->next;
     }while(uso_opt!=NULL);
//ALLESTIMENTI
     nv_ciclo=0;
     do
     {   pulisci();
         cout<<'\n'<<"Inserisci un tipo di allestimento disponibile"
			 <<'\n'<<"per questa automobile (max 50 caratteri): "
             <<'\n'<<"scrivi \"stop\" per terminare l\'inserimento"<<'\n';
         if(nv_ciclo!=0){intercetta();}
         cin.getline(nuovo.allestimento.nome,49);
         if(strcmp(nuovo.allestimento.nome,"stop"))
         {
//MOTORI
            pulisci();
		   	cout<<'\n'<<"Inserisci la motorizzazione disponibile per questo allestimento: "<<'\n';
			cin.getline(nuovo.allestimento.motore_nome,49);
            cout<<'\n'<<"Inserisci il prezzo base in euro di questo allestimento: "<<'\n';
			nuovo.allestimento.prezzo=inserisci_numero();
			fout<<nuovo.allestimento.nome<<"<-nome_allestimento> "
                <<nuovo.allestimento.motore_nome<<"<-motore> "
                <<nuovo.allestimento.prezzo<<"<-euro_allestimento> ";
//OPTIONAL DISPONIBILI
			fin.open("optional.tmp");
            if(fin.fail())
            {
               cout<<"!!! File non trovato !!!";
               return 1;
            }
            nuovo.allestimento.optional_inseribili[0]='\0';
            nuovo.allestimento.optional_serie[0]='\0';
        	while(fin.getline(buffer,200,'\n'))
            {
               dividi_stringa(buffer,"<-optional_id> ",nuovo.optional.id,buffer1);
               dividi_stringa(buffer1,"<-optional> ",nuovo.optional.nome,buffer);
               pulisci();
               cout<<"Questo prodotto e' un optional disponibile per questo allestimento?"
                   <<'\n'<<'\n'
                   <<"id:    "<<nuovo.optional.id<<'\n'
                   <<"nome:  "<<nuovo.optional.nome<<'\n'<<'\n'
				   <<"'1' per 'optional di serie'"<<'\n'
                   <<"'2' per 'optional a pagamento'"<<'\n'
				   <<"'3' per 'optional non disponibile'"<<'\n';
               cin>>scelta_optional;
               switch(scelta_optional)
               {
                  case 1:
                  {
                     strcat(nuovo.allestimento.optional_serie,nuovo.optional.id);
					 break;
				  }
				  case 2:
                  {
                     strcat(nuovo.allestimento.optional_inseribili,nuovo.optional.id);
                  }
               }
            }
            fin.close();
            fout<<nuovo.allestimento.optional_serie<<"<-optional_serie> "
			    <<nuovo.allestimento.optional_inseribili<<"<-optional_inseribili> ";
         } nv_ciclo++;
     }while(strcmp(nuovo.allestimento.nome,"stop"));
     fout.close();
     return 1;
}
//INTERCETTAZIONE INVIO DOPO CIN.GET//////////////////////////////////
void intercetta()
{
   char comodo[3];//variabile di intercettazione invio
   cin.getline(comodo,10);
}
//DIVIDI STRINGA//////////////////////////////////////////////////////
int dividi_stringa(char *da_dividere, char *divisore, char *diviso_1,char *diviso_2)
{
   int dividi=0;
   int stop=0;
   int k=0;
   int i=0;
   int controllo_divisore=0;
   int len_divisore=0, stop_1st=0;
   len_divisore=strlen(divisore);
   diviso_1[0]='\0';
   diviso_2[0]='\0';
   do
   {
      if(da_dividere[i]==divisore[0])
      {
         stop_1st=i;
         controllo_divisore=0;
         for(k=0;k<len_divisore;k++)
         {
            if(da_dividere[i+k]!=divisore[k])
            {
               controllo_divisore=1;
            }
         }
         if(controllo_divisore==0){stop=1;}
      }
      if(da_dividere[i]=='\0'){dividi=1;stop=1;}
      i++;
   }while(stop!=1);
   if(dividi!=1)
   {
       for(i=0;i<stop_1st;i++)
       {
          diviso_1[i]=da_dividere[i];
       }
       diviso_1[i]='\0';
       i+=len_divisore;
       k=0;
       while(da_dividere[i]!='\0')
       {
          diviso_2[k]=da_dividere[i];
          k++;
          i++;
       }
       diviso_2[k]='\0';
   }else{
      strcpy(diviso_2,da_dividere);
      diviso_1[0]='\0';
      return 1;
   }
   return 0;
}
//INSERISCI PREZZO////////////////////////////////////////////////////
double inserisci_numero()
{
   char prezzo[100];
   int i=0;
   int stop=0;
   int check=0;
   double prezzo_doubl;
   cin.getline(prezzo,99);
   do
   {
     check=0;
     i=0;
     while(prezzo[i]!='\0')
     {
         if(!((prezzo[i]=='0')||(prezzo[i]=='1')||(prezzo[i]=='2')||(prezzo[i]=='3')||
             (prezzo[i]=='4')||(prezzo[i]=='5')||(prezzo[i]=='6')||(prezzo[i]=='7')||
             (prezzo[i]=='8')||(prezzo[i]=='9')||(prezzo[i]=='.')))
          {
             check=1;
          }i++;
     }
     stop=0;
     if(check==1)
     {
        cout<<'\n'<<"Questo tipo di dato puo' contenere un numero, Reinserisci."<<'\n';
        cin.getline(prezzo,99);
     }else{
        stop=1;
     }
   }while(stop!=1);
   prezzo_doubl=atof(prezzo);
   return prezzo_doubl;
}
//PAUSA///////////////////////////////////////////////////////////////
void pausa()
{
   system("PAUSE");
}
//////////////////////////////////////////////////////////////////////
//STAMPA OPTIONAL/////////////////////////////////////////////////////
void stampa_optional(ARTICOLO2 *head_opt)
{
     int i,k;
     int stop;
     ARTICOLO2 *uso_opt;
     uso_opt=head_opt;pulisci();
     cout<<"|Id |Descrizione Optional         ||Id |Descrizione Optional         |"<<'\n'
         <<"----------------------------------------------------------------------"<<'\n';
     k=0;
     while(uso_opt!=NULL)
     {
        if(uso_opt!=NULL)
        {
           if(uso_opt->optional_alternativi[0]=='\0')
           {
              cout<<"|"<<uso_opt->id<<"|";
           }else{
              cout<<"|"<<"---"<<"|";
           }
           stop=0;
           for(i=0;i<29;i++)
           {
              if(uso_opt->nome[i]=='\0'){stop=1;}
              if(stop==1)
              {
                 cout<<" ";
              }else{
                 cout<<uso_opt->nome[i];
              }
           }
           uso_opt=uso_opt->next;
        }
        if(uso_opt!=NULL)
        {
           if(uso_opt->optional_alternativi[0]=='\0')
           {
              cout<<"|"<<uso_opt->id<<"|";
           }else{
              cout<<"|"<<"---"<<"|";
           }
           stop=0;
           for(i=0;i<29;i++)
           {
              if(uso_opt->nome[i]=='\0'){stop=1;}
              if(stop==1)
              {
                 cout<<" ";
              }else{
                 cout<<uso_opt->nome[i];
              }
           }
           uso_opt=uso_opt->next;
        }
        cout<<"|"<<'\n';     k++;
        if(k%15==0)
        {
           cout<<"Alcune righe potrebbero scomparire, annotarsi gli ID interessati."<<'\n';
        }
     }
}
//SCELTA AUTOMOBILE///////////////////////////////////////////////////
int scegli_automobile()
{
   char buffer[10000];
   char diviso_1[1000];
   char diviso_2[10000];
   char nome_file[100];
   int contr_dividi=0;
   int i,k,j;
   int id;
   int stop,stop1,stop2;
   int nv_ciclo=0;
   int nv_ciclo1=0;
   char checkid[4];
   int scelta;
   char optional_trattati[500];
   fin.open("automobili.txt");
   if(fin.fail())
   {
      cout<<"!!! File non trovato !!!";
      return 1;
   }
nv_ciclo=0;
while(fin.getline(buffer,10000,'\n'))
   {
   LISTA_CATALOGO *t;
   t=new LISTA_CATALOGO;
   if(t==NULL)
   {
       cout<<"!! Memoria esaurira !!";
       return 1;
   }
//marca
   dividi_stringa(buffer, "<-marca> ", diviso_1, diviso_2);
   strcpy(buffer,diviso_2);
   strcpy(t->catalogo.marca,diviso_1);
//nome
   dividi_stringa(buffer, "<-nome> ", diviso_1, diviso_2);
   strcpy(buffer,diviso_2);
   strcpy(t->catalogo.nome,diviso_1);
//COLORE
   ARTICOLO1 *color;
   ARTICOLO1 *color_pre;
   contr_dividi=dividi_stringa(buffer, "<-colore> ", diviso_1, diviso_2);
   nv_ciclo=0;
   while(contr_dividi==0)
   {
      color=new ARTICOLO1;
      if(nv_ciclo==0)
      {
         color->next=NULL;
         t->catalogo.head_colore=color;
      }else{
         color->next=color_pre;
         t->catalogo.head_colore=color;
      }
      nv_ciclo++;
      color_pre=color;
      if(color==NULL)
      {   cout<<"!! Memoria esaurira !!";
          return 1;
      }
      dividi_stringa(buffer, "<-colore> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(color->colore,diviso_1);
      dividi_stringa(buffer, "<-euro_colore> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      color->prezzo=atof(diviso_1);
      contr_dividi=dividi_stringa(buffer, "<-colore> ", diviso_1, diviso_2);
   }
//OPTIONAL
   ARTICOLO2 *option;
   ARTICOLO2 *option_pre;
   contr_dividi=dividi_stringa(buffer, "<-optional_id> ", diviso_1, diviso_2);
   nv_ciclo=0;
   while(contr_dividi==0)
   {  option=new ARTICOLO2;
      if(nv_ciclo==0)
      {  option->next=NULL;
         t->catalogo.head_optional=option;
      }else{
         option->next=option_pre;
         t->catalogo.head_optional=option;
      }
      nv_ciclo++;
      option_pre=option;
      if(option==NULL)
      {   cout<<"!! Memoria esaurira !!";
          return 1;
      }
      dividi_stringa(buffer, "<-optional_id> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(option->id,diviso_1);
      dividi_stringa(buffer, "<-optional> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(option->nome,diviso_1);
      dividi_stringa(buffer, "<-euro_optional> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      option->prezzo=atof(diviso_1);
      dividi_stringa(buffer, "<-alternativi_optional> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(option->optional_alternativi,diviso_1);
      contr_dividi=dividi_stringa(buffer, "<-optional> ", diviso_1, diviso_2);
   }
//ALLESTIMENTO
   ARTICOLO3 *allest;
   ARTICOLO3 *allest_pre;
   contr_dividi=dividi_stringa(buffer, "<-motore> ", diviso_1, diviso_2);
   nv_ciclo=0;
   while(contr_dividi==0)
   {
      allest=new ARTICOLO3;
      if(nv_ciclo==0)
      {  allest->next=NULL;
         t->catalogo.head_allestimento=allest;
      }else{
         allest->next=allest_pre;
         t->catalogo.head_allestimento=allest;
      }
      nv_ciclo++;
      allest_pre=allest;
      if(allest==NULL)
      {   cout<<"!! Memoria esaurira !!";
          return 1;
      }
      dividi_stringa(buffer, "<-nome_allestimento> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(allest->nome,diviso_1);
      dividi_stringa(buffer, "<-motore> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(allest->motore_nome,diviso_1);
      dividi_stringa(buffer, "<-euro_allestimento> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      allest->prezzo=atof(diviso_1);
      dividi_stringa(buffer, "<-optional_serie> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(allest->optional_serie,diviso_1);
      dividi_stringa(buffer, "<-optional_inseribili> ", diviso_1, diviso_2);
      strcpy(buffer,diviso_2);
      strcpy(allest->optional_inseribili,diviso_1);
      contr_dividi=dividi_stringa(buffer, "<-nome_allestimento> ", diviso_1, diviso_2);
   }
//GESTIONE PUNTATORI
   if(nv_ciclo1==0)
   {  t->next=NULL;
      head_catalogo=t;
      nv_ciclo1=1;
   }else{
      t->next=head_catalogo;
      head_catalogo=t;
   }
   }
   fin.close();pulisci();
   cout<<"Inserire il nome ed il cognome del cliente:\n";
   intercetta();   cin.getline(nome_file,100);
   strcat(nome_file,".txt");
   fout.open(nome_file,ios::out);pulisci();
   cout<<"Di seguito verranno elencati i modelli disponibili, annotarsi il codice\n"
       <<"del modello scelto.\n\n";
//chiedi modello
   LISTA_CATALOGO *uso_cat;
   do
   {  uso_cat=head_catalogo; //impostazione della testa
      i=0;
      while(uso_cat!=NULL)
      {  i++;
         cout<<i<<"| "<<uso_cat->catalogo.marca<<" - "<<uso_cat->catalogo.nome<<"\n";
         uso_cat=uso_cat->next;
         if((i%8==0)&&(uso_cat!=NULL))
         {  cout<<"\nIl numero di modelli presenti e' piu' alto di queli visualizzabili\n"
                <<"annotarsi il codice del modello scelto perche' potrebbe scomparire dallo\n"
                <<"schermo.\n\n";
            pausa();
         }
      }
      cout<<"\nInserire il codice ID dell' automobile desiderata: ";
      id=(int)inserisci_numero();
      uso_cat=head_catalogo; //impostazione della testa
      i=0;
      stop=0;
      while(!((uso_cat==NULL)||(stop==1)))
      {  i++;
         if(i==id)
         {  fout<<uso_cat->catalogo.marca
                <<'\n'<<uso_cat->catalogo.nome<<'\n';
            stop=1;
         }else{
            uso_cat=uso_cat->next;
         }
      }
      if(stop==0){pulisci();
      cout<<"Inserimento effettuato in maniera errata, reinserire!\n\n";pausa();}
   }while(stop==0);
//chiedi allestimento
   pulisci();
   cout<<"Di seguito verranno elencati gli allestimenti disponibili, annotarsi \n"
       <<"il codice dell'allestimento scelto.\n\n";
   ARTICOLO3 *uso_allest;
   do
   {
      uso_allest=uso_cat->catalogo.head_allestimento; //impostazione della testa
      i=0;
      while(uso_allest!=NULL)
      {
         i++;
         cout<<i<<"| "<<uso_allest->nome<<" - "<<uso_allest->prezzo<<" euro\n";
         uso_allest=uso_allest->next;
         if((i%8==0)&&(uso_allest!=NULL))
         {     cout<<"\nIl numero di allestimenti presenti e' piu' alto di queli visualizzabili\n"
                   <<"annotarsi il codice dell'allestimento scelto perche' potrebbe scomparire\n"
                   <<"dallo schermo.\n\n";
               pausa();
         }
      }
      cout<<"\nInserire il codice ID dell'allestimento desiderato: ";
      id=(int)inserisci_numero();
      uso_allest=uso_cat->catalogo.head_allestimento; //impostazione della testa
      i=0;
      stop=0;
      while(!((uso_allest==NULL)||(stop==1)))
      {     i++;
            if(i==id)
            {  fout<<uso_allest->nome<<'\n'
                   <<uso_allest->motore_nome<<'\n'
                   <<uso_allest->prezzo<<'\n';
               stop=1;
            }else{
               uso_allest=uso_allest->next;
            }
      }
      if(stop==0){pulisci();cout<<"Inserimento effettuato in maniera errata, reinserire!\n\n";pausa();}
   }while(stop==0);
//chiedi colore
   pulisci();
   cout<<"Di seguito verranno elencati i colori disponibili, annotarsi \n"
       <<"il codice delcolore scelto.\n\n";
   ARTICOLO1 *uso_colore;
   do
   {
      uso_colore=uso_cat->catalogo.head_colore; //impostazione della testa
      i=0;
      while(uso_colore!=NULL)
      {
         i++;
         cout<<i<<"| "<<uso_colore->colore<<" - "<<uso_colore->prezzo<<" euro\n";
         uso_colore=uso_colore->next;
         if((i%8==0)&&(uso_colore!=NULL))
         {
               cout<<"\nIl numero di colori presenti e' piu' alto di queli visualizzabili\n"
                   <<"annotarsi il codice del colore scelto perche' potrebbe scomparire\n"
                   <<"dallo schermo.\n\n";
               pausa();pulisci();
         }
      }
      cout<<"\nInserire il codice ID del colore desiderato: ";
      id=(int)inserisci_numero();
      uso_colore=uso_cat->catalogo.head_colore; //impostazione della testa
      i=0;
      stop=0;
      while(!((uso_colore==NULL)||(stop==1)))
      {
            i++;
            if(i==id)
            {
               fout<<uso_colore->colore<<'\n'
                   <<uso_colore->prezzo<<'\n';
               stop=1;
            }else{
               uso_colore=uso_colore->next;
            }
      }
      if(stop==0){pulisci();cout<<"Inserimento effettuato in maniera errata, reinserire!\n\n";pausa();}
   }while(stop==0);
//chiedi optional
   pulisci();
   cout<<"Di seguito verranno elencati uno alla volta gli optional disponibili"
       <<"per questo modello, nel caso gli optional sono uno l'alternativa"
       <<"dell' altro verra' chiesto di effettuare una scelta, altrimenti verra'"
       <<"solamente chiesto se inserire o no il prodotto.\n\n";
   pausa();
   int tipo_scelta;
   ARTICOLO2 *uso_opt;
   stop=0;
   uso_opt=uso_cat->catalogo.head_optional; //impostazione della testa
   while(uso_opt!=NULL){
      tipo_scelta=0;
      cout<<uso_opt->id;
      if(categoria_optional(uso_opt->id,optional_trattati)!=1)
      {
          if(categoria_optional(uso_opt->id,uso_opt->optional_alternativi)==1)
          tipo_scelta=2;
          else if(categoria_optional(uso_opt->id,uso_allest->optional_inseribili)==1)
          tipo_scelta=1;
          else if(categoria_optional(uso_opt->id,uso_allest->optional_serie)==1)
          tipo_scelta=4;
          else
          tipo_scelta=3;
      }else{
        tipo_scelta=0;
      }
      switch(tipo_scelta)
      {
         case 0: {  break; }
         case 1:
         {  pulisci();
            cout<<"Voui inserire questo optional nella tua configurazione? "
                <<"('1'=Si , '2'=No)\n\n"
                <<"      ID: "<<uso_opt->id<<"\n"
                <<"Optional: "<<uso_opt->nome<<"\n"
                <<"  Prezzo: "<<uso_opt->prezzo<<" euro\n\n"
                <<"Inserisci scelta: ";
            scelta=(int)inserisci_numero();
            if(scelta==1)
            {
               fout<<uso_opt->nome<<"\n"
                   <<uso_opt->prezzo<<"\n";
            }
            strcat(optional_trattati,uso_opt->id);
            break;
         }
         case 2:
         {  pulisci();
            stop1=0;
            do
            {  cout<<"Quale dei seguenti optional vuoi inserire?\n\n";
               i=0;
               do
               {  for(k=0;k<3;k++)
                  {  checkid[k]=uso_opt->optional_alternativi[k+(3*i)];
                  }
                  ARTICOLO2 *uso_opt_temp;
                  uso_opt_temp=uso_cat->catalogo.head_optional;
                  while(uso_opt_temp!=NULL)
                  {  if(strcmp(checkid,uso_opt_temp->id)==0)
                     {  cout<<checkid<<" - "<<uso_opt_temp->nome<<" - ";
                        if(categoria_optional(uso_opt_temp->id,uso_allest->optional_serie)==1)
                        {  cout<<"0";
                        }else{
                           cout<<uso_opt_temp->prezzo;
                        }
                        cout<<" euro\n";
                     }
                     uso_opt_temp=uso_opt_temp->next;

                  }i++;
               }while(uso_opt->optional_alternativi[(3*i)-3]!='\0');
               cout<<"000 - Nessuno di questi - 0 euro\n";
               cout<<"\nInserire ora l'ID del prodotto a tua scelta: \n";
               cin.getline(checkid,4);
               ARTICOLO2 *uso_opt_temp;
               uso_opt_temp=uso_cat->catalogo.head_optional;
               while(uso_opt_temp!=NULL)
               {
                  if(strcmp(checkid,uso_opt_temp->id)==0)
                  {  fout<<uso_opt_temp->nome<<"\n"
                         <<uso_opt_temp->prezzo<<"\n";
                     stop1=1;
                  }
                  else if(strcmp(checkid,"000")==0)
                  {  stop1=1;
                  }
                  uso_opt_temp=uso_opt_temp->next;
               }
               if(stop1!=1){pulisci();cout<<"Inserimento effettuato in maniera errata, reinserire!\n\n";}
            }while(stop1!=1);
            strcat(optional_trattati,uso_opt->optional_alternativi);
            break;
         }
         case 3:
         {
            strcat(optional_trattati,uso_opt->id);
            break;
         }
         case 4:
         {
            fout<<uso_opt->nome<<"\n"<<"0\n";
            strcat(optional_trattati,uso_opt->id);
         }
      }
      uso_opt=uso_opt->next;
   }
   cout<<"\nInserimento effettuato con successo\n";
   fout.close();
   fin.open(nome_file);
   if(fin.fail())
   {  cout<<"!!! File non trovato !!!";
      return 1;
   }
   strcpy(buffer,"preventivo_");
   strcat(buffer,nome_file);
   fout.open(buffer,ios::out);
   fout<<"Preventivo automobile di    | ";
   dividi_stringa(nome_file, ".txt", diviso_1, diviso_2);
   fout<<diviso_1
       <<"\n\n";
   fin.getline(buffer,200,'\n');
   fout<<"\nMarca:          "<<buffer;
   fin.getline(buffer,200,'\n');
   fout<<"\nAutomobile:     "<<buffer;
   fin.getline(buffer,200,'\n');
   fout<<"\nAllestimento:   "<<buffer;
   fin.getline(buffer,200,'\n');
   fout<<"\nMotorizzazione: "<<buffer
       <<"\n-----------------------------------------------\n";
   float prezzo_preventivo;
   float sconto=0;
   int str_lung;
   fin.getline(buffer,200,'\n');
   str_lung=strlen(buffer);
   for(j=0;j<10-str_lung;j++){fout<<" ";}
   fout<<buffer<<" ||Prezzo base";
   prezzo_preventivo=atof(buffer);
   while(fin.getline(buffer,200,'\n'))
   {
      fin.getline(diviso_2,200,'\n');
      str_lung=strlen(diviso_2);
      fout<<"\n+";
      for(j=0;j<9-str_lung;j++){fout<<" ";}
      fout<<diviso_2<<" ||"<<buffer;
      prezzo_preventivo+=atof(diviso_2);
   }
   fout<<"\n----------------------------------------\n";
   fout<<"=  "<<prezzo_preventivo<<"   prezzo da scontare";pulisci();
   cout<<"\nIl prezzo dell'automobile non scontato e':\n"<<prezzo_preventivo<<" euro";
   cout<<"\n\nInserisci lo sconto che hai intenzione di effettuare (in percentuale): \n";
   cin>>sconto;
   prezzo_preventivo=(prezzo_preventivo*(100-sconto))/100;
   fout<<"\n-   "<<sconto<<"%\n";
   fout<<"\n----------------------------------------\n";
   fout<<"=  "<<prezzo_preventivo<<"   prezzo scontato";
   cout<<"\nIl prezzo dell'automobile scontato e':\n"<<prezzo_preventivo<<" euro\n";
   pausa();pulisci();
   cout<<"Operazione conclusa con successo.\nPer trovare una versione estesa e stampabile del"
       <<" preventivo \nconsultare il file preventivo_"<<nome_file<<"\nnella directory di esecuzione del programma\n\n\n";
   fout.close();
   fin.close();
   return 1;
}
//CATEGORIA OPTIONAL////////////////////////////////////////////////////////////////////
int categoria_optional(char *id, char *optional_type)
{
   int i=0;
   int stop=0;
   do
   {
      if((id[0]==optional_type[0+(3*i)])&&
         (id[1]==optional_type[1+(3*i)])&&
         (id[2]==optional_type[2+(3*i)]))
         {
           stop=1;
         }i++;
   }while(optional_type[(i*3)-3]!='\0');
   return stop;
}
