use strict; use warnings;
use Term::ReadLine;

print "\n=== Bienvenue a l'interface de patrons ===\n
>>> Ici vous pouvez choisir le(s) patron(s) et la/les rubrique(s).\n
>>> Tapez une categorie syntaxique. A n'importe quel moment appuyez sur Tab pour une liste des choix\n
\n";

my $fichierpatrons=&inputpatrons(); # l'utilisateur choisit les patrons
my $rubrique =&choisirrubrique(); # l'utilisateur choisit le rubrique
my $dossier_de_sortie="../Sorties/3_Choisir_patrons";

# Créer dossier de sortie si nécessaire
unless(-d $dossier_de_sortie){
    mkdir $dossier_de_sortie or die;
}

# Extraction des patrons
&extractpatterns("../Sorties/2_Sorties_de_Cordial/$rubrique.cnr","$dossier_de_sortie/$rubrique.txt", $fichierpatrons);

#============== SUB : choisir rubrique ================>

sub choisirrubrique{

	print "\nMaintenant vous pouvez choisir la rubrique dans laquelle chercher les patrons";
    my $found=0;
    while ($found==0){
	    print "\nVous avez le choix suivant : ";
        my @choix=qw(ALAUNE CINEMA CULTURE ECONOMIE EUROPE IDEES INTERNATIONAL LIVRES MEDIAS PLANETE POLITIQUE SOCIETE SPORT TECHNOLOGIES VOUS VOYAGE);
	    print "@choix : ";
	
	    chomp(my $rubrique=<STDIN>); # supprimer saut de ligne
        $found=0;

        # voir si la rubrique est reconnue ou non
        foreach my $choice(@choix){
            if ($rubrique eq $choice){
                $found=1;
                print" OK";
                return $rubrique;
            } 
        }
        print "\nVotre choix n'est pas reconnu.";
	}

}

#============== SUB : définir les patrons ==============>

sub inputpatrons{
	my $end=0;
	my $patrons="";
    my @list=();

	my $term = Term::ReadLine->new('Catégories Syntaxiques');
	while ($end!=1){
		print">>> Voulez-vous creer un nouveau patron ? y/n : ";

		my $reponse=<STDIN>;
		my $i=1;
		if ($reponse eq "y\n"){

			print "Ecrivez les categories une apres l'autre. Quand vous aurez fini, tapez FIN.\n";
			
			my $contenu = '';
            my $attribs = $term->Attribs;

			$attribs->{completion_function} = sub {
			    my ($text, $line, $start) = @_;
			    return grep { /^$text/i } (
			"ADJ[A-Z]+","DET[A-Z]+","NP[A-Z]+","NC[A-Z]+","INT","VIND[A-Z1-3]+", "VCONP[A-Z1-3]+", "VIMP[A-Z1-3]+", "VINF[A-Z1-3]+", "VSUB[A-Z1-3]+", "VPAR[A-Z1-3]+", "PP", "PPER[A-Z1-3]*", "SUB", "PREP","ADJ[A-Z]+","ADV","PDP","COO");
			};

			my $OUT = $term->OUT || \*STDOUT;
			while ( defined (my $text = $term->readline("Tapez la categorie syntaxique numero $i : ")) ) {
			    last unless $text ne "FIN"; # fin de la boucle quand on tape FIN
			    $contenu .= "$text\n"; # l'entrée s"ajoute au contenu du patron 
			    $i++;
			}

			print $contenu;
			@list=split("\n",$contenu); # séparer sur le saut de ligne
			my $content=join(" ", @list); # join sur l'espace

			my $goodorbad=&check($content); # vérifier si les catégories sont dans la liste ou non
			
            # si tout va bien
			if ($goodorbad eq "good"){
				print "Votre patron : $content\n\n";
				
				print "Souhaitez-vous garder ce patron ? y/n : ";
				my $garder=<STDIN>;
				
				if ($garder eq "y\n"){
					$patrons.="$content\n";
					print "Vos patrons :\n$patrons\n";
				}
			}
			
		}
        # Voulez-vous ajouter un autre ?
		elsif($reponse ne "n\n"){
			print "Je n'ai pas compris votre reponse.\n"
		}
		
        # fin des patrons
		else{
			$end=1;
		}
	}
	
	my $fichierpatrons=ecrirepatrons($patrons);

    return $fichierpatrons;
}

#============= SUB : Ecrire dans un fichier patrons.txt ============

sub ecrirepatrons{

	my $patrons=shift;
	my $fichieroriginal="patrons";
	my $fichier=$fichieroriginal;

	my $new=0;
	my $k=1;
	while ($new==0){
		if (-f "$fichier.txt"){
			$fichier="$fichieroriginal($k)";
			$k+=1;
		}
		else{
			$new=1;
		}
	}
	open PATRONS,">:encoding(UTF-8)", "$fichier.txt" or die "Problème a l'ouverture du fichier - $!";
	print PATRONS $patrons;
	close PATRONS;

    return $fichier.".txt";
}


#============= SUB : vérifier la bonne formation du patron ==============
sub check{
	my $content=shift;
	my @cats=(
		"ADJ[A-Z]+", "ADJFS", "ADJMS", "ADJINT", "ADJSIG",
		"DET[A-Z]+", "DETFS", "DETDPIG", "DETDMS", "DETDFS",
		"NP[A-Z]+", "NPFS", "NPI","NPSIG",
		"NC[A-Z]+", "NCMIN", "NCFS", "NCI","NCMP","NPSIG",  
		"VIND[A-Z1-3]+", "VINDP3S",
		"PREP", 
		"ADJ[A-Z]+", "ADJINV", "ADJMS",
		"ADV",
		"PDP");
		
	my @list=split(" ", $content);
	
	foreach my $element(@list){
		my $found=0;
		foreach my $cat(@cats){
		
			if ($element eq $cat){
				$found=1;
			}
		}
		
		if ($found==0){
		
			print "Probleme avec la categorie $element. Veillez a mettre les categories en majuscules et tapez tab pour avoir une liste des possibilites.\n";
			return "bad";
		}
	
	}
	
	return "good";
}


#====================================>
#	SUB : extract patterns
#====================================>

sub extractpatterns{

	my $fichier_entree=shift;
	my $fichier_sortie=shift;
	my $patron=shift;

   print "\n>>> Extraction des patrons\n";
   #print $fichier_sortie;

	my @phrase=();
	my $compteur=0;

	if ($fichier_entree=~/(.+?)\.cnr$/)# si c'est le correct format (.cnr)
	{
		print "\n$fichier_entree\n";
		
        # Créer le fichier de sortie. Pendant le traitement le fichier sera
        # rempli par concaténation, donc il est important d'initialiser le fichier
        # vide au début.
		if (!open (FILEOUT,">:encoding(iso-8859-1)","$fichier_sortie"))
		{ 
			die "Probleme a l'ouverture du fichier : $fichier_sortie $!\n";
		}
		close(FILEOUT);
		
        # Lire le fichier en entrée
        open(FILE_IN, "<:encoding(iso-8859-1)", "$fichier_entree") or die "HELP";
		while(my $line=<FILE_IN>)
		{
			if ($line!~/PCTFORTE/) # traitement jusqu'à une ponctuation forte
				{
					chomp($line);
					$line=~s/\r//;
					push(@phrase, $line);
					$compteur++;
				}
				
				else #quand on arrive à une ponctuation forte
				{
					#------ Traitement sur les tokens ------>
					&traiter_liste_categories($fichier_sortie, $patron, $compteur, \@phrase);

					#---- réinitialisation des tableaux ---->
					@phrase=();
					$compteur=0;
				}
		}
		close(FILE_IN);
	}

}

#====================================>
#	SUB : Traitement des catégories
#====================================>

sub traiter_liste_categories
{
	my $file_a_creer=shift;
    my $fichier_patrons=shift;
    my $compteur=shift;
    my $refphrase=shift;
    my @phrase=@$refphrase;
	
    # Ouvrir le fichier de sortie (en mode 'append')
	if (!open (FILEOUT,">>:encoding(iso-8859-1)","$file_a_creer")) { 
		die "Probleme a l'ouverture du fichier $file_a_creer : $!\n";
	}

    # Ouvrir le fichier de patrons
	open(FILE_PATRONS, "<:encoding(iso-8859-1)", $fichier_patrons);
	while(my $line_patron=<FILE_PATRONS>) # pour chaque patron syntaxique
	{
		chomp($line_patron);
		$line_patron=~s/\r//g; # supprimer CR de Windows
		
		my @patron=split(" ",$line_patron); # convertir le patron en une liste de catégories
		my $patron_size = $#patron+1; # calculer la taille du patron (index du dernier élément +1)

		my $result="";
		
        # boucle sur les mots dans la phrase ($compteur = nombre de mots)
		for (my $i=0; $i<$compteur; $i+=1)
		{
			#s'il sera possible de trouver le patron à partir de l'endroit actuel
			if ($i+$patron_size<=$compteur)
			{	
				my $k=$i; # $k = l'index du mot actuel
				my $found=-1; # compteur pour le nbr d'éléments à trouver. Initialisé pour rentrer dans la boucle

                #pour chaque élément dans le patron - si à chaque fois la catégorie est trouvée ($found!=0)
				for (my $j=0; ($j<$patron_size) && ($found!=0); $j+=1)
				{
                    # si c'est la première fois, intialiser le nbr de cats trouvées à 0
					if ($found==-1)
						{
							$found=0;
						}
                    # s'il y a une correspondance entre la catégorie du mot actuel et la catégorie du patron
					if ($phrase[$k]=~/(.+?)\t(.+?)\t$patron[$j]/)
					{

						$result=$result." ".$1; # ajouter le mot au résultat
						$found++; # $found=$found+1
						$k++; # enquêter sur le mot suivant
						
                        # si le nbr de catégories trouvées est égal au nombre de catégories dans le patron
						if ($found==$patron_size)
						{
							#print "$result\n";
							
							print FILEOUT $result."\n"; # imprimer le résultat dans le fichier
							
						}	
					}
                    # s'il n'y a pas de correspondance,on ne continu pas de chercher 
                    #jusqu'à la fin du patron -> la boucle finit et on passe au mot suivant 
					else
					{
						#print"\nrestarting\n";
						$result="";
						$found=0;
					}
				}
			}	
		}
	}
	close(FILE_PATRONS);
    close(FILEOUT);
}

