#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use Getopt::Long;

use XML::LibXML;

my $inputPath = '';
my $single = '';

my $return = GetOptions( "inputdir=s" => \$inputPath,
						 "single" => \$single);

my $inputConversionXmlFile = 'ConversionStats.xml';
my $inputDemuxXmlFile = 'DemultiplexingStats.xml';
my $conversionLocation = $inputPath . "/" . $inputConversionXmlFile;
my $demuxLocation = $inputPath . "/" . $inputDemuxXmlFile;

my %samples;

my $conversionDom = XML::LibXML->load_xml(location => $conversionLocation);
my $demuxDom = XML::LibXML->load_xml(location => $demuxLocation);

foreach my $sample ($conversionDom->findnodes('/Stats/Flowcell/Project[@name!="all"]/Sample')) {
	my ($sampleName) = $sample->attributes('name');
	foreach my $lane ($sample->findnodes('./Barcode[@name!="all"]/Lane')) {
		my ($laneName) = $lane->attributes('number');
		$samples{$laneName->to_literal}{$sampleName->to_literal}++;
	}
}

print "Lane\tSample Name\tBarcode\tPF Reads\t% of PF Reads\tYield (Gbp)\tR1 % >= Q30\tR2 % >= Q30\tR1 Ave Q-Score\tR2 Ave Q-Score\t% Perfect Index Read\t% Mismatch Index Read\n";
foreach my $laneID (sort keys %samples) {
	my $totalQuery = '/Stats/Flowcell/Project[@name="all"]/Sample[@name="all"]/Barcode[@name="all"]/Lane[@number="'.$laneID.'"]/BarcodeCount';
	my $totalPfClusterCount = ($demuxDom->findvalue($totalQuery));
	foreach my $sampleID (sort keys %{$samples{$laneID}} ) {
		my $query = '/Stats/Flowcell/Project[@name!="all"]/Sample[@name="'.$sampleID.'"]';
		foreach my $sample ($conversionDom->findnodes($query)) {
			print "$laneID";
			print "\t", ($sampleID ne 'Undetermined') ? $sampleID : 'PhiX+Undeter';
	 		foreach my $barcode ($sample->findnodes('./Barcode')) {
				my ($barcodeName) = $barcode->attributes('name');
				my $barcodeID = $barcodeName->to_literal;
				if ($barcodeID eq 'all') {next};
				print "\t", ($barcodeID ne 'unknown') ? $barcodeID : '';
				my $pfClusterCount;
 				foreach my $pfClusters ($barcode->findnodes('./Lane[@number="'.$laneID.'"]/Tile/Pf/ClusterCount')) {
 					$pfClusterCount += $pfClusters->to_literal;
 				}
 				print "\t", $pfClusterCount;
 				print "\t", $pfClusterCount/$totalPfClusterCount;
				my %sampleStats;
				my @reads = qw/1 2/;
				my @nodes = qw/Yield YieldQ30 QualityScoreSum/;
				foreach my $read (@reads) {
					foreach my $node (@nodes) {
						foreach my $tileStat ($barcode->findnodes('./Lane[@number="'.$laneID.'"]/Tile/Pf/Read[@number="'.$read.'"]/'.$node)) {
							$sampleStats{$node}{$read} += $tileStat->to_literal;
						}
					}
				}
				print "\t", ($single) ? $sampleStats{'Yield'}{'1'}/1e9 : ($sampleStats{'Yield'}{'1'} + $sampleStats{'Yield'}{'2'})/1e9;
				print "\t", ($sampleStats{'Yield'}{'1'}) ? $sampleStats{'YieldQ30'}{'1'}/$sampleStats{'Yield'}{'1'} : '0';
				if ( !$single ) { 
					print "\t", ($sampleStats{'Yield'}{'2'}) ? $sampleStats{'YieldQ30'}{'2'}/$sampleStats{'Yield'}{'2'} : '0';
				} else {
					 print "\t";
				}
				print "\t", ($sampleStats{'Yield'}{'1'}) ? $sampleStats{'QualityScoreSum'}{'1'}/$sampleStats{'Yield'}{'1'} : '0';
				if ( !$single ) {
					print "\t", ($sampleStats{'Yield'}{'2'}) ? $sampleStats{'QualityScoreSum'}{'2'}/$sampleStats{'Yield'}{'2'} : '0';
				} else {
					 print "\t";
				}
				my $barcodeQuery = '/Stats/Flowcell/Project[@name!="all"]/Sample[@name="'.$sampleID.'"]/Barcode[@name="'.$barcodeID.'"]/Lane[@number="'.$laneID.'"]';
				foreach my $sampleBarcode ($demuxDom->findnodes($barcodeQuery)) {
					my %barcodeStats;
					my @nodes = qw/BarcodeCount PerfectBarcodeCount OneMismatchBarcodeCount/;
						foreach my $node (@nodes) {
							$barcodeStats{$node} = ($sampleBarcode->findvalue('./'.$node));
						}
					print "\t", ($barcodeStats{'PerfectBarcodeCount'}) ? ($barcodeStats{'PerfectBarcodeCount'}/$barcodeStats{'BarcodeCount'}) : '0';
					print "\t", ($barcodeStats{'OneMismatchBarcodeCount'}) ? ($barcodeStats{'OneMismatchBarcodeCount'}/$barcodeStats{'BarcodeCount'}) : '0';
					print "\n";
				}
			}
		}
	}
}
