#!/usr/bin/perl -s

################################################################
# Fazedor das labels pra etaps
#
# Se nao funcionar, nao fui eu que fiz.
# Se funcionar, fui O:-) <rubenfonseca@di.uminho.pt>
################################################################

use strict;
use warnings;
use Text::CSV_XS;
use utf8;

# Ligar a opcao duplex se quisermos imprimir uma pagina
# em branco por cada pagina impessa... Util se a impressora
# insistir em imprimir dum lado e do outro...

# Usar a opcao special para imprimir casos especiais
# -special=1 -> \club
# -special=2 -> \diamond
# -special=3 -> \heart
# -special=4 -> \spade
our ($duplex, $special);

my $csv = Text::CSV_XS->new({binary => 1});
my $file = shift or die "Need a CSV file";

my $nigerianos = 0;
my $ucranianos = 0;

my $count = 0;
my $filen = 1;

my $g = preambulo($filen);

# Parse :D
open F, "<$file";
while(<F>) {
	if($csv->parse($_)) {
		my @fields = $csv->fields;

		next if $fields[0] eq 'Id';
		if($fields[5] =~ /nigeria/i && $fields[13] eq 'pending') {
			$nigerianos++;
			next;
		}

		if($fields[5] =~ /ukraine/i && $fields[13] eq 'pending') {
			$ucranianos++;
			next;
		}

		# Protect some symbols LaTex doesn't like
		map { s!\\!\$\\backslash\$!g } @fields;
		map { s!([\{\}\_\^\$\#\%\&])!\\$1!g } @fields;

		# Generate :D
		generate($g, @fields);

		# If we want a blank page...
		blank_page($g) if($duplex);

		# Fatias
		$count++;
		if($count >= 50) {
			$count = 0;
			$filen++;
			posambulo($g);
			$g = preambulo($filen);
		}
	} else {
		die $_;
	}
}
posambulo($g);
close F;

print "$nigerianos nigerianos que nao pagaram removidos\n";
print "$ucranianos ucranianos que nao pagaram removidos\n";

sub generate {
	my($f, @fields) = @_;

	# Instrucoes
	print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
        \\begin{center}
        {\\Huge\\bfseries\\sf Instructions}\\\\[30pt]
		\\begin{quote}
		{\\bfseries\\sf
		
		Please split and use the
		identification to make your badge.
		
		Keep the tickets
		with you to enter the banquet/dinners.

		If you have any problem please contact the organization.
		}
		\\end{quote}
        \\end{center}
}
EOF

	# Informações de proceedings
	my $proc1 = join "\n", map { "\\item $_" } get_acronim_from_satalite($fields[11]);
	my $proc2 = join "\n", map { "\\item $_" } get_acronim_from_satalite($fields[12]);

	print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
        \\begin{center}
        {\\Huge\\bfseries\\sf Proceedings}\\\\[30pt]
		\\begin{quote}
		{\\bfseries\\sf
			\\begin{itemize}
			$proc1
			$proc2
			\\end{itemize}
		}
		\\end{quote}
        \\end{center}
}
EOF

	# 3º e 4º quadrado: badge
	my $entrance = construct_authorized_entrance($fields[7], $fields[8]);

	# Algum pessoal mete o nome do pais todo em maiusculas...
	$fields[2] = join(' ', map { ucfirst($_) } (split / /, lc($fields[2])));
	if($fields[5] ne 'UK' && $fields[5] ne 'USA') {
		$fields[5] = ucfirst(lc($fields[5]));
	}
	if($fields[5] =~ /uk/i)  { $fields[5] = 'UK'; }
	if($fields[5] =~ /usa/i) { $fields[5] = 'USA'; }
	if($fields[5] =~ /united states of america/i) {
		$fields[5] = 'USA';
	}

	# XXX
	if(length($fields[4]) > 40) { 
	# 	print "### This is user has a BIG Institution\n";
	# 	print "Institution: $fields[4]\n";
	# 	print "### Please insert a small institution for this user\n";
	# 	print ">>>";
	# 	$fields[4] = <STDIN>;
	# 	chomp($fields[4]);
		$fields[4] = "\\small { $fields[4] }";
	}

	my $simbolozinho = '';
	if($special) {
		$simbolozinho = '{\\Huge\\textcolor{red}{';

		$simbolozinho .= '$\\clubsuit$'    if($special == 1);
		$simbolozinho .= '$\\diamondsuit$' if($special == 2);
		$simbolozinho .= '$\\heartsuit$'   if($special == 3);
		$simbolozinho .= '$\\spadesuit$'   if($special == 4);

		$simbolozinho .= "}}";
	}

	for(1 .. 2) {
		print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
	\\includegraphics[width=96mm,height=60mm]{p2}
	
	{
		\\vskip -8mm
		\\hspace{3mm}
		{\\large\\bfseries\\sf $entrance}
	}
EOF

	if($simbolozinho) {
		print $f <<EOF;
	\\vskip -53mm
	\\mbox{}\\hfill
	$simbolozinho
	\\hspace{3mm}
	\\mbox{}
EOF
	} else {
		print $f <<EOF;
	\\vskip -52mm
	\\mbox{}
EOF
	}

	print $f <<EOF

        \\begin{center}
	\\vskip -5mm
        {\\Huge\\bfseries\\sf $fields[2]}\\\\[10pt]
        {\\Large\\bfseries\\sf $fields[4]}\\\\[10pt]
        {\\Large\\sf $fields[5]}\\\\[30pt]
        \\end{center}
	}
EOF
	}

	# Comida :D
	my $comida = comida($fields[9]);

	for my $conf (sort keys %{$comida}) {
		my $qual;
		$qual = 'Pre-Conference Dinner'   if($conf eq 'pre'  );
		$qual = 'Post-Conference Dinner'  if($conf eq 'post' );
		$qual = 'Main Conference Banquet' if($conf eq 'etaps');

		my $quando;
		$quando = 'Sunday, March 25'   if($conf eq 'pre'  );
		$quando = 'Saturday, March 31'  if($conf eq 'post' );
		$quando = 'Wednesday, March 28' if($conf eq 'etaps');

		for(1 .. $comida->{$conf}) {
			print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
        \\begin{center}
        {\\Huge\\bfseries\\sf $qual}\\\\[30pt]
        {\\Large\\bfseries\\sf Ticket}\\\\[20pt]
		{\\large\\bfseries\\sf $quando}
        \\end{center}
}
EOF
		}
	}

	my $soma = 0;
	map { $soma += $_} (values %{$comida});
	for($soma .. 3) {
		print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
}
EOF
	}

}

sub blank_page {
	my ($f) = @_;

	for(1 .. 8) {
		print $f <<EOF;
\\addresslabel[\\fboxsep=0pt\\fboxrule=1pt]{%
}
EOF
	}
}

sub construct_authorized_entrance {
	my ($type, $satalite) = @_;

	my @sat = get_acronim_from_satalite($satalite);

	if($type eq 'Conferences \& Satellite Events') {
		unshift @sat, "ETAPS";
	} elsif($type eq 'Satellite Events Only') {
		# nothing to see here, move along
	} else {
		die "Conference type not recognized: $type\n";
	}

	return join ', ', @sat;
}

sub get_acronim_from_satalite {
	my ($satalite) = @_;

	my @res;
	my @confs = split /\;/, $satalite;
	for my $conf (@confs) {
		$conf =~ /^([^\-\:]+)/;
		$conf = $1;
		$conf =~ s/^\s+//;
		$conf =~ s/\s+$//;
		push @res, $conf;
	}

	if((scalar @res) > 5) {
		pop @res while((scalar @res) > 5);	
		push @res, '...';
		warn "Este gajo vai a mais de 5 conferencias...\n";
	}

	return @res;
}

sub comida {
	my ($comida) = @_;

	my %res;
	my @confs = split /\;/, $comida;
	for my $conf (@confs) {
		if($conf =~ /(\d)x Pre/) {
			$res{pre} = $1;	
		} elsif($conf =~ /(\d)x Post/) {
			$res{post} = $1;	
		} elsif($conf =~ /(\d)x ETAPS/) {
			$res{etaps} = $1;	
		} else {
			die "Comida not found: $conf\n";
		}
	}

	my $soma = 0;
	map { $soma += $_ } (values %res);
	if($soma > 4) {
		die "Nao ha espaco pra tanta comida...\n";
	}

	return \%res;
}

sub preambulo {
	my ($filen) = @_;

	# Preamblo
	open my $g, ">out$filen.tex";
	print $g <<EOF;
\\documentclass[12pt,a4paper]{article}
\\usepackage{labels}
\\usepackage{color}
\\usepackage{graphicx}
\\usepackage[utf8]{inputenc}
\\usepackage{ucs}

\%\\LabelInfotrue
\%\\LabelGridtrue
\\LabelRows=4\\LabelCols=2

\\LeftBorder=3mm\\RightBorder=2mm
\\TopBorder=0mm\\BottomBorder=23mm

\\begin{document}
EOF

	return $g;
}

sub posambulo {
	my ($g) = @_;

	# Posambulo (<-- ?)
	print $g "\n\\end{document}\n";
	close $g;
}
