with Text_Io; use Text_Io;

with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;

with Ada.Strings.Fixed; use Ada.Strings.Fixed;

with Liste_Gene;

procedure Jutilise is 

Long_Nom : constant Positive := 8;  

type T_Eleve is record 
	Nom_De_Eleve : String (1 .. Long_Nom);  
  Age_De_Eleve : Integer          range 10 .. 100; 
end record;

package Paquetage_Liste_Eleves is new Liste_Gene(Typelem => T_Eleve);
use Paquetage_Liste_Eleves;

procedure Affichage_Eleves (Li : in Liste ) is 
  Pt_Aux           : Liste   := Li;  
  Eleve_A_Afficher : T_Eleve;  
begin
  while not Test_Si_Vide(Pt_Aux) loop
    Eleve_A_Afficher:= Premier(Pt_Aux);
    Put (Eleve_A_Afficher.Nom_De_Eleve); Put(", ");
    Put (Eleve_A_Afficher.Age_De_Eleve); Put("; ");
    New_Line;
    Pt_Aux:= Suivant(Pt_Aux);
  end loop;
  Put("fin de la liste"); New_Line; New_Line;
end Affichage_Eleves;


procedure Saisie_Eleves (Li : in out Liste ) is 
  function Demande_Saisie_Eleves return T_Eleve is 
    Nom : String (1 .. Long_Nom);  
    Age : Integer range 10..100;
    Toto : Integer;  
  begin
    Put ("Entrez le nom de L'Eleve (8 char maxi) : ");
    Get_Line (Nom, Toto);
    Nom:= Head(Head (Nom, Toto), Long_Nom, 'x');
    Put ("               Entrez l'age de l'eleve : ");
    Get (Age);
    New_Line;
    return (Nom, Age);
  end Demande_Saisie_Eleves;

begin
  --pour continuer de rajouter des eleves ce programme sera inclus ds un autre...
  --ou on pourrait rajouter des entree-sorties comme "voulez-vous recommencer".
  --Je traite le cas ou on rajoute un eleve.
  Li:= Cons(Demande_Saisie_Eleves, Li);
end Saisie_Eleves;

procedure Incremente_Age (Li : in out Liste ) is 
  Li_Aux   : Liste   := Li;  
  Un_Eleve : T_Eleve;  
begin
  loop
    Un_Eleve:= Premier(Li_Aux);
    Un_Eleve.Age_De_Eleve := Un_Eleve.Age_De_Eleve +1 ;
    Change_Elem(Un_Eleve, Li_Aux); -- modif : li_aux et pas li
    Li_Aux:= Suivant(Li_Aux);
    exit when Test_Si_Vide(Li_Aux);
  end loop;
end Incremente_Age;

Liste_Test: Liste:=Liste_Vide;
Eleve_1, Eleve_2, Eleve_3: T_Eleve;
Mon_Nom: constant String:="Pia_Sege";

begin
  Eleve_1:=(Nom_De_Eleve => Mon_Nom, Age_De_Eleve => 33);
  Eleve_2:=(Nom_De_Eleve => "Oppilas2", Age_De_Eleve => 20);
  Eleve_3:=(Nom_De_Eleve => "Oppilas3", Age_De_Eleve => 30);
  Liste_Test:=Cons(Eleve_1, Liste_Test);
  Liste_Test:=Cons(Eleve_2, Liste_Test);
  Liste_Test:=Cons(Eleve_3, Liste_Test);
  Affichage_Eleves(Liste_Test);

  Saisie_Eleves(Liste_Test);
  Affichage_Eleves(Liste_Test);

  Incremente_Age(Liste_Test);
  Affichage_Eleves(Liste_Test);

end Jutilise;


