use strict;
#use warnings;use diagnostics;
use Linux::Inotify2;
use vars qw($VERSION %IRSSI);

use Irssi;

$VERSION = "0.1";
%IRSSI = (
	authors      => "Tobias Hommel",
	contact      => "software\@genoetigt.de",
	name         => "fino",
	description  => "notify if local maildir changed",
	url          => "http://www.genoetigt.de/site/projects/fino",
	license      => "GNU GPL v2",
	changed      => "Tue Feb 12 23:57:46 CET 2008"
);

my $fino_inotify = new Linux::Inotify2 or die "Unable to create new inotify object: $!";
$fino_inotify->blocking(0);
my @fino_inwatches = ();
my $fino_timer = 0;
my $fino_maildir ='';

my $mailcheck = sub {
	foreach ($fino_inotify->read()) {
		$_->fullname =~ m|$fino_maildir/(.*)/new/.*|;
		my $box = $1;

		$box = "INBOX" unless $box;
		Irssi::printformat(MSGLEVEL_HILIGHT, 'fino_newmail', "New mail in ", "$box");
	}
};

my $fino_init = sub {
	my $watch;
	my $boxdir;

	$fino_maildir = Irssi::settings_get_str('fino_maildir');
	$fino_maildir =~ s/(.*?)\/*$/$1/;
	my @entries = split(/;/, Irssi::settings_get_str('fino_mailboxes'));

	foreach $boxdir(@entries) {
		if ($boxdir eq "INBOX") {
			$boxdir = "";
		}
		$boxdir .= "/" if $boxdir ne "";
		$boxdir = "$fino_maildir/${boxdir}new";
		$watch = $fino_inotify->watch ($boxdir, IN_CREATE);
		unless ($watch) {
			Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fino_crap', "couldn't add watch for $boxdir");
			next;
		}
		push @fino_inwatches, $watch;
	}

	my $intervall = Irssi::settings_get_int('fino_intervall');
	Irssi::timeout_remove($fino_timer) if $fino_timer;
	return unless $intervall;
	return unless @fino_inwatches;
	$fino_timer = Irssi::timeout_add $intervall*1000, \&$mailcheck, undef;
};

my $fino_setup_changed = sub {
	if (@fino_inwatches!=0) {
		foreach (@fino_inwatches) {
			$_->cancel;
		}
		@fino_inwatches = ();
	}
	&$fino_init;
};

Irssi::theme_register([
	'fino_newmail','{hilight fino:} {ownnotice $0 $1}',
	'fino_crap','{line_start}{hilight fino:} {error $0}' ]);

Irssi::settings_add_int('fino', 'fino_intervall', 1);
Irssi::settings_add_str('fino', 'fino_maildir', '');
Irssi::settings_add_str('fino', 'fino_mailboxes', '');

&$fino_init;

Irssi::signal_add('setup changed', \&$fino_setup_changed);

