#!/bin/perl

$basename = $ARGV[0];


$idx = "$basename"."_I.fastq";
$r1 = "$basename"."_R1.fastq";
$r2 = "$basename"."_R2.fastq";
my $bclength = 6;
my $bcfailed = 'NNNNNN';
open IDX, $idx;
open R1, $r1;
open R2, $r2;
# clean ouput files
system('rm -Rf output/*');

# counters
$ok = 0;
%samples;
$failed = 0;
%barcodes;
%all;
open FAILED, ">output/failed_interlaced.fastq";
while(my $idx = <IDX>) {
	my $barcode = <IDX>;
	my $dump = <IDX>;
	$dump .= <IDX>; # barcode qual
	chomp($barcode);
	# add /1 and /2 to readname for de-interlacing in galaxy
	my $readname = <R1>;
	my $reverse = <R2>; # discarded reverse readname
	# compose interlaceable readname
	chomp($readname);
	$readname =~ s/(\S+)\s(.*)/$1/;
	my $forwardname .= "$readname/1\n"; 
	my $reversename = "$readname/2\n";
	#  entries forward
	my $forward = $forwardname;
	$forward .= <R1>;
	$dump = <R1>;
	$forward .= "+\n"; # start of qual
	$forward .= <R1>;
	# remaining entries reverse
	$reverse = $reversename;
	$reverse .= <R2>;
	$dump = <R2>;
	$reverse .= "+\n"; # start of qual
	$reverse .= <R2>;
	if ($barcode ne $bcfailed) {
		my $sample = 0;
		if (defined($barcodes{$barcode})) {
			$sample = $barcodes{$barcode};
			$all{$sample}{$barcode}++;
		}
		else {
			$idx =~ m/.*:(\d+)$/;
			$sample = $1;
			$barcodes{$barcode} = $sample;
			$all{$sample}{$barcode} =  1;
		}
		if ($sample == 0) {
			# sample not found by Illumina software
			$failed++;
			print FAILED "$idx$barcode\n$dump$forward$reverse";
		}
		else {
			$ok++;
			$samples{$sample} = $samples{$sample} + 1;
			# seperate
			open OUT, ">>output/$basename"."_Sample_$sample"."_1_sequence.txt";
			print OUT $forward;
			close OUT;
			open OUT, ">>output/$basename"."_Sample_$sample"."_2_sequence.txt";
			print OUT $reverse;
			close OUT;
			# interlace
			open OUT, ">>output/$basename"."_Sample_$sample"."_interlaced.fastq";
			print OUT $forward.$reverse;
			close OUT;
		}
	}
	else {
		$failed++;
		print FAILED "$idx$barcode\n$dump$forward$reverse";
	}
}
close FAILED;
close IDX;
close R1;
close R2;

# stats
$total = $ok + $failed;
print "\nDONE\n####\n";
print "Total reads: $total\n";
print "Success rate: $ok/$total\n";
print "Failure rate: $failed/$total\n";
print "Nr. samples found: ". keys(%samples)."\n";
print "Found samples with corresponding read count:\n";
open OUT, ">found_barcodes.txt\n";
foreach (keys(%samples)) {
	print "\t$_ => $samples{$_}\n";
}
#close OUT;


foreach (sort(keys(%all))) {
	my %hash = $all{$_};
	my $samplenr = $_;
	next if ($samplenr == 0);
	print OUT "\nBarcodes for sample $samplenr:\n";
	print OUT "#######################\n";
	foreach $code (keys(%{$all{$samplenr}})) {
		print OUT "\t$code => $all{$samplenr}{$code}\n";
		#print  "\t$code => $all{$samplenr}{$code}\n";
	}
}
close OUT;
