#!usr/bin/perl

# But du programme : Faire un recode forcé de tous les fichiers contenus dans le dossier passé en paramètre de la ligne de 
# commande
# Fonctionnement : perl+prog+dossier (le dossier doit porter le nom d'un encodage et être issus de BAO1)

use strict;
use warnings;
use 5.014;
use Switch;
use Encode;
use Data::Dumper;

# Main

say "_"x20;
die "\nPour $0 syntaxe correcte : perl $0 nom_repertoire (le nom de dossier doit être un encodage)" unless @ARGV == 1;
my $dossier=$ARGV[0];
my $encodage = "$dossier";
$encodage=~ s/.*?\/(.*?)/$1/g;
say $encodage;

my @tabUtf8=("utf8","utf-8","UTF8","UTF-8");
my $iso="iso-8859-1";
my $utf8="utf8";
my $case;
my $saveName;

foreach my $cell (@tabUtf8)
{
	if ($cell eq $encodage)
	{
		$case=1;
		system ("rm -rf  ./RESULTAT_EXTRACTION/RECODE_ISO");
		system("rm -rf ./RESULTAT_EXTRACTION/treetagger/utf8");
		mkdir ("./RESULTAT_EXTRACTION/RECODE_ISO");
	}
}
if ($encodage eq $iso)
{
	$case=2;
	system ("rm -rf  ./RESULTAT_EXTRACTION/RECODE_UTF8");
	system("rm -rf ./RESULTAT_EXTRACTION/treetagger/recodeIso");
	mkdir ("./RESULTAT_EXTRACTION/RECODE_UTF8");
}
switch ($case)
{
	case 1{parcours($dossier)}
	case 2{parcours($dossier)}
	else {say "nom de dossier invalide"}
}
#Fonction(s)

sub parcours
{
	my ($dossierEnCours)=@_;
	opendir (my $D, $dossierEnCours)  or die "Erreur d'ouverture de dossier type : $!";
	foreach my $x (readdir ($D))
	{		
			$saveName=$x;
			$x=$dossierEnCours."/".$x;
			next if $x=~ /^\.|\.\.?$/;
		if (-d $x)
		{
			parcours($x);
		}
		elsif (-f $x)
		{
			detecteTXT($x);
		}
	}	
	closedir $D;
}

sub detecteTXT
{
	my ($fichier)=@_;
	if (!($fichier=~ m/.*?xmlrss.*?txt$/))
	{
		
		if($fichier=~ m/txt$/)
		{
			nomChemin($fichier);
		}
	}
}

sub nomChemin
{
	my ($chemin)=@_;
	my $rubrique;
	my $fichier;
	if ($case==1)
	{	
		$chemin=~ s/utf8/UTF-8/g;
		$chemin=~ s/utf8/UTF-8/g;
		$chemin=~ s/utf-8/UTF-8/g;
		$chemin=~ s/UTF8/UTF-8/g;
		while ($chemin=~ m/.*UTF-8.(.*?).(0,.*txt)$/g)
		{
			$rubrique=$1;
			$fichier=$2;
			recode($chemin,$rubrique,$fichier);
		}
	}

	if ($case==2)
	{	
		while ($chemin=~ m/.*$iso.(.*?).(0,.*txt)$/g)
		{
			$rubrique=$1;
			$fichier=$2;
			recode($chemin,$rubrique,$fichier);
		}
	}

}

sub recode
{
	my %hashUtf8=(
		"\x{0153}"=>"œ",
		"\x{0140}"=>"ŀ",
		"\x{2019}"=>"’",
		"\x{2026}"=>"…",
		"\x{201c}"=>"“",
		"\x{201d}"=>"”",
		"\x{20ac}"=>"€",
		"\x{2031}"=>"‱",
		"\x{2009}"=>" ",
		"\x{2018}"=>"‘",
		"\x{2192}"=>"→",
		"\x{fffd}"=>"�",
		"\x{2001}"=>" ",
		"\x{0152}"=>"Œ",
		"\x{C3A9}"=>"\x{E9}",
		"\x{2013}"=>"–"
	);
	my %hashIso=(
#	"\xE9"=>"\x{C3A9}"
	);
	my ($chemin,$rubrique,$fichier)=@_;
	if ($case==1)
	{
		mkdir ("./RESULTAT_EXTRACTION/RECODE_ISO");		
		mkdir ("./RESULTAT_EXTRACTION/RECODE_ISO/$rubrique");		
		my $casVide=0;		
		open (my $IN, "<:encoding($utf8)", "$chemin") or die "problème ouverture fichier UTF8 numéro : $chemin";
		open (my $OUT, ">>:encoding($iso)", "./RESULTAT_EXTRACTION/RECODE_ISO/$rubrique/recode$fichier");
		unless (my $test = <$IN>)
		{
			say $OUT "fichier vide";
			$casVide++;		
		}
		while (my $ligne = <$IN>)
		{
				foreach my $key (keys %hashUtf8)
			{
				$ligne=~ s/$key/$hashUtf8{$key}/g; 
			}
			#say "$rubrique $fichier";
			print $OUT "$ligne";
		}
		close $IN;
		close $OUT;
		if ($casVide == 0)
		{
		     
		    mkdir ("./RESULTAT_EXTRACTION/treetagger");
		    mkdir ("./RESULTAT_EXTRACTION/treetagger/utf8");
		    mkdir ("./RESULTAT_EXTRACTION/treetagger/utf8/$rubrique");
		    open (my $OUTTreetagger , ">>", "./RESULTAT_EXTRACTION/treetagger/utf8/$rubrique/tagger_$fichier");
		    foreach (`/home/joe/treetagger/cmd/tree-tagger-french-utf8 $chemin`)
		    {
		      print $OUTTreetagger "$_";
		    }
		    close $OUTTreetagger;
		}
	}
	if ($case==2)
	{
		mkdir ("./RESULTAT_EXTRACTION/RECODE_UTF8");
		mkdir ("./RESULTAT_EXTRACTION/RECODE_UTF8/$rubrique");
		my $casVide=0;
		open (my $IN2, "<:encoding($iso)", "$chemin") or die "problème ouverture fichier ISO numéro : $chemin";
		open (my $OUT2, ">>:encoding($utf8)", "./RESULTAT_EXTRACTION/RECODE_UTF8/$rubrique/recode$fichier") or die "problème ouverture fichier ISO numéro : $chemin";
		unless (my $test = <$IN2>)
		{
			say $OUT2 "fichier vide";
			$casVide++;		
		}
		while (my $ligne = <$IN2>)
		{
			foreach my $key (keys %hashIso)
			{
				$ligne=~ s/$key/$hashIso{$key}/g; 
			}
			#say "$rubrique $fichier";
			print $OUT2 "$ligne";
		}
		close $IN2;
		close $OUT2;
		if ($casVide == 0)
		{
		     
		    mkdir ("./RESULTAT_EXTRACTION/treetagger");
		    mkdir ("./RESULTAT_EXTRACTION/treetagger/recodeIso");
		    mkdir ("./RESULTAT_EXTRACTION/treetagger/recodeIso/$rubrique");
		    open (my $INTreetagger , "<", "./RESULTAT_EXTRACTION/RECODE_UTF8/$rubrique/recode$fichier");
		    open (my $OUTTreetagger , ">>", "./RESULTAT_EXTRACTION/treetagger/recodeIso/$rubrique/tagger_$fichier");
		    foreach (`/home/joe/treetagger/cmd/tree-tagger-french $chemin`)
		    {
		      print $OUTTreetagger "$_";
		    }
		    close $INTreetagger;
		    close $OUTTreetagger;
		}
	}
	
}

