//**********************************************************************
//**********************************************************************
//	Projet      : Ulysse
//	Laboratoire : GREYC-ISMRA
//	Fichier     : utilisateur.cc
//      Annee       : 1997          ,
//	Auteur      : Christophe GODEREAUX
//**********************************************************************
//**********************************************************************


#include "util.cc"

#define Je 	(*this)
#define J 	(*this)
#define Mon 	(*this)
#define Ma 	(*this)

#define CP strcpy

#define LONGUEUR_TEXTE_MAX_UTILISATEUR 10000

//void usleep(int d){ for(int i=0; i<d*100;i++){}}


//**********************************************************************
//**********************************************************************
//************************ LOCUTEUR
//**********************************************************************
//**********************************************************************

class Locuteur {
 
  public:
	Locuteur();
        virtual ~Locuteur() {}
  	virtual ostream& affiche(ostream& os) = 0;
  	virtual char* derniere_replique(char*,char* ,int) = 0;
  	virtual void efface_replique() = 0;
	virtual char* parle() = 0;
	virtual char* son_nom() = 0;
	virtual char* son_prenom() = 0;
};


ostream& operator <<(ostream& os, Locuteur& L) 
{ 
    return L.affiche(os); 
}



Locuteur::Locuteur()
{
}

//**********************************************************************
//**********************************************************************
//************************ UTILISATEUR
//**********************************************************************
//**********************************************************************

class Utilisateur : public Locuteur {
	int mode_dive;

	int locuteur;
	int buffer;
	char  nom[30],prenom[30];
	char* nom_user;
	char nom_entree_carte_vocale[60],nom_entree_clic[60];

  public:
	int temps_d_attente;
	Utilisateur();
	Utilisateur(char*,int argc,char* rep,char* user);
	char* parle();
	char* ecoute(char*);
	void efface_replique(){unlink(Mon.nom_entree_carte_vocale);}
	ostream& affiche(ostream& s);
	char* derniere_replique(char*,char* ,int);
	char* son_nom(){return nom;}
	char* son_prenom(){return prenom;}
};

Utilisateur::Utilisateur()
{
}

Utilisateur::Utilisateur(char* n,int argc,char* rep,char* user)
{
  Mon.nom_user=new char[strlen(n)+1]; 
  CP(Mon.nom_user,n); 
  Mon.mode_dive=argc-1;
  sprintf(Mon.nom_entree_carte_vocale,"%s/%s.1",rep,user); 
  sprintf(Mon.nom_entree_clic,"%s/%s.clic",rep,user);
  Mon.locuteur=-1;
  Mon.buffer=0;
  char fichier[200],tmp[60]="";
  sprintf(fichier,"%s/%s.nom",rep,user);
  lire_message(tmp,fichier);
deb("tmp=");debn(tmp);
  if (!eg(tmp,"")){
    enlever_char(tmp,".");
    sscanf(tmp,"%s%s",Mon.prenom,Mon.nom);
    if (eg(Mon.prenom,"???")) CP(Mon.nom,"???");
  }
  else {
    CP(Mon.prenom,"???");
    CP(Mon.nom,"???");
  }
  cout<<'\n'<<Mon.prenom<<' '<<Mon.nom<<'\n';
  cout.flush();
  if (getenv("TEMPS_D_ATTENTE"))
    temps_d_attente=atoi(getenv("TEMPS_D_ATTENTE"));
  else temps_d_attente=200000;
}

ostream& Utilisateur::affiche(ostream& s)
{ 
   s<<"\nL'UTILISATEUR :\n";
   s<<"  - Votre prénom est "<<prenom<<".\n";
   s<<"  - Votre nom est "<<nom<<".\n";
   s<<"  - Votre nom de login est "<<nom_user<<".\n";
   s<<"  - Fichier d'entrée : "<<nom_entree_carte_vocale<<".\n";
   s<<"  - Fichier d'entrée souris: "<<nom_entree_clic<<".\n";
   return s<<'\n';
}

char* Utilisateur::parle()
{
  static char ligne[LONGUEUR_TEXTE_MAX_UTILISATEUR]="";
  usleep(Mon.temps_d_attente); 
  
  FILE *f=NULL,*fclic=NULL; 
  if ((f=fopen(nom_entree_carte_vocale,"r")) == NULL  && Mon.mode_dive
       && (fclic=fopen(nom_entree_clic,"r")) == NULL  && Mon.buffer==0){
    fclose(f);fclose(fclic);
    CP(ligne,"");
  }
  else {
    fclose(f);fclose(fclic);
    lire_message(ligne,nom_entree_carte_vocale);
  }
//deb("utilisateur:");debn(ligne);
  return ligne;
}

char * Utilisateur::ecoute(char* entree)
{ float temps=0; float tt=100.2;
  if (Mon.mode_dive){
    static char ligne[LONGUEUR_TEXTE_MAX_UTILISATEUR]="";
    static char *pligne=ligne;
    if (strcmp(ligne,"")==0){
      FILE *f=NULL,*fclic=NULL; 
      while (((f=fopen(nom_entree_carte_vocale,"r")) == NULL 
       && (fclic=fopen(nom_entree_clic,"r")) == NULL)
       && temps<=tt){
        usleep(Mon.temps_d_attente); 
        temps+=.02;//if (temps>=2) { debn("2 secondes");}
      }
      if (fclic!=NULL) { f=fclic;}
      if (f != NULL){ 
        fgets(ligne,LONGUEUR_TEXTE_MAX_UTILISATEUR,f); 
	traiter_enonce_pour_analyse_syntaxique(ligne);
//debn(ligne);
        fclose(f);
        unlink(nom_entree_carte_vocale);
        unlink(nom_entree_clic);
      } else {CP(ligne,".");}
    }
    if (sscanf(pligne,"%s",entree)==-1 || strcmp(pligne,entree)==0) 
       {CP(ligne,"");pligne=ligne;}
    else{
      pligne=strstr(pligne,entree);
      for(int i=0;*(pligne++) == entree[i];i++);
      //deb("ligne=");deb(pligne);debin(0);
      char tt[50];
      if (sscanf(pligne,"%s",tt)==-1) 
         {pligne=ligne;CP(ligne,"");}
    }
    Mon.buffer=strlen(ligne);
  } 
  else {
    scanf("%s",entree);
    traiter_enonce_pour_analyse_syntaxique(entree);
  }
  return entree;
}

char* Utilisateur::derniere_replique(char*rep_env,char* rep,int num_rep)
{
//deb("rep_env=");debn(rep_env);
//deb("rep=");debn(rep);
  sprintf(rep_env,"%s%i : %s\n",Mon.prenom,num_rep,rep);
  enlever_char(rep_env,'_');
  return rep_env;
}


