#! /usr/bin/perl -w

use strict;


my $listeContig = $ARGV[0];
my $allContigsFile = $ARGV[1];

#my ($path1,$path2,$path3,$path4,$path5,$path6,$lib,$path8) = split(/\//,$allContigsFile);
#my $path="/$path2/$path3/$path4/$path5/$path6/$lib";
#my ($project,$poub)=split(/\./,$path8);
my $contigNb  = $ARGV[2];
my $lib       = $ARGV[3];





# Déclaration des variables
my @tableau = ();
my $tableau = '';
my @newtableau = ();
my $newtableau = '';
my $newNbelement = '';
my $ligne = '';
my $lin = '';
my $line = '';
my $li = '';
my $overlap = '';
my $garderLigneSuivante = 0;
my $allContigsFileOneLine = $allContigsFile.".oneline";
my @ContigNames =();



# Creation d un tableau qui contient la liste des contigs selectionnes pour pouvoir boucler dessus par la suite

open (LISTECONTIG,$listeContig) or die ("$listeContig ne peut pas s ouvrir");
while (defined($ligne = <LISTECONTIG>)) {
	chomp($ligne);
	print "$ligne\n";
	if ($ligne =~ /^[Cc]ontig/) {
		my $ContigName = split(/\t/,$ligne);
		push(@ContigNames,$ContigName);
	}
} # Fin while
close (LISTECONTIG);
	



# Mise des sequences du fichier de sortie de cross_match sur une seule ligne
#`perl ./pgmDeBase/sequence_line.pl $allContigsFile $allContigsFileOneLine`;
`perl sequence_line.pl $allContigsFile $allContigsFileOneLine`;

#Boucle sur les contigs avec creation d un fichier contenant la sequence de chaque contig retenu et uniquement celle la
foreach my $element (@ContigNames) {
	
	#my $contigNb = substr($element,6);
	#my $vmfasta = "$path/$project.$lib."."C".$contigNb."VM.fasta";
	my $vmfasta = "$lib."."C".$contigNb."VM.fasta";

	open (ALLCONT,"$allContigsFileOneLine")or die "$allContigsFileOneLine n a pas pu s ouvrir correctement.";
	open (VMFASTA,">$vmfasta") or die "$vmfasta n a pas pu s ouvrir correctement."; 
	
	# Parcours du fichier screen contenant tous les contigs avec vecteur masque pour retenir le contig selectionne : creation du fichier VM.fasta
	while(defined($lin = <ALLCONT>)) {
		chomp($lin);
		if ($lin =~ /^>[Cc]ontig$contigNb\s/) {
#			print VMFASTA "$lin\n";
			print VMFASTA ">$lib."."C".$contigNb."\n";
			$garderLigneSuivante=1;
		}
		elsif ($garderLigneSuivante==1) {
			print VMFASTA "$lin";
			$garderLigneSuivante=0;
		}
	} # Fin boucle sur le parcours du fichier de tous les contigs
	#Fermeture des fichiers	
	close (ALLCONT);				
	close (VMFASTA);
	

	###### Creation des differents fichiers de Vecteur Nettoye suivant le nombre d elements que l on a dans le fichier Vecteur Masque #######

	# Fichier contenant la liste des contigs avec le traitement de vecteur qui leur a ete applique
	#my $contiglist = "$path/$project.$lib".".contiglist.fasta";
	my $contiglist = "$lib".".contiglist.fasta";
	# Fichier log de process fosmid
	#my $log_file = "$path/$project.$lib".".C".$contigNb."VN.nettoyageVecteur.log";
	my $log_file = "$lib".".C".$contigNb."VN.nettoyageVecteur.log";
	# Fichier contenant la sequence avec le vecteur nettoye
	#my $vnfasta = "$path/$project.$lib".".C".$contigNb."VN.fasta";
	my $vnfasta = "$lib".".C".$contigNb."VN.fasta";
		
	open (VMFASTA,$vmfasta) or die "$vmfasta ne peut pas s ouvrir.";	
	
	my $entete="";

	while (defined($line = <VMFASTA>)) {
		chomp($line);
		
		# Ligne d entete
#		if ($line =~ /^>[Cc]ontig$contigNb/) {
		if ($line =~ /^>/) {
			$entete=$line;
		}
				
		# Ligne contenant la sequence				
		else {
			@tableau = split(/X+/,$line);
			my $Nbelement = scalar (@tableau);
			print "Nbelement : $Nbelement\n";
			
			# Si le fichier ne contient que du vecteur le nombre d elements du tableau est = 0
			if ($Nbelement == 0) {
				open (CONTIGLIST,">>$contiglist") or die ("$contiglist ne peut pas s ouvrir correctement.");
				open (VNFASTA,">$vnfasta") or die "$vnfasta n a pas pu s ouvrir correctement.";
				print CONTIGLIST $lib.".C".$contigNb.".Vecteur aux extremites ou pas de vecteur\n";
				print VNFASTA ">"."$lib."."C"."$contigNb"." Ce contig ne contient que du vecteur\n";
				print VNFASTA ("AAAAAAAAAA\n"); #Sequence bidon pour ne pas faire planter les programmes
				close (VNFASTA);
				close (CONTIGLIST);
			
			}
			
			else {

			# Si le premier element du tableau est vide (sequence qui commence par des X) on decale tous les elements du tableau d un cran pour ne pas commencer par vide
			if ($tableau[0] eq '') {
				for (my $j=1;$j<$Nbelement;$j++) { 
					$newtableau[$j-1]=$tableau[$j];
				}
			}
			else { @newtableau=@tableau; }	
	
			my $newNbelement= scalar (@newtableau);

			open (CONTIGLIST,">>$contiglist") or die ("$contiglist ne peut pas s ouvrir correctement.");
			# Si le tableau comporte un seul element on est dans l un des cas suivant : BBBBB (pas de vecteur), XXXXXBBBBB (vecteur au debut), BBBBBBXXXXXXX (vecteur en fin), XXXXXXXBBBBBBXXXXXX (vecteur en debut et fin)
			if ($newNbelement == 1) { 
				open (VNFASTA,">$vnfasta") or die "$vnfasta n a pas pu s ouvrir correctement.";
				print CONTIGLIST $lib.".C".$contigNb.".Vecteur aux extremites ou pas de vecteur\n";
#				print VNFASTA ("$entete\n");
				print VNFASTA ">"."$lib."."C"."$contigNb"."\n";
				print VNFASTA ("$newtableau[0]\n"); #Copie de la sequence du contig dans le fichier VN.fasta
				close (VNFASTA);
			} #Fermeture de la boucle if
			
			# Si le tableau comporte 2 elements on est dans l un des cas suivant : BBBBBXXXXXXBBBBB (vecteur au milieu), XXXXXXBBBBBXXXXXXBBBBBBB (vecteur au debut et au milieu), 
			# BBBBBXXXXXXBBBBBXXXXXX (vecteur au milieu et en fin), XXXXXBBBBXXXXXBBBBXXXX (vecteur au milieu et aux 2 extremites)
			elsif ($newNbelement == 2) {
			
				# Creation dun fichier ne contenant plus que la sequence avec le vecteur au milieu (suprression des eventuels bouts de vecteur aux extremites
				open (TEMP,">$vmfasta.temp");
				print TEMP ("$entete\n");
				print TEMP ("$newtableau[0]"."XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"."$newtableau[1]");
				close (TEMP);
				
				# Process fosmide cree un fichier de log et un fichier $vmfasta.temp.modified qui contient la sequence reassemblee
				`pgmDeBase/process_fosmid_overlap_detection.py $vmfasta.temp > $log_file`;

				print CONTIGLIST $lib.".C".$contigNb.".Lancement process fosmide\n";
				open (NETTVECTEURLOG,$log_file) or die "$log_file n a pas pu s ouvrir correctement.";				
				while (defined($li = <NETTVECTEURLOG>)) {
					chomp ($li);
					# Si Overlap detecte pour ce contig le fichier $vmfasta.modified contient la sequence d interet
					if ($li =~ /^[Overlap =]/) {
						#`cp $vmfasta.temp.modified $vnfasta`;
						open (VNFASTA,">$vnfasta") or die "$vnfasta n a pas pu s ouvrir correctement.";
						open (VMMODIFIED,"$vmfasta.temp.modified") or die "$vmfasta.temp.modified na pas pu s ouvrir correctement";
						while (defined(my $lig = <VMMODIFIED>)) {
							if ($lig =~ />selected_contig/) { 
								print VNFASTA ">"."$lib."."C"."$contigNb"."\n";
							}
							else {
								print VNFASTA "$lig";
							}
						
						}
						close VNFASTA;
						close VMMODIFIED;
						print CONTIGLIST $lib.".C".$contigNb.".Vecteur au milieu avec Overlap\n";
					} #Fermeture de la boucle if (= overlap detecte)

					# Si pas d overlap creation de 2 fichier contenant pour l un la sequence avec le vecteur et pour l autre la sequence apres le vecteur
					elsif ($li =~ /^[No Overlap]/) { 
						print CONTIGLIST $lib.".C".$contigNb.".Vecteur au Milieu No Overlap\n";
						#my $outfileReads_VNa = "$path/$project.$lib."."C".$contigNb."aVN.fasta";
						#my $outfileReads_VNb = "$path/$project.$lib."."C".$contigNb."bVN.fasta";
						my $outfileReads_VNa = "$lib."."C".$contigNb."aVN.fasta";
						my $outfileReads_VNb = "$lib."."C".$contigNb."bVN.fasta";
						open (FILEA,">$outfileReads_VNa");
						print FILEA ">"."$lib."."C"."$contigNb"."a\n";
						print FILEA "$newtableau[0]";
						close (FILEA);
							
						open (FILEB,">$outfileReads_VNb");
						print FILEB ">"."$lib."."C"."$contigNb"."b\n";
						print FILEB "$newtableau[1]";
						close (FILEB);
								
					} #Fermeture de la boucle elsif

				} #Fermture de la boucle while
				close (NETTVECTEURLOG);

			} #Fermeture de la boucle elsif ($Nbelement == 2)
			
			# D autres cas ne se sont encore jamais produits mais au cas ou on stocke l information dans le fichier de suivi pour pouvoir les regarder manuellement
			else {
				print CONTIGLIST $lib.".C".$contigNb.".Cas particulier\n";
			}
			
			close (CONTIGLIST);
			
			} # Fin de la boucle else sur les tableaux non vides

		} #Fin de la boucle else
		
	} #Fin de la boucle while
	
	close (VMFASTA);
			
} #Fin de la boucle foreach sur tous les contigs
		

