import java.io.Reader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;

class FichierLecture
{
    Reader fichier;
    int lastread;
    String nom_fichier;
    
    public FichierLecture(String nom_fichier_a_lire)
    {
        try
        {
            nom_fichier=nom_fichier_a_lire;
            fichier = new InputStreamReader(new FileInputStream(nom_fichier), "UTF-8");
            lastread=-1;
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Le fichier "+nom_fichier_a_lire+" n'a pas pu etre ouvert.");
            System.out.println("Verifiez que le nom et le chemin d'acces du fichier sont corrects, que ce n'est pas un dossier,");
            System.out.println("et que vous avez les droits de lecture sur le fichier.");
            System.out.println("Le repertoire courant de travail est :");
            System.out.println(System.getProperties().get("user.dir"));
            System.out.println("Le programme se termine a cause de cette erreur.");
            System.exit(0);
        }
        catch(UnsupportedEncodingException e)
        {
            System.out.println("Le fichier "+nom_fichier_a_lire+" n'a pas pu etre ouvert car il n'est pas en format UTF8.");
            System.out.println("Le repertoire courant de travail est :");
            System.out.println(System.getProperties().get("user.dir"));
            System.out.println("Le programme se termine a cause de cette erreur.");
            System.exit(0);
        }
        
    }

    public char lire_caractere()
    {
        int letter_read;
        char caractere_lu='\0';

        if(lastread != -1)
        {
            caractere_lu = (char)lastread;
            lastread=-1;
        }
        else
        {
            try
            {
                caractere_lu = (char)fichier.read();    
            }
            catch(Exception e)
            {
                System.out.println("Erreur pendant la lecture du fichier.");
                System.out.println("Le programme se termine a cause de cette erreur.");
                System.exit(0);
            }
        }


        if(Character.isLetter(caractere_lu))
        {
            caractere_lu = Character.toLowerCase((char)caractere_lu);
            caractere_lu = normaliser_caractere(caractere_lu);
        }   
        return caractere_lu;
    }


    public boolean il_reste_des_caracteres_a_lire()
    {
        try
        {
            lastread = fichier.read();
        }
        catch(Exception e)
        {
            System.out.println("Erreur pendant la lecture du fichier.");
            System.out.println("Le programme se termine a cause de cette erreur.");
            System.exit(0);
        }

        return (lastread != -1);
    }
    
    public void revenir_au_debut()
    {
        try
        {
            fichier.close();
            fichier = new InputStreamReader(new FileInputStream(nom_fichier), "UTF-8");
            lastread=-1;
        }
        catch(Exception e)
        {
            System.out.println("Erreur pour revenir au debut du fichier.");
            System.out.println("Le programme se termine a cause de cette erreur.");
            System.exit(0);
        }
    }
    

    private static char normaliser_caractere(char c)
    {
        switch(c)
        {
            case(232):
            case(233):
            case(234):
            case(235):
                return 'e';

            case(249):
            case(250):
            case(251):
            case(252):
                return 'u';
        
            case(236):
            case(237):
            case(238):
            case(239):
                return 'i';

            case(224):
            case(225):
            case(226):
            case(227):
            case(228):
            case(229):
                return 'a';
            
            case(242):
            case(243):
            case(244):
            case(245):
            case(246):
                return 'o';

            case(231):
                return 'c';
                
            case(241):
                return 'n';
                
            case(253):
            case(255):
                return 'y';

            default:
                return c;
        }
    }
}
