use utf8;
use warnings;
use strict;

use Cf qw($WDESCR);
use Regexp::Common qw(delimited net);

# s. RT#248075 zur Frage, warum wir nicht $RE{net}{domain}{-nospace}
# aus Regexp::Common verwenden. Wir nehmen hier in Kauf, dass der
# reguläre Ausdruck auch auf ungültige (weil nur aus Zahlen bestehende)
# Labels passt, vgl. RT#337128.
my $label         = qr/[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?/;
my $double_quoted = $RE{delimited}{ -delim => '"' };

our $acct_www_old;

sub acct_www {
	my ($file) = @_;

	ref(
		my $acct =
		  ref $acct_www_old
		  && abs( $acct_www_old->{timestamp} - $file->{timestamp} ) < 100
		? $acct_www_old
		: do_start(
			want       => 'kunde,ip,domain,ip_de,uucp,pers',
			dienst     => 'www',
			quelle     => $WDESCR,
			logdir     => 'www',
			do_reverse => 0
		)
	  )
	  or return 'Kein Accounting';

	while ( defined( my $line = get_line($acct) ) ) {
		if ( my ( $ip, $fqdn, $octets, $octets_in, $octets_out ) =
			$line =~
/^(?:($RE{net}{IPv4})|($label(?:\.$label)+)) \S+ .*? \[[^\]]+\] $double_quoted \d+ (\d+|-) $double_quoted $double_quoted \d+(?: (\d+) (\d+)\b|$)/o # Das erste "\d+" ist ein Workaround für den in RT#326158 beschriebenen Apache-Bug.
		  )
		{
			$acct->acct(
				undef, undef,
				scalar(
					defined $ip
					? $acct->who_ip($ip)
					: $acct->who_dom( $fqdn, 1 )
				),
				undef,
				1,

				# Fallback, falls keine mod_logio-Werte zur Verfügung stehen:
				defined $octets_in
				  && defined $octets_out ? $octets_in + $octets_out
				: $octets eq '-' ? 0
				: $octets
			);
		}
		else {
			print STDERR <<_
Nicht analysierbarer Eintrag im WWW-Accounting $file->{filename}: $line
_
		}
	}

	do_end($acct);
}

1;
