package NetHirc::Counter;

use strict;
use warnings;

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

use NetHirc::Stats;
use NetHirc::Util;

my @events = qw(
_start
_stop
add
begin
end
show
show_all
clear
clear_all
);

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

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

sub begin
{
    debug('n', "begin");
    my ($heap, $filename, $success, $fail) = @_[HEAP, ARG0..ARG2];
    my $counter;
    eval { 
	$counter = YAML::LoadFile($filename) if (-r $filename);
    };
    if ($@)
    {
	$fail->($@);
	return;
    }
    $counter ||= NetHirc::Stats->new();
    $heap->{'filename'} = $filename;
    $heap->{'counter'} = $counter;
    $success->();
}

sub _stop
{
    my $heap = $_[HEAP];
    my $filename = $heap->{'filename'};
    my $counter = $heap->{'counter'};
    eval { YAML::DumpFile($filename, $counter) if $counter; };
    delete $heap->{'filename'};
    delete $heap->{'counter'};
}

sub end
{
    debug('n', "end");
    my ($heap, $success, $fail) = @_[HEAP, ARG0];
    my $filename = $heap->{'filename'};
    my $counter = $heap->{'counter'};
    eval { YAML::DumpFile($filename, $counter); };
    if ($@)
    {
	$fail->($@->{'msg'});
    }
    else
    {
	$success->($filename);
    }
    delete $heap->{'filename'};
    delete $heap->{'counter'};
}

sub add
{
    debug('n', "add");
    my ($heap, $server, $who, $what) = @_[HEAP, ARG0..ARG2];
    my $counter = $heap->{'counter'};
    return unless $counter;
    $counter->add($server, $who, $what);
}

sub clear
{
    my ($heap, $server) = @_[HEAP, ARG0];
    my $counter = $heap->{'counter'};
    $counter->clear_server($server);
}

sub clear_all
{
    my $heap = $_[HEAP];
    my $counter = $heap->{'counter'};
    $counter->clear_all();
}

sub show
{
    my ($heap, $server, $pb) = @_[HEAP, ARG0, ARG1];
    my $counter = $heap->{'counter'};
    my @report = $counter->report($server);
    $pb->(@report);
}

sub show_all
{
    my ($heap, $pb) = @_[HEAP, ARG0];
    my $counter = $heap->{'counter'};
    my @reports = $counter->report_all();
    $pb->(@reports);
}

1;
__END__


syntax highlighted by Code2HTML, v. 0.9.1