with Communications_with_User;          use Communications_with_User;
with text_io,integer_io,Numbers_io;     use text_io,integer_io,Numbers_io;
with Symbol_Table,Symbol_Table_io;      use Symbol_Table;
with Symbolic_Symmetry_Group_io;

package body Drivers_for_Symmetry_Group_io is

  procedure Read_Permutation_Group
               ( n : in natural; g,v : in out List_of_Permutations;
                 allperms : out boolean ) is

    ans : character;
    nb : natural;

  begin
    new_line;
    put("Is the group the full permutation group ? (y/n) ");
    Ask_Yes_or_No(ans);  allperms := (ans = 'y');
    if ans = 'y'
     then
       g := SymGrp(n);
     else
       put("The neutral element of the group is represented as ");
       for i in 1..n loop
         declare
           sb : Symbol;
         begin
           sb := (sb'range => ' ');
           sb := Symbol_Table.Get(i);
           Symbol_Table_io.put(sb);
           put(" ");
         end;
       end loop;
       new_line;
       put("Give the number of generating elements in the group : ");
       Read_Natural(nb);
       put("Give "); put(nb,1);
       put_line(" vector representations of the generating elements :");
       Symbolic_Symmetry_Group_io.Get(g,n,nb);
    end if;
    put("Do you want the generation of the group ? (y/n) ");
    Ask_Yes_or_No(ans);
    if ans = 'y'
     then v := Generate(g);
     else v := g;
    end if;  -- v = either full group or group supplied by user
  end Read_Permutation_Group;

  procedure Read_Symmetry_Group
               ( n : in natural; g,v : in out List_of_Permutations;
                 allperms,signsym,allsigns : out boolean ) is
   
    ans : character;
    nb : natural;
    pv,fv,fg : List_of_Permutations;

  begin
    Read_Permutation_Group(n,pv,fv,allperms);
    put("Is there any sign symmetry to take into account ? (y/n) ");
    Ask_Yes_or_No(ans);
    signsym := (ans = 'y');
    if ans = 'y'
     then
       put("Contains the group all sign permutations ? (y/n) ");
       Ask_Yes_or_No(ans);
       if ans = 'y'
        then
          allsigns := true;
        else
          allsigns := false;
          signsym := false;  -- fv will contain these permutations
          allperms := false; -- fv will be used for the generating solutions
          put("The sign inversion of all elements is represented as ");
          for i in 1..n loop
            put('-');
            declare
              sb : Symbol;
            begin
              sb := (sb'range => ' ');
              sb := Symbol_Table.get(i);
              Symbol_Table_io.put(sb); put(" ");
            end;
          end loop;
          new_line;
          put("Give the number of generating elements in the group : ");
          Read_Natural(nb);
          put("Give "); put(nb,1);
          put_line(" vector representations of the generating elements :");
          Symbolic_Symmetry_Group_io.Get(fg,n,nb);
       end if;
       put("Do you want the generation of the group ? (y/n) ");
       Ask_Yes_or_No(ans);
       if ans = 'y'
        then fv := Generate(Union(fg,pv));
        else fv := Union(fg,pv);
       end if;
     else
       allsigns := false;
    end if;
    g := Union(fg,pv); v := fv;
  end Read_Symmetry_Group;

end Drivers_for_Symmetry_Group_io;
