#!/usr/bin/perl

# Spam mass destruction.

use lib './debbugs/';
use Debbugs::Log;
use Mail::SpamAssassin;
use Mail::SpamAssassin::NoMailAudit;


my $sdir = $ARGV[0];
my $ddir = $ARGV[1];
my $d;

my $a = Mail::SpamAssassin->new();

print "Source directory: $sdir\n";
print "Target directory: $ddir\n";

for my $f (glob ($sdir . '/*.log')) {
    $f =~ m#.*/([^/]*)$#;
    $d = $ddir . '/' . $1;
    
    eval {
	&handle_file ($f, $d, $a);
    };
    
    if ($@) {
	print STDERR "handle_file died: $@\n";
    }
}

sub handle_file {
    my $src = shift;
    my $dst = shift;
    my $assassin = shift;

    my $c_disc = 0;
    my $c_good = 0;
    
    open my $ffh, "$src" || die "Can't open $src.";

    print "==> $src\n";
    
    my @entries = read_log_records ($ffh);
    close $ffh;
    my @good = ();
    
    my $count;
    my $discard;
    
    for my $h (@entries) {
	$discard = 0;
	print "Record: $h->{type}  -> ";
	if ($count++ < 4) {
	    print "skipping.\n";
	    $discard = 1;
	} elsif ($h->{type} =~ /incoming-recv|recips/) {

	    my @lines = split (/\n/, $h->{text});
	    my $m = new Mail::SpamAssassin::NoMailAudit (data => \@lines);
	    my $status = $assassin->check ($m);
	    if ($status->is_spam()) {
		$c_disc++;
		$discard = 1;
		print "spam [", $status->get_hits(), "], discarding\n";
	    } else {
		$c_good++;
		print "no spam [", $status->get_hits(), "], preserving\n";
	    }
	    
	    print $status->get_report();
	    
	    $status->finish();
	    $m->finish();
	} else {
	    print "Passing through.\n";
	}

	push @good, $h unless $discard;
    }
    
    open my $ofh, ">$dst" || die "Can't open $dst.";
    write_log_records ($ofh, @good);
    close $ofh || die "Error closing $dst.";
    
    print "==> $src: Done. $c_good good, $c_disc spam.\n";
}

