package NetHirc::Stats;

use strict;
use warnings;

use constant NHS_SERVER => 4;
use constant NHS_NICK => 3;
use constant NHS_BYTES => 2;
use constant NHS_WORDS => 1;
use constant NHS_LINES => 0;

sub new
{
    my $proto = shift;
    my $class = ref $proto || $proto;
    return bless {}, $class;
}

sub add
{
    my $self = shift;
    my $server = shift;
    my $who = shift;
    my $what = shift;
    my $bytes = length($what);
    my @words = split(' ', $what);
    $self->{$server}->{$who}->[NHS_BYTES] += $bytes;
    $self->{$server}->{$who}->[NHS_WORDS] += @words;
    $self->{$server}->{$who}->[NHS_LINES] += 1;
}

sub clear_server
{
    my $self = shift;
    my $server = shift;
    delete $self->{$server};
}

sub clear_all
{
    my $self = shift;
    for my $s (keys %$self)
    {
	$self->clear_server($s);
    }
}

sub report
{
    my $self = shift;
    my $server = shift;
    my $stats = $self->{$server};
    my @report = map { 
	[ 
	    $stats->{$_}->[NHS_LINES], 
	    $stats->{$_}->[NHS_WORDS], 
	    $stats->{$_}->[NHS_BYTES], 
	    $_,
	    $server,
	] 
    } keys %$stats;
    @report = sort my_way @report;
    return @report;
}

sub report_all
{
    my $self = shift;
    my @reports = map { [ $self->report($_) ] } keys %$self;
    return @reports;
}

sub my_way
{
    $a->[NHS_LINES] <=> $b->[NHS_LINES] ||
    $a->[NHS_WORDS] <=> $b->[NHS_WORDS] ||
    $a->[NHS_BYTES] <=> $b->[NHS_BYTES] ||
    $a->[NHS_NICK] cmp $b->[NHS_NICK] || 
    $a->[NHS_SERVER] cmp $b->[NHS_SERVER]
}

1;
__END__


syntax highlighted by Code2HTML, v. 0.9.1