/***************************************
*                                      *
*   Copyright (c) 1998 Jean-Eric Pin   *
*   All rights reserved.               *
*                                      *
*   TAB = 2 spaces                     *
*                                      *
***************************************/

/*-------------------------------------------------------------------
 * Preferences.c    Jean-Eric Pin 17/04/97
 *-------------------------------------------------------------------
 */     

/**************************************************
*
* Structure du fichier de préférences :
*   1.00  % Version de Semigroupe
*        F  % Langue
*        1 % Etat initial 1 par defaut
*
**************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include "Erreurs.h"
#include "Globales.h"
#include "Main.h"
#include "Memoire.h"
#include "Preferences.h"
#include "Utilitaires.h"
#if SYSTEME == MAC
  #include <unix.h>
#endif
#include "FichierUnix.h"

extern char **Messages;
extern float Version;  /* Version de Semigroupe */

static char Langue = 'E';    /* Par défaut */
char *Yes;
char *No;
extern char DirHome[255], CheminExemples[255], CheminLaTeX[255],
            DirExemples[255], DirLaTeX[255];

/*************************************************
*  
*  Oui dans toutes les langues !
*  
*************************************************/

char YesAllemand[2] = {'j', 'J'};
char YesAnglais[2] = {'y', 'Y'};
char YesItalien[2] = {'s', 'S'};
char YesFrancais[2] = {'o', 'O'};
char YesPortugais[2] = {'s', 'S'};
char YesEspagnol[2] = {'s', 'S'};

/*************************************************
*  
*  Non dans toutes les langues !
*  
*************************************************/

char NoAllemand[2] = {'n', 'N'};
char NoAnglais[2] = {'n', 'N'};
char NoFrancais[2] = {'n', 'N'};
char NoItalien[2] = {'n', 'N'};
char NoPortugais[2] = {'n', 'N'};
char NoEspagnol[2] = {'n', 'N'};


/**************************************************
*
* MessagesExemples     
*
**************************************************/

void MessagesExemples(void)
{
  printf("%s\n", Messages[M_Path_Examples]);  /* Donner le chemin d'accès aux fichiers d'exemples */
  printf("%s\n", Messages[M_Path_exists]);
#if  SYSTEME == MAC || SYSTEME == UNIX
  printf("%s\n", Messages[M_Path_UNIX_Examples]);
#elif SYSTEME == WINDOWS
  printf("%s\n", Messages[M_Path_WINDOWS_Examples]);
#endif
  scanf("%s", CheminExemples);
}

/**************************************************
*
* MessagesLaTeXExemples     
*
**************************************************/

void MessagesLaTeXExemples(void)
{
   printf("%s ", Messages[M_Path_LaTeX]);  
  printf("%s\n", Messages[M_Path_exists]);
  /* Donner le chemin d'accès aux fichiers d'exemples */
#if  SYSTEME == MAC || SYSTEME == UNIX
  printf("%s\n", Messages[M_Path_UNIX_LaTeX]);
#elif SYSTEME == WINDOWS
  printf("%s\n", Messages[M_Path_WINDOWS_LaTeX]);
#endif
  scanf("%s", CheminLaTeX);
}

/**************************************************
*
* CreationPreferences     
*
**************************************************/

void CreationPreferences(char *CheminPref)
{  
  MessagesExemples();
  MessagesLaTeXExemples();
  EcriturePreferences(CheminPref);
}

/**************************************************
*
* EcriturePreferences     
*
**************************************************/

void EcriturePreferences(char *CheminPref)
{  
  FILE *fichier;      /* Fichiers KR p.158 */
  int retour, erreur;

  fichier = fopen(CheminPref, "w");
  if (fichier == 0)
  {
    erreur = errno;
    Erreur_fopen(erreur);
     printf("Le fichier %s n'a pu être créé !\n", CheminPref);
    printf("Problème à la création du fichier des préférences\n");  
    /* La langue n'est pas encore connue et Messages n'est pas initialisé à ce stade ! */
  }
  else
  {
    fprintf(fichier, "%8f %% Version de Semigroupe\n", Version);
    fprintf(fichier, "%8c %% Langue\n", Langue);
    fprintf(fichier, "%s %% Chemin du repertoire des exemples\n", CheminExemples);
    fprintf(fichier, "%s %% Chemin du repertoire LaTeX\n", CheminLaTeX);
    retour = fclose(fichier);
    if (retour != 0)
    {
      erreur = errno;
      Erreur_fclose(erreur);
      printf("Problème à la fermeture de %s !\n", NOM_PREF);
    }
  }
}

/**************************************************
*
* LecturePreferences     
*
**************************************************/

void LecturePreferences(char *CheminPref, char *DirBABEL)
{  
  FILE *fichier;      /* Fichiers KR p.158 */
  char buffer[TAILLE_BUFFER];
  int erreur, retour;

  fichier = fopen(CheminPref, "r");
  if (fichier == 0)
  {
    erreur = errno;
    Erreur_fopen(erreur);
     printf("Le fichier %s n'a pu être ouvert !\n", CheminPref);
     printf("Impossible de trouver les préférences ! Création d'un nouveau fichier\n");
     /*  La langue n'est pas encore connue et Messages n'est pas initialisé ! */
    Langue = 'E';    /* Par defaut, on prend l'anglais */
    ChoixLangue(DirBABEL);
    CreationPreferences(CheminPref);
  }
  else
  {
    fgets(buffer, TAILLE_BUFFER, fichier);  /* Version ignorée pour l'instant */
    if (fscanf(fichier, "%1s %% Language (D = German, E = English, F = French, I = Italian, P = Portuguese, S = Spanish)", &Langue) != 1)
    {
      printf("scanf erreur (Langue) \n");
      exit(1);
    }
    if (fscanf(fichier, "%s %% Path of the Examples folder", CheminExemples) != 1)
    {
      printf("scanf erreur (Path of the Examples folder) \n");
      exit(1);
    }    
    if (fscanf(fichier, "%s %% Path of the LaTeXFiles folder", CheminLaTeX) != 1)
    {
      printf("scanf erreur (Path of the LaTeXFiles folder) \n");
      exit(1);
    }    
    retour = fclose(fichier);
    if (retour != 0)
    {
      erreur = errno;
      Erreur_fclose(erreur);
      printf("Problème à la fermeture de %s !\n", NOM_PREF);
    }
    else
    {
      strcpy(DirExemples, "");
      strcat(DirExemples, DirHome);
      strcpy(DirLaTeX, "");
      strcat(DirLaTeX, DirHome);
#if SYSTEME == MAC || SYSTEME == UNIX
      strcat(DirExemples, "/");
      strcat(DirLaTeX, "/");
#elif SYSTEME == WINDOWS
      strcat(DirExemples, "\\");
      strcat(DirLaTeX, "\\");
#endif
      strcat(DirExemples, CheminExemples);
      strcat(DirLaTeX, CheminLaTeX);
#if  SYSTEME == MAC || SYSTEME == UNIX
      strcat(DirExemples, "/");
      strcat(DirLaTeX, "/");
#elif SYSTEME == WINDOWS
      strcat(DirExemples, "\\");
      strcat(DirLaTeX, "\\");
#endif
    }
    ChoixLangue(DirBABEL);
  }
}

/************************************
*
* ModificationLangue.      
*
************************************/

void ModificationLangue(char *CheminPref, char *DirBABEL)
{
  FILE *fichier;      /* Fichiers KR p.158 */
  int erreur;

  printf("Français (F) Brasileiro (B) Deutsch (D) English (E) Italiano (I)\n" 
          "Portugues (P) Español (S) : ");
  do
  {
    scanf("%c", &Langue);
  }
  while (!((Langue == 'F') || (Langue == 'f') || (Langue == 'D') || (Langue == 'd') ||
           (Langue == 'E') || (Langue == 'e') || (Langue == 'B') || (Langue == 'b') ||
           (Langue == 'P') || (Langue == 'p') || (Langue == 'I') || (Langue == 'i') ||
           (Langue == 'S') || (Langue == 's') ));
  printf("\n");
  fichier = fopen(CheminPref, "w");
  if (fichier == 0)
  {
    erreur = errno;
    Erreur_fopen(erreur);
    printf("File %s couldn't be opened !\n", CheminPref);
    printf("Impossible de trouver les preferences ! Cretion d'un nouveau fichier\n");  /* La langue n'est pas encore connue et Messages n'est pas initialisé ! */
    Langue = 'E';    /* Par defaut, on prend l'anglais */
    ChoixLangue(DirBABEL);
    CreationPreferences(CheminPref);
  }
  else
  {
    fprintf(fichier, "%8f %% Version number of Semigroupe\n", Version);
    fprintf(fichier, "%8c %% Language (D = German, E = English, F = French, I = Italian, P = Portuguese, S = Spanish)\n", Langue);
    fprintf(fichier, "%s %% Path of the Examples folder\n", CheminExemples);
    fprintf(fichier, "%s %% Path of the LaTeXFiles folder\n", CheminLaTeX);
    Fermeture(fichier);
  }
  ChoixLangue(DirBABEL);
}

/************************************
*
* ModificationCheminExemples.      
*
************************************/

void ModificationCheminExemples(char *CheminPref)
{
  MessagesExemples();
  EcriturePreferences(CheminPref);
  strcpy(DirExemples, "");
  strcat(DirExemples, DirHome);
#if  SYSTEME == MAC || SYSTEME == UNIX
  strcat(DirExemples, "/");
#elif  SYSTEME == WINDOWS
  strcat(DirExemples, "\\");
#endif
  strcat(DirExemples, CheminExemples);
#if  SYSTEME == MAC || SYSTEME == UNIX
  strcat(DirExemples, "/");
#elif  SYSTEME == WINDOWS
  strcat(DirExemples, "\\");
#endif
}

/************************************
*
* ModificationCheminLaTeX.      
*
************************************/

void ModificationCheminLaTeX(char *CheminPref)
{
  MessagesLaTeXExemples();
  EcriturePreferences(CheminPref);
  strcpy(DirLaTeX, "");
  strcat(DirLaTeX, DirHome);
#if SYSTEME == MAC || SYSTEME == UNIX
  strcat(DirLaTeX, "/");
#elif SYSTEME == WINDOWS
  strcat(DirLaTeX, "\\");
#endif
#if  SYSTEME == MAC || SYSTEME == UNIX
  strcat(DirLaTeX, "/");
#elif SYSTEME == WINDOWS
  strcat(DirLaTeX, "\\");
#endif
}

/************************************
*
* ModificationPreferences.      
*
************************************/

void ModificationPreferences(char *CheminPref, char *DirBABEL)
{
  short OptionMenu;

  printf("%s\n", Messages[M_Give_your_choice]);                /* Donner votre choix */
  printf("(%1d) %s\n", Option_Langue, Messages[M_Langue]);      /* Changement de langue */
  printf("(%1d) %s\n", Option_Chemin, Messages[M_Chemin_Exemples]);      /* Modification du chemin des exemples */
  printf("(%1d) %s\n", Option_CheminLaTeX, Messages[M_Chemin_ExemplesLaTeX]);      /* Modification du chemin des exemples */
  do
  {
    if (scanf("%hd", &OptionMenu) != 1)
    {
      printf("scanf errno\n");
      exit(1);
    }
  }
  while ((OptionMenu < Option_Langue) || (OptionMenu > Option_CheminLaTeX));
  
  switch (OptionMenu)
  {
    case Option_Langue:  
      ModificationLangue(CheminPref, DirBABEL);
    break;
    
    case Option_Chemin:
      ModificationCheminExemples(CheminPref);
    break;

      case Option_CheminLaTeX:
      ModificationCheminLaTeX(CheminPref);
    break;
  }  
}

/**********************
*                          
* ChoixLangue.
*            
**********************/

void ChoixLangue(char *DirBABEL)
{
  FILE *fichier;      /* Fichiers KR p.158 */
  char buffer[TAILLE_BUFFER];
  char Nom[LONGUEUR_NOM] = ""; 
  char NomLong[LONGUEUR_NOM_LONG] = ""; 
  short i = 0;
  short longueur;
  int erreur;

  switch (Langue)
  {
    case 'F' : case 'f' :
      strcpy(Nom, "Francais");      
      Yes = &YesFrancais[0];
      No = &NoFrancais[0];
      break;

    case 'E': case 'e':
      strcpy(Nom, "English");      
      Yes = &YesAnglais[0];
      No = &NoAnglais[0];
      break;

    case 'B': case 'b':
      strcpy(Nom, "Brasileiro");      
      Yes = &YesPortugais[0];
      No = &NoPortugais[0];
      break;
      
    case 'D': case 'd':
      strcpy(Nom, "Deutsch");      
      Yes = &YesAllemand[0];
      No = &NoAllemand[0];
      break;

    case 'I': case 'i':
      strcpy(Nom, "Italiano");      
      Yes = &YesItalien[0];
      No = &NoItalien[0];
      break;

    case 'P' : case 'p' :
      strcpy(Nom, "Portugues");      
      Yes = &YesPortugais[0];
      No = &NoPortugais[0];
      break;
      
    case 'S' : case 's' :
      strcpy(Nom, "Espanol");
      Yes = &YesEspagnol[0];
      No = &NoEspagnol[0];
      break;

    default :
      strcpy(Nom, "Francais");      
      Yes = &YesFrancais[0];
      No = &NoFrancais[0];
      break;
  }
  strcpy(NomLong, DirBABEL);
  strcat(NomLong, Nom);

  fichier = fopen(NomLong, "r");
  if (fichier == 0)
  {
    erreur = errno;
    Erreur_fopen(erreur);
    printf("DirBABEL = %s\n", DirBABEL);
    printf("Le fichier %s n'a pu être ouvert !\n", NomLong);
     printf("ChoixLangue interrompu !");
  }
  else
  {
    while ((longueur = LireLigne(buffer, TAILLE_BUFFER, fichier)) != 0)
      if ((buffer[0] != '/') &&  (isspace(buffer[0]) == 0))  
      /* On élimine les lignes blanches et les commentaires */
      {
        Messages[i] = ALLOC(char, longueur);
        if (Messages[i] == NULL)
        {
          printf("%s %s\n", Messages[M_Pb_memory], Messages[M_Pb_messages]);
                  /* Problème lors de l'allocation mémoire des messages. */
          exit(1);
        }
        strncpy(Messages[i++], buffer, longueur-1);
      }
    Fermeture(fichier);
  }
}