#!/usr/local/bin/perl -w

# sortem - Sortowanie poczty
# (C) 2000 Marcin Owsiany

#use Date::Parse;
use Time::Local;

my @tmpd;	# tymczasowo przechowuje maila
my %tmpi;	# mozliwe klucze

my %mails;	# ( $key => \@mail, ... )

my $MODE;
my $debug = 1;
my %month = (	'Jan' => '1',
		'Feb' => '2',
		'Mar' => '3',
		'Apr' => '4',
		'May' => '5',
		'Jun' => '6',
		'Jul' => '7',
		'Aug' => '8',
		'Sep' => '9',
		'Oct' => '10',
		'Nov' => '11',
		'Dec' => '12',
);

my $opcja = shift;

if ($opcja eq '-s') {
	$MODE = 'subject';
} elsif ($opcja eq '-n') {
	$MODE = 'from';
} elsif ($opcja eq '-d') {
	$MODE = 'date';
} else {
	print STDERR "Nieprawidłowa opcja\n";
	exit 1;
}

# niestety na studencie nie ma modulu Date::Parse,
# wiec musze parsowac date recznie
sub parse_date {
	($date) = @_;
	if ($date =~ /.*\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/) {
	#		    month   day    hour  minute sec     year
	#         $time = timelocal($sec,$min,$hours,$mday,$mon,$year);
		return timelocal($5, $4, $3, $2, $month{$1}, $6);
	} else {
		print STDERR "Nieczytelna data $date\n";
		return 9000;
	}
#	return str2time($_);
}

# zapisanie maila z @tmpd do %mails
sub finish_previous {
	# na przyklad jesli sortuje wedlug tematow,
	# a list nie zawiera pola Subject:
	$tmpi{$MODE} = '' unless defined($tmpi{$MODE});
	foreach $line (@tmpd) {
		push @{$mails{$tmpi{$MODE}}}, $line;
	}
}

while (<>) {
	if (/^From\s+\S+\s+(.*)$/) {
		finish_previous if @tmpd;
		@tmpd = ();
		%tmpi = ();
		$tmpi{'date'} = parse_date $1;
		push @tmpd, $_;
	} else {
		if (/^From\s*:\s*(.*)/) {
			# from/subject ustawiamy tylko, jesli jeszcze tego
			# nie zrobilismy (list moze zawierac kilka pol
			# From: lub Subject:)
			$tmpi{'from'} = $1 unless $tmpi{'from'};
		} elsif (/^Subject\s*:\s*(Re:|RE:|Odp:|FWD:|Fwd:|PD:|Pd:|\s+)*\s*(.*)/) {
			$tmpi{'subject'} = $2 unless $tmpi{'subject'};
		}
		# dodanie linii
		push @tmpd, $_ if @tmpd;
	}
}

finish_previous if @tmpd;

# wybor sortowania - wg porzadku leksykograficznego lub liczbowego
if ($MODE eq 'date') {
	@gotowa = sort { $a <=> $b } keys %mails;
} else {
	@gotowa = sort keys %mails;
}

# drukowanie posortowanych listow
foreach (@gotowa) {
	print @{$mails{$_}};
}
