#!/usr/bin/perl
#-----------------------------------------------------------
# Ligne de commande : perl BAO3-patrons.pl fichier_treetagger.xml patron
# Attention au chemin ! Le fichier résultat de treetagger fichier_treetagger.xml se trouve dans le dossier BAO2
#---------------------------------------------------------
# On précise l'encodage de sortie en UTF-8
use utf8;
binmode STDOUT,":utf8";
#---------------------------------------------------------
# On prend le premier argument en tant que fichier à traiter
# Le reste des arguments (correspondant au patron) est stocké dans une liste
my $fichieratraiter=shift @ARGV;
my @PATRON=@ARGV;
#---------------------------------------------------------
my @PATRON_TT = ("ABR", "ADJ", "ADV", "DET", "DET:ART", "DET:POS", "INT", "KON", "NAM", "NOM", "NUM", "PRO", "PRO:DEM", "PRO:IND", 
"PRO:PER", "PRO:POS", "PRO:REL", "PRP", "PRP:det", "PUN", "PUN:cit", "SENT", "SYM", "VER", "VER:cond", "VER:futu", "VER:impe", 
"VER:impf", "VER:infi", "VER:pper", "VER:ppre", "VER:pres", "VER:simp", "VER:subi", "VER:subp");
# On s'assure que les patrons font bien partis de la liste
# Et on affiche la liste si besoin
for $pos (@PATRON) {
	if ( !grep( /^$pos$/, @PATRON_TT ) ) {
		print "Le ou les patrons n'ont pas été reconnu(s)\n";
		print "Souhaitez-vous voir la liste des POS possibles ? \nTapez 'oui', ou n'importe quelle touche pour sortir ";
		# <STDIN> permet de récupérer la réponse de l'utilisateur dans le terminal
		my $voir_liste = <STDIN>;
		# chomp permet d'enlever la ligne de réponse de l'utilisateur
		chomp $voir_liste;
		if ($voir_liste eq "oui") {
			print "@PATRON_TT\n";
			exit;
		}
		exit;	
	}
}
#---------------------------------------------------------
# On récupère la rubrique et le patron complet qui nous servira aux noms des fichiers de sortie
# Rq : la longueur du patron '$#PATRON' n'est pas égal à longueur du patron donnée par 'scalar @PATRON' 
# En réalité, $#PATRON = scalar @PATRON -1, ici $#PATRON est utilisé car notre indice pour le foreach commence à 0
my $rubrique = "";
if ($fichier=~/.*?-(\d+)\.xml/){
	$rubrique = $1;
}
$patron="";
$i=0;
foreach (@PATRON) {
	if ($i != $#PATRON){
		$patron.="$PATRON[$i]-";
	}
	else {
		$patron.="$PATRON[$i]";
	}
	$i++;
}
#print $patron;
#---------------------------------------------------------
# On ouvre le fichier à traiter et on stocke le contenu dans une liste
open my $input, "<:encoding(utf-8)", $fichieratraiter;
my @CONTENU=<$input>;
close($input);
# On lit la liste @CONTENU en la vidant : tant qu'il y a encore du contenu, on continue la lecture
# une fois que la liste sera vide, cela signifiera que tout le contenu aura été lu

while (my $ligne=shift @CONTENU){
	my $chaine="";
	my $indice=1;
	# si le premier élément/POS du patron ($PATRON[0]) a été matché
	if ($ligne=~/<element><data type="type">$PATRON[0]<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) {
		# on incrémente la chaine avec la forme que l'on a trouvé et on utilise une variable pour voir la longueur du patron qu'on va pouvoir atteindre
		$chaine.=$1;
		my $longueur=1;
		# et il faut que je continue la lecture pour voir si la suite matche également avec le reste du patron
		while ($CONTENU[$indice-1]=~/<element><data type="type">$PATRON[$indice]<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/){
			$indice++;
			$longueur++;
			$chaine.=" ".$1;
		}
		# Si tout le patron complet a été matché, alors on garde la chaine
		if (scalar @PATRON == $longueur) {
			#print "$chaine\n";
			$dic_Patron{$chaine}++;
			$nbTerme++;
		}
	}
}
#---------------------------------------------------------
# On ouvre et écrit dans notre fichier de résultat

open my $resultat,">:encoding(UTF-8)","perl-extract_patron-$rubrique-$patron.txt";

# On écrit le nombre de chaines trouvés selon le patron demandé
print $resultat "$nbTerme éléments trouvés\n";

# On trie notre dictionnaire selon les fréquences
# Pour chaque chaine du dictionnaire, on écrire la clé suivie de son nombre d'occurrences dans le texte
foreach my $patron (sort {$dic_Patron{$b} <=> $dic_Patron{$a} } keys %dic_Patron) {
	print $resultat "$dic_Patron{$patron}\t$patron\n";
}
close($resultat);
move("perl-extract_patron-$rubrique-$patron.txt", "BAO3") or die "Erreur $!";
#---------------------------------------------------------