# mission4.adb

    with Gada.Text_IO ;
    with Tennis ;

    procedure Mission4 is

       package Ten renames Tennis ;
       package Txt renames Gada.Text_IO ;

       --- Afficher tous les joueurs
       procedure Afficher(Clas : Ten.T_Classement) is
       begin
          for Index in Clas'Range loop
    	 -- Numéro de classement, nom du joueur, pays.
    	 Txt.Put(Integer'Image(Index) & " : " & Clas(Index).Nom & "  "
    		   & Clas(Index).Pays & "  ") ;

    	 -- Symbole qui dépend de la valeur Move
    	 if Clas(Index).Move = 0 then
    	    Txt.Put("=") ;
    	 else
    	    if Clas(Index).Move > 0 then
    	       Txt.Put("+") ;
    	    end if ;

    	    -- Valeur de Move
    	    Txt.Put(Integer'Image(Clas(Index).Move)) ;
    	 end if ;

    	 Txt.New_Line ;
          end loop ;
       end Afficher ;

       --- Chercher un joueur du pays indiqué
       function Chercher (Clas : Ten.T_Classement ; Nation : String) return Ten.T_Resultat is
          -- Resultat par défaut
          Result : Ten.T_Resultat := (False, 0) ;

          Trouve : Boolean := False ;
          Index : Integer := 1 ;
       begin
          while (Index <= Clas'Last and not Trouve) loop
    	 -- Est-ce le joueur que l'on cherche ?
    	 if Clas(Index).Pays = Nation then
    	    -- On a trouvé !
    	    Trouve := True ;
    	 else
    	    -- Pas le bon, on passe au suivant
    	    Index := Index + 1 ;
    	 end if ;
          end loop ;

          if Trouve then
    	 Result := (True, Index) ;
          end if ;

          return Result ;
       end Chercher ;

       procedure Tester_Chercher(Clas : Ten.T_Classement ; Orig : String) is
          Reponse : Ten.T_Resultat ;
       begin
          Txt.New_Line ;
          Txt.Put_Line("Chercher un joueur de " & Orig) ;
          Reponse := Chercher(Clas, Orig) ;

          if Reponse.Succes then
    	 Txt.Put_Line("  Trouvé : " & Integer'Image(Reponse.Numero) & "  " & Clas(Reponse.Numero).Nom) ;
          else
    	 Txt.Put_Line("  Introuvable.") ;
          end if ;

          Txt.New_Line ;
       end Tester_Chercher ;

       --- Construire le classement précédent
       function Precede(Clas : Ten.T_Classement) return Ten.T_Classement is
          -- Le joueur inconnu, pour les cases indéterminées.
          Joueur_Inconnu : Ten.T_Entree := (Ten.Inconnu, "---", 0) ;

          -- Tableau du résultat, initialisé avec le joueur inconnu.
          Result : Ten.T_Classement(Clas'Range) := (others => Joueur_Inconnu) ;

          Nouvel_Index : Integer ;
       begin

          -- Parcours de toutes les entrées du classement et remplissage du tableau de résultat.
          for Index in Clas'Range loop

             -- Si move est > 0, cela signifie que l'on remonte dans le classement,
             -- donc le nouvel index diminue.
    	 Nouvel_Index := Index - Clas(Index).Move ;

    	 if Nouvel_Index <= Result'Last then
    	    Result(Nouvel_Index) := (Clas(Index).Nom, Clas(Index).Pays, 0) ;
    	 end if ;

          end loop ;

          return Result ;
       end Precede ;

    begin

       Afficher(Ten.Joueurs) ;
       Afficher(Ten.Joueuses) ;

       Tester_Chercher(Ten.Joueurs, "FRA") ;
       Tester_Chercher(Ten.Joueurs, "USA") ;
       Tester_Chercher(Ten.Joueuses, "ITA") ;
       Tester_Chercher(Ten.Joueuses, "INSA") ;

       Afficher(Precede(Ten.Joueurs)) ;

    end Mission4 ;