package NetHirc::Log;

use strict;
use warnings;

use constant DEFAULT_TIMEFORMAT => "%Y-%m-%d %H:%M:%S";

use IO::File;
use POE qw(Kernel Session Wheel::ReadWrite);
use POSIX ();

use NetHirc::Util;

my @events = qw(
_start
_stop
log
begin
end
error
);

sub new
{
    shift;
    POE::Session->create(
	'package_states' => [ 'NetHirc::Log' => [ @events ] ],
	'args'  => [ @_ ],
    );
}

sub _start
{
    my $kernel = $_[KERNEL];
    $kernel->alias_set('nethirc_log');
}

sub begin
{
    debug('l', "begin");
    my ($heap, $filename, $success, $fail) = @_[HEAP, ARG0..ARG2];
    my $fh = new IO::File($filename, "w");
    unless ($fh)
    {
	$fail->($!);
	return;
    }
    my $wheel = new POE::Wheel::ReadWrite(
        Handle => $fh,
	Filter => POE::Filter::Line->new(),
	FlushedEvent => 'flush',
	ErrorEvent => 'error',
    );
    unless ($wheel)
    {
	$fail->($!);
	return;
    }
    $heap->{'wheel'} = $wheel;
    $success->();
}

sub _stop
{
    my $heap = $_[HEAP];
    delete $heap->{'wheel'};
}

sub end
{
    debug('l', "end");
    my ($heap, $pb) = @_[HEAP, ARG0];
    delete $heap->{'wheel'};
    $pb->();
}

sub log
{
    debug('l', "log");
    my ($heap, $text, $complaint) = @_[HEAP, ARG0, ARG1];
    my $wheel = $heap->{'wheel'};
    my $now = POSIX::strftime(DEFAULT_TIMEFORMAT, localtime(time()));
    $text = sprintf("%s %s", $now, $text);
    $wheel->put($text) if $wheel;
}

sub error
{
    debug('l', "error");
    my ($kernel, $heap, $errstr) = @_[KERNEL, HEAP, ARG2];
    $kernel->post('nethirc_adventurer', 'log_write_error', $errstr);
    delete $heap->{'wheel'};
}

1;
__END__


syntax highlighted by Code2HTML, v. 0.9.1