<%INIT>
use Mail::IMAPClient;
use Date::Parse;

my ($imap, $messagecount, $messagelist, $message) = (undef, undef, undef, undef);

sub imap_connect {
	my ($user, $pass) = @_;
	my $imap;
	my @serverlist = ();

	push @serverlist, $session{'emailserver'} if (defined $session{'emailserver'});
	push @serverlist, @$RT::EmailImportServers if (defined $RT::EmailImportServers);
	push @serverlist, 'localhost';

	foreach my $server (@serverlist) {
		$imap = Mail::IMAPClient->new (
		  Server   => $server,
		  User     => $user,
		  Password => $pass,
		  Ssl      => 0,
		  Uid      => 1,
		  Peek     => 1,
		) || next;
		if ($imap->select ('INBOX')) {
			$session{'emailserver'} = $server;
			return $imap;
		}
		$imap->logout;
	}

	$imap->logout if (defined $imap);
	return undef;
}

sub imap_folderlist {
	my ($imap) = @_;
	my %messagecount = ();
	map { $messagecount{$_} = $imap->select ($_) ? scalar @{$imap->search ('UNDELETED')} : 0 } @{$imap->folders};
	return { %messagecount };
}

sub imap_messagelist {
	my ($imap, $folder) = @_;
	my $messagelist;

	$imap->select ($folder) || return undef;

	$messagelist = $imap->fetch_hash ($imap->Range ($imap->search ('UNDELETED')), 'RFC822.SIZE','INTERNALDATE','FLAGS') || return undef;
	foreach (keys %$messagelist) { $messagelist->{$_}->{'TIME'} = str2time ($messagelist->{$_}->{'INTERNALDATE'}); }
	foreach (keys %$messagelist) { delete $messagelist->{$_} if ($messagelist->{$_}->{'FLAGS'} =~ /\\Deleted/); }
	foreach (keys %$messagelist) { $messagelist->{$_}->{'SUBJECT'} = $imap->subject ($_); }
	foreach (keys %$messagelist) { $messagelist->{$_}->{'FROM'} = $imap->get_header ($_, 'From'); }

	return $messagelist;
}


$session{'emailuser'} = $Username if ((defined $Username) && ($Username ne ''));
$session{'emailpass'} = $Password if ((defined $Password) && ($Password ne ''));

if (defined $session{'emailuser'} && defined $session{'emailpass'}) {
	$imap = imap_connect ($session{'emailuser'}, $session{'emailpass'});
}

$$ImapOKRef = (defined $imap) ? 1 : 0;

if ((defined $imap) && (not defined $Folder)) {
	$messagecount = imap_folderlist ($imap);
	$$FolderListRef = $messagecount;
} elsif ((defined $imap) && (defined $Folder) && (not defined $MessageId)) {
	$messagelist = imap_messagelist ($imap, $Folder);
	$$MessageListRef = $messagelist;
} elsif ((defined $imap) && (defined $Folder) && (defined $MessageId)) {
	$imap->select ($Folder);
	$$MessageStringRef = $imap->message_string ($MessageId);
}

$imap->logout if (defined $imap);
</%INIT>
<%ARGS>
$Folder => undef
$MessageId => undef
$Username => undef
$Password => undef
$ImapOKRef => undef
$FolderListRef => undef
$MessageListRef => undef
$MessageStringRef => undef
</%ARGS>
