#!/usr/bin/perl

use DBI;

while($in = shift) {
	push(@args,$in);
}

parse_args(@args);

if($db) {
$dbh = DBI->connect("dbi:mysql:db=$db_arg","$dbuser_arg","$dbpass_arg") || die "Failed to connect to database";
}


$SIGNAL['int'] = sigint;


if(!$folder_arg) {
	usage();
	exit;
}

if(-d "Maildir/$folder_arg") {
	$folder_arg = "Maildir/" . $folder_arg;
}

if(-d "Maildir/$target_arg") {
	$target_arg = "Maildir/" . $target_arg;
}

if(-d "Maildir/\.$folder_arg") {
	$folder_arg = "Maildir/." . $folder_arg;
}

if(-d "Maildir/\.$target_arg") {
	$target_arg = "Maildir/." . $target_arg;
}

# strip trailing slash

@expanded = split(//,$folder_arg);
$index = @expanded;
$tail = pop(@expanded);
push (@expanded, $tail) if($tail ne "/");

$folder_arg = "";
foreach $letter (@expanded) {
	$folder_arg.= $letter;
}

@expanded = split(//,$target_arg);
$index = @expanded;
$tail = pop(@expanded);
push(@expanded,$tail) if ($tail ne "/");

$target_arg = "";
foreach $letter (@expanded) {
	$target_arg.= $letter;
}


if(-d "$folder_arg/cur") {
	$folder_arg .= "/cur";
}
if(-d "$target_arg/cur") {
	$target_arg .= "/cur";
}

die "I wasn't able to find your maildir" if(! -d $folder_arg);

if($make_target && (! -d $target_arg)) {
	$res = system("maildirmake $target_arg");
	die "--maildirmake specified but unable to make $target_arg" if($res);
}

die "I wasn't able to find the target dir ($target_arg) " if (! -d $target_arg);

$root_folder = `pwd`;
chop($root_folder);

open(LS,"ls $folder_arg|");

while($in = <LS>) {
	chop $in;
	
	$spam_folder = $root_folder . "/" . $folder_arg;

	print "Trying: $spam_folder/$in ... ";

	if($db) {
	($already_did) = $dbh->selectrow_array("SELECT spam_id FROM spam WHERE spam_folder = '$spam_folder' AND spam_file = '$in'");
	} else {
	$already_did = 0;
	}

	if($already_did) {
		print "Already done ($already_did)\n";
		next;
	}

	if(! -f "$folder_arg/$in") {
		print "Deleted from inbox\n";
		next;
	}

	$start_time = time();

	$ret = system("cat $folder_arg/$in | spamc -s 150000 -E > /tmp/spam.$$ 2>/tmp/spam-err.$$");

	open(CONTENTS,"</tmp/spam.$$");
	$contents = "";
	while($inf = <CONTENTS>) {
		$contents .= $inf;
	}

	if($db) {
		$contentsq = $dbh->quote($contents);
	}

	$processing_time = time() - $start_time;

	if($ret == 33280) {
		cleanup();
	}

	if(($ret != 0) && -f "$folder_arg/$in" ) {
		$new_path = "$target_arg/$in";
		$move_ret = system("mv $folder_arg/$in $target_arg");
		die "Couldn't move spam!" if($move_ret);
		print "Spam! ($ret)\n";
		$spam = 1;
	} else {
		print "Not spam.\n";
		$spam = 0;
		$contentsq = "null";
	}

	if($db) {

	$dbh->do("INSERT INTO spam (spam_folder,spam_file,new_path,is_spam,return_code,ts,spam_contents,processing_time,root_folder) VALUES ('$spam_folder','$in','$new_path',$spam,$ret,now(),$contentsq, $processing_time, '$root_folder')") || die("sql error");
	}
}	

sub sigint {
	cleanup();
}

sub cleanup {
	system("rm /tmp/spam.$$");
	system("rm /tmp/spam-err.$$");
	exit(0);
}

sub usage {
	print "cleanup-spam [opts] (source maildir) (target maildir)\n";
	print "Options:\n";
	print "--make-target - make target dir if doesn't exist\n";
	print "--db=(database) - specify mysql database for spam logging\n";
	print "--dbuser=(user) - specify mysql user for spam logging\n";
	print "--dbpass=(password) - specify mysql password for spam logging\n";
	exit(0);
}

sub parse_args {
	$state = 0;
	$make_target = 0;
	$debug = 0;
	$db = 0;
	$target_arg = "Maildir/.Spam-Offline/cur";

	while($arg = shift) {
		if(($rarg) = $arg =~ /--(.*)/) {
			($r1, $r2) = split(/=/,$rarg);
			if($r1 eq "source") {
				$folder_arg = $r2;
			} elsif ($r1 eq "target") {
				$target_arg = $r2;
			} elsif ($r1 eq "make-target") {
				$make_target = 1;
			} elsif ($r1 eq "debug") {
				$debug = $r2 || 0xFFFF;
			} elsif ($r1 eq "db") {
				$db_arg = $r2;
			} elsif ($r1 eq "dbuser") {
				$dbuser_arg = $r2;
			} elsif ($r1 eq "dbpass") {
				$dbpass_arg = $r2;
			}
		} else { # if not a -- arg
			if($state == 0) {
				$folder_arg = $arg;
			} elsif($state == 1) {
				$target_arg = $arg;
			} else {
				print "Error: I don't know what to do with $arg\n";
				usage();
			}
		} # end of if arg
		print "arg: $arg\n" if($debug & 64);
	} # end of arg loop
	
	$db = 1 if($dbuser_arg && $dbpass_arg && $db_arg);
	
	if($debug & 128) {
		print "make-target: $make_target\n";
		print "db: $db\n";
		print "db_user: $dbuser_arg\n";
		print "db_pass: $dbpass_arg\n";
		print "db: $db_arg\n";
	}
}
