#! /usr/bin/perl

use Getopt::Long;

my $qf='';

GetOptions("questions=s"=>\$qf,
	   );

my %q=();
my %global=();
my $k='';
my %boucle=();

open(QUEST,$qf) or die "Error opening $qf : $!";
while(<QUEST>) {
    chomp;
    $ko=$k;
    if(/^\%([\+=])\s*$/) {
	$k=$1;
	die "Cles imbriquees : $k dans $ko" if($ko && $ko !~ /^[\+=]$/);
    }
    if(/^\s*\\begin\{(question|questionmultx?)\}\{([^}]+)\}/) {
	$k=$2;
	die "Cles imbriquees : $k dans $ko" if($ko && $ko !~ /^[\+=]$/);
	die "Cle double : $k" if($q{$k});
	$global{$k}=$q{'+'};
	$q{'+'}=[];
	$boucle{$k}=$q{'='};
	$q{'='}=[];
    }
    if(/^\%<([^\s]+)/) {
	die "Cles imbriquees : $1 dans $k" if($k);
	$k=$1;
    }
    push @{$q{$k}},$_ if($k);
    if(/^\s*\\end\{(question|questionmultx?)\}/) {
	die "Cle non ouverte" if(! $k);
	$k='';
    }
    if(/^\%>([^\s]+)/) {
	die "Cle mal ouverte : $1 / $k" if($k ne $1);
	$k='';
    }
}
close(QUEST);

sub inclusion {
    my ($k,$gr)=@_;
    die "Question introuvable : $k" if(!$q{$k});
    print join("\n",@{$global{$k}})."\n\n" if(@{$global{$k}});
    push @{$q{'BOUCLE'}},@{$boucle{$k}};
    print "\\element{$gr}{\n" if($gr);
    print join("\n",@{$q{$k}})."\n";
    print "}\n\n" if($gr);
}

%groupes=();

$groupe_courant = 'grq';

while (<>) {
    chomp;

    if (/^\s*\\exemplaire\{/) {
        print("\n");
        for my $g ( keys %groupes ) {
            print("\\setgroupmode{$g}{cyclic}\n");
            print("\\element{$groupes{$g}->{in}}{\n\n\\insertgroup[1]{$g}\n\n}\n");
            print("\n");
        }
    }

    print "$_\n";
    if (/^\%[Q]\[(.+)\]\{(.+)\}/) {
        my $q = $1;
        my $g = $2;
        $groupes{$g}->{in}=$groupe_courant;
        $groupes{$g}->{n}++;
        inclusion( $q, $g );
    } elsif (/^\%[Q]\[(.+)\]\[(.+)\]/) {
        inclusion( $1, $2 );
    } elsif (/^\%([QT])\[(.+)\]/) {
        inclusion( $2, ( $1 eq 'T' ? '' : $groupe_courant ) );
    } elsif (/^\%G=([^\s]+)/) {
        $groupe_courant=$1;
    }
}
