-- Now give raises to employeees

with ada.text_io; use ada.text_io; 
with ada.float_text_io; use ada.float_text_io; 
 
procedure emp4  is 
   type Employee is record
      Name: String(1 .. 20);
      ID: String(1 .. 6);
      Salary: Float;
   end record;

   type Emp_Array is array(1 .. 10) of Employee;

   type Emp_List is record
      emps: Emp_Array;
      num: Natural := 0;  --  How many currently stored
   end record;

   --  Add all employees to list
   procedure get_emps(employs: out Emp_List) is
      e_tmp: Employee;
   begin
      while not end_of_file loop
         employs.num := employs.num + 1;

         get(e_tmp.Name);
         get(e_tmp.ID);
         get(e_tmp.salary);

         employs.emps(employs.num) := e_tmp;
      end loop;
      --  put(employs.emps(2).id);
   end get_emps;

   --  Print all the employees
   procedure put_emps(employs: in Emp_List) is
      e_tmp: Employee;
   begin
      for i in 1 .. employs.num loop
         e_tmp := employs.emps(i);
         put(e_tmp.Name);
         put(e_tmp.ID);
         put(e_tmp.salary, 7, 2, 0);
         new_line;
      end loop;
   end put_emps;

   procedure give_raises(employs: in out Emp_List; raise_amt: Float) is
      --  e_tmp: Employee;
   begin
      for i in 1 .. employs.num loop
         employs.emps(i).salary := employs.emps(i).salary + raise_amt;

         --  Alternate solution uses e_tmp, but
         --    if e_tmp is used, it must be copied BACK into the array
         --  e_tmp := employs.emps(i);
         --  e_tmp.salary := e_tmp.salary + raise_amt;
         --  employs.emps(i) := e_tmp;   --  Copy back into array
      end loop;
   end give_raises;

   --  Give them all raises - version 2 using an iterator loop
   procedure give_raises2(employs: in out Emp_List; raise_amt: Float) is
   begin
      for e_tmp of employs.emps(1 .. employs.num) loop
         e_tmp.salary := e_tmp .salary+ raise_amt;
      end loop;
   end give_raises2;

   the_emps: Emp_List;

begin
   get_emps(the_emps);
   put_emps(the_emps);
   new_line;
   give_raises(the_emps, 1_000.0);
   put_emps(the_emps);
   new_line;
   give_raises2(the_emps, 2_000.0);
   put_emps(the_emps);
end emp4;