#!/usr/bin/perl


# Déclaration des pragmas
use strict;
use utf8;
use open qw/:std :utf8/;

# Appel des modules externes de base
use Encode;
use Getopt::Long;

my ($programme) = $0 =~ m|^(?:.*/)?(.+)|;

my $version     = "1.2.1";
my $dateModif   = "06 Octobre 2017";

# Variables pour les options et variable prédéfinie
my $fichier = "";
my $types   = "journal";
my @types   = ();

eval	{
	$SIG{__WARN__} = sub {usage(1);};
	GetOptions(
		"fichier=s"   => \$fichier,
		"types=s"     => \@types,
		);
	};
$SIG{__WARN__} = sub {warn $_[0];};

usage(2) if not $fichier;

if ( @types ) {
	$types = join(",", @types);
	}

if ( $types !~ /^\w+(-\w+)?(,\w+(-\w+)?)*\z/ ) {
	print STDERR "$programme : Erreur dans l'écriture de l'option \"-t\"\n";
	exit 3;
	}

my %type = map {$_ => 1} split(/,/, $types);

# Variables et tableaux
my %annee  = ();
my %cat    = ();
my %corpus = ();
my %eissn  = ();
my %issn   = ();
my %nb     = ();
my %titre  = ();

if ( $fichier =~ /\.gz\z/ ) {
	open(INP, "gzcat $fichier |") or die "$!,";
	binmode(INP, ":utf8");
	}
elsif ( $fichier eq '-' ) {
	open(INP, "<&STDIN") or die "Cannot duplicate STDIN: $!,";
	}
else	{
	open(INP, "<:utf8", $fichier) or die "$!,";
	}

while(<INP>) {
	chomp;
	s/\r//go;
	my @champs = split(/\t/);
	my $corpus = $champs[1];
	my $type   = $champs[3];
	my $issn   = $champs[4];
	my $eissn  = $champs[5];
	my $revue  = $champs[7];
	my $annee  = $champs[8];
	my $catWoS = $champs[15];
	my $catSM  = $champs[16];

	# type correct ?
	my $ok = 0;
	foreach my $item (split/\s*[;,]\s*/, $type) {
		if ( $type{$item} ) {
			$ok ++;
			last;
			}
		}
	next if not $ok;

	my $titre  = $revue;
	$titre     =~ s/^\([^)]+\) *//o;
	$titre     =~ s/[\s:]*\([^)]+\)$//o;
	$titre     =~ s/^the +//io;
	$titre     =~ s/^der +//io;
	$titre     =~ s/^die +//io;
	$titre     =~ s/^les? +//io;
	$titre     =~ s/^la +//io;
	$titre     =~ s/^l\' *//io;
	$titre     =~ s/^du +//io;
	$titre     =~ s/^il +//io;
	$nb{$revue} ++;
	$titre{$revue} = $titre;
	if ( $issn ) {
		$eissn{$revue}{$eissn} ++;
		}
	if ( $eissn ) {
		$issn{$revue}{$issn} ++;
		}
	if ( $annee ) {
		$annee{$revue}{$annee} ++;
		}
	if ( $catWoS ) {
		$cat{$revue}{'WoS'}{$catWoS} ++;
		}
	if ( $catSM ) {
		$cat{$revue}{'SM'}{$catSM} ++;
		}
	}
close INP;

if ( %titre ) {
	print "\x{FEFF}Nb.\tTitre de revue\tISSN\te-ISSN\t";
	print "Date(s) de publication\tCatégories WoS\tCatégories Science-Metrix\n";
	}

foreach my $revue (sort {$titre{$a} cmp $titre{$b}} keys %titre) {
	print "$nb{$revue}\t$revue\t";
	if ( defined $issn{$revue} ) {
		my @issn = sort keys %{$issn{$revue}};
		print join("/", grep(/./, @issn));
		}
	print "\t";
	if ( defined $eissn{$revue} ) {
		my @eissn = sort keys %{$eissn{$revue}};
		print join("/", grep(/./, @eissn));
		}
	print "\t";
	if ( defined $annee{$revue} ) {
		my @annees = sort {$a <=> $b} keys %{$annee{$revue}};
		my $debut = shift @annees;
		my $fin = $debut;
		while ( @annees ) {
			my $annee = shift @annees;
			if ( $annee = $fin + 1 ) {
				$fin = $annee;
				}
			elsif ( $debut < $fin ) {
				print "$debut-$fin,";
				$debut = $annee;
				$fin = $annee;
				}
			else	{
				print "$debut,";
				$debut = $annee;
				$fin = $annee;
				}
			}
		if ( $debut < $fin ) {
			print "$debut-$fin";
			}
		else	{
			print "$debut";
			}
		}
	print "\t";
	if ( defined $cat{$revue}{'WoS'} ) {
		my @cats = sort {$cat{$revue}{'WoS'}{$b} <=> $cat{$revue}{'WoS'}{$a} or $a cmp $b} keys %{$cat{$revue}{'WoS'}};
		print join("/", @cats);
		}
	print "\t";
	if ( defined $cat{$revue}{'SM'} ) {
		my @cats = sort {$cat{$revue}{'SM'}{$b} <=> $cat{$revue}{'SM'}{$a} or $a cmp $b} keys %{$cat{$revue}{'SM'}};
		print join("/", @cats);
		}
	print "\n";
	}


exit 0;


sub usage
{
my $code = shift;

print STDERR "Usage : $programme -f fichier [ -t type1[,type2]* ]\n";

exit $code;
}
