#!/usr/local/bin/perl
$| = 1;
use Win32::OLE qw(in);

#
# Folder parameters
#
$base = "Mailbox - Neulinger, Nathan R.";
$folder = &GetFolder("$base/Inbox");

#
# Filter Rules - currently filters on from/to/cc
#
$rules = [
['Uetrecht, Dan', "$base/people/uetrecht-dan"],
['uetrecht@umr.edu', "$base/people/uetrecht-dan"],
['Altheide, Richard', "$base/people/altheide-richard"],
['rwa@umr.edu', "$base/people/altheide-richard"],
['Brady, Meg', "$base/people/brady-meg"],
['megbrady@umr.edu', "$base/people/brady-meg"],
['Fannin, David', "$base/people/fannin-david"],
['dpf@umr.edu', "$base/people/fannin-david"],
['Edgington, Jeff', "$base/people/edgington-jeff"],
['jedg@umr.edu', "$base/people/edgington-jeff"],
['O\'Brennan, Gerry', "$base/people/obrennan-gerry"],
['Dearth, David', "$base/people/dearth-david"],
['Folsom, Melissa', "$base/people/folsom-melissa"],
['Strandberg, Richard', "$base/people/strandberg-richard"],
['Luther, John', "$base/people/luther-john"],
['Lutzen, Karl', "$base/people/lutzen-karl"],
['Tharp, James', "$base/people/tharp-james"],
['Cook, Ward', "$base/people/cook-ward"],
['Swift, Brian', "$base/people/swift-brian"],
['Oldfield, Megan', "$base/people/oldfield-megan"],
['Ryan Lantzer', "$base/people/lantzer-ryan"],
['lantzer@umr.edu', "$base/people/lantzer-ryan"],
['Helpdesk Umr', "$base/umr/helpdesk"],
['helpdesk@umr.edu', "$base/umr/helpdesk"],
['announce@umr.edu', "$base/lists/announce"],
['network@umr.edu', "$base/umr/network-requests"],
];

#
# For each item in the folder, call "FilterItem", passing it the item 
# object. Cache only the To and Sent... columns for speed.
#
foreach $foldername ( "$base/Inbox", "$base/Sent Items" )
{
	print "Folder ($foldername):\n";
	$folder = &GetFolder($foldername);

	($total, $filtered) = &ProcessItems($folder, ["To", "CC", "SentOnBehalfOfName"], \&FilterItem, $rules);
	print "\n";
	print "Total Items: $total\n";
	print "Filtered: $filtered\n";
	print "\n";
}

#
# Subroutines for doing stuff with the folders and items
#
sub GetFolder
{
	my ($folder) = @_;
	
	if ( ! $FOLDER_CACHE{$folder} )
	{
		$FOLDER_CACHE{$folder} = &GetFolderPath(split('/', $folder));
	}

	return $FOLDER_CACHE{$folder};
}

sub GetFolderPath
{
	my ($top, @folderpath) = @_;
	my ($folder, $outlook);

	$outlook = Win32::OLE->GetActiveObject("Outlook.Application");

	$folder = $outlook->GetNameSpace("MAPI")->Folders->Item($top);
	if ( ! $folder ) { return undef; }

	foreach $entry ( @folderpath )
	{
		$folder = $folder->Folders($entry);
		last if ( ! defined($folder) );
	}

	return $folder;
}

sub ProcessItems
{
	my ($folder, $columns, $routine, @routineopts) = @_;
	my ($items, $itemcnt, $itemid);

	$items = $folder->Items;

	# Cache/Retrieve only certain columns for speed
	if ( $columns )
	{
		# EntryID is needed to move the item
		$items->SetColumns(join(",", @$columns, "EntryID", "UnRead"));
	}

	# Get count of items
	$itemcnt = $items->Count;

	# Loop through all items
	$item = $items->GetLast;
	$proctrue = 0;
	while ( $item )
	{
		if ( &$routine($item,@routineopts) )
		{
			$proctrue++;
		}
		$item = $items->GetPrevious;
	}

	# Return the count of items total, processed-true
	return ($itemcnt, $proctrue);
}


sub FilterItem
{
	my ($item,$rules) = @_;
	my ($to,$from,$cc,$bcc,$filtered,$ruleentry,$rule,$foldername,$pat);
	my (%headers, $destfolder);

	$to = $item->{"To"};
	$from = $item->{"SentOnBehalfOfName"};
	$cc = $item->{"CC"};
	$subject = $item->{"Subject"};

	if ( $item->{"UnRead"} )
	{
		print "U";
		return 0;
	}

	%headers = (
		to => $to,
		from => $from,
		cc => $cc,
		subject => $subject,
	);

	$filtered = 0;
	foreach $ruleentry ( @$rules )
	{
		($pat, $foldername) = @$ruleentry;

		if ( index($from,$pat) >= 0 ||
			index($to,$pat) >= 0 )
		{
			print "\nBy Rule ($pat) Moving $to/$from/$cc/$subject to $foldername.\n";
			$destfolder = &GetFolder($foldername);
			if ( $destfolder )
			{
				$item->Move($destfolder);
				$filtered = 1;
			}
		}
		else
		{
			$filtered = 0;
		}
		last if ( $filtered );
	}
	if ( $filtered )
	{
		print "F";
	}
	else
	{
		print ".";
	}

	return $filtered;
}


