#!/usr/bin/perl -w

use strict;
use warnings;


if (@ARGV < 5)
{
	print "<file ERR/OK/MHV> <rep super ctm> <ordre> <equilibre|backward|backward+1|forward> <tag (err,ok,mhv...)>\n"
}
else
{
	my $NomFichier = $ARGV[0];
	my $RepSuperCTM = $ARGV[1];
	my $Ordre = $ARGV[2];
	my $Sens = $ARGV[3];
	my $Tag = $ARGV[4];

	if ($Sens ne "backward" && $Sens ne "forward" && $Sens ne "backward+1" && $Sens ne "equilibre")
	{
		die "mauvais parametre sens : <equilibre|backward|backward+1|forward>\n";
	}

	if ($Sens eq "backward" || $Sens eq "forward" || $Sens eq "backward+1")
	{
		$Ordre++;
	}


	my %MotDetecte;


	open (MHV, $NomFichier) or die "Ouverture de $NomFichier loupée !";

	opendir REP, $RepSuperCTM;


	chdir ( $RepSuperCTM );

	my @ListeFichiers = readdir (REP);

	closedir REP;



	my %MotCherche;

	my $Compteur=0;

	foreach my $Ligne (<MHV>)
	{

		if ($Ligne=~/(.*?) (.*?) (.*?) (.*?) (.*)/)
		{
			my $NomFichier = $1;
			my $DebFinal = $2;
			my $DureeMHV = $3;
			my $Mot = $4;
			my $MotRef = $5;

			#print "--> $Ligne \n";

			chomp($Mot);

			foreach my $Fic (@ListeFichiers)
			{
				if ($Fic=~/${NomFichier}.*/i)
				{
					#20001019_0928_1028_rfi_287179:815_S387_S
					#20070710_0630_0650_rfi#119016:797#M#S165

					#$Fic=~/(.*)_([0-9]*):([0-9]*)_.*?_([ST]+).*/;

					#print "$Fic\n";
					$Fic=~/(.*?)([0-9]+):([0-9]+).*?([MF]+)#([ST]+).*/;

					my $Debut=$2;
					my $DureeTotale=$3;
					my $Genre=$4;
					my $Type=$5;

					#print "$Ligne\n";
					#print "definal : $DebFinal, debut : $Debut, dureetot : $DureeTotale\n";
					if ($DebFinal >= $Debut && $DebFinal <= ($Debut+$DureeTotale))
					{
						#print "ouverture de $Fic \n";
						open (SUPERCTM, $Fic) or die "Ouverture de $Fic loupée !";


						my $NumLigne=0;
						my @Lignes;

						my @FicCTM;

						@FicCTM = <SUPERCTM>;

						close SUPERCTM;

						for (my $k=0; $k < @FicCTM; $k++)
						{

							my $LigneSuperCTM=$FicCTM[$k];

							if ($LigneSuperCTM=~/.*? .*?\t(.*?)\t(.*?)\t(.*)?[\t ].*/)
							{
								my $Offset=$1;
								my $DebSuperCTM=$Offset+$Debut+1;
								my $DureeSuperCTM=$2;
								my $MotCTM=$3;

								my $Recouvrement = CalculerRecouvrement($DebFinal, $DebFinal+$DureeMHV, $DebSuperCTM, $DebSuperCTM+$DureeSuperCTM);

								#print "---> debfinal : $DebFinal, Duree : $Duree , DebSuperCTM : $DebSuperCTM, DureeSuperCTM : $DureeSuperCTM\n";

								$MotCTM=~tr/[A-Z\xc0-\xdd]/[a-z\xe0-\xff]/;

								$MotCTM=~/.*?mot=(.*?)\s.*/;

								my $MotTarg=$1;
								#&& $MotCTM ne $MotRef 
								#print "mot : $Mot, ctm : $MotTarg\n";
								#if ($Recouvrement >= min($DureeMHV, $DureeSuperCTM, $DureeMHV) )
								if ($Recouvrement >= min($DureeMHV, $DureeSuperCTM, $DureeMHV) && !exists $MotCherche{$LigneSuperCTM})
								#if ($Recouvrement >= min($DureeMHV, $DureeSuperCTM, 1)})
								{
									my $ComptMot=0;

									$MotDetecte{$Ligne}=1;
									#print "detect : $Ligne\n";

									print "$Compteur	$ComptMot	$Tag	$Fic	$LigneSuperCTM";

									$MotCherche{$LigneSuperCTM}=1;

									if ($Ordre > 1)
									{
										for (my $i=1; $i < $Ordre; $i++)
										{

											if ($Sens eq "equilibre" || $Sens eq "backward" || $Sens eq "backward+1")
											{
												$ComptMot++;

												if ($k - $i >= 0)
												{
													my $Prec=$FicCTM[$k-$i];
													print "$Compteur	$ComptMot	$Tag	$Fic	$Prec";
												}
											}


											if ($Sens eq "equilibre" || $Sens eq "forward" || ($Sens eq "backward+1" && $i == 1)) 
											{
												$ComptMot++;

												if ($k + $i < @FicCTM)
												{
													my $Suiv=$FicCTM[$k+$i];
													print "$Compteur	$ComptMot	$Tag	$Fic	$Suiv";
												}
											}
										}
									}

									$Compteur++; # modif 13 aout 2009 pour ordre 1
									$NumLigne++;
								}
							}

						}
					}
				}
			}
		}
	}


	if (0)
	{
		foreach my $Fic (@ListeFichiers)
		{
			#print "ouverture de $Fic \n";
			open (SUPERCTM, $Fic) or die "Ouverture de $Fic loupée !";

			#foreach my $LigneSuperCTM (<SUPERCTM>)

			$Fic=~/(.*)_([0-9]*):([0-9]*)_.*?_([ST]+).*/;

			my $Tel=$4;
			my @FicCTM = <SUPERCTM>;

			close SUPERCTM;

			for (my $k=0; $k < @FicCTM; $k++)
			{
				my $LigneSuperCTM=$FicCTM[$k];

				if (!exists $MotCherche{$LigneSuperCTM})
				{

					my $ComptMot=0;

					print "$Compteur	0	UNK	$Fic	$LigneSuperCTM";

					if ($Ordre > 1)
					{
						for (my $i=1; $i < $Ordre; $i++)
						{

							if ($Sens eq "equilibre" || $Sens eq "backward" || $Sens eq "backward+1")
							{
								$ComptMot++;

								if ($k - $i >= 0)
								{

									my $Prec=$FicCTM[$k-$i];
									print "$Compteur	$ComptMot	UNK	$Fic	$Prec";
								}
							}

							if ($Sens eq "equilibre" || $Sens eq "forward"  || ($Sens eq "backward+1" && $i == 1))
							{

								$ComptMot++;

								if ($k + $i < @FicCTM)
								{
									my $Suiv=$FicCTM[$k+$i];

									print "$Compteur	$ComptMot	UNK	$Fic	$Suiv";
								}
							}
						}
					}
					$Compteur++;
				}
			}
		}
	}
}


sub min
{
	my ($a,$b,$c)=@_;


	if ($a <=$b && $a <=$c)
	{
		return $a;
	}
	if ($b <= $a && $b <= $c)
	{
		return $b;
	}
	if ($c < $a && $c < $b)
	{
		return $c;
	}
}


sub CalculerRecouvrement
{
	my ($a,$b,$c,$d)=@_;

	my $Rec=0;

	if ( ($c<$a && $d<=$a) || ($c>=$b && $d>$b) )
	{
		$Rec=0;
	}
	elsif ($c<=$a && $d>=$b)
	{
		$Rec=abs($b-$a);
	}
	elsif ($c>=$a && $d<=$b)
	{
		$Rec=abs($d-$c);
	}
	elsif ($c>=$a && $c<$b && $d>=$b)
	{
		$Rec=abs($b-$c);
	}
	elsif ($c<=$a && $d>$a && $d<=$b)
	{
		$Rec=abs($d-$a);
	}

	return $Rec;
}


