use utf8;
use warnings;
use strict;
use Acct qw(do_end do_start);
use Cf qw($WDESCR);
use Date::Parse qw(str2time);
use Dbase::Globals qw(find_descr list_descr get_person);
use Dbase::Help qw(Do qquote);

=pod

Accounting für iPass, vgl. RT#156893, RT#219900

Die Zuordnung zu Kunden erfolgt über den Usernamen.

Als Pakete wird die Anzahl der Sekunden, als Bytes das Hundertfache
des "Net Billing Amounts" gewertet.

Jede Verbindung wird zusätzlich einzeln in die Datenbanktabelle C<ipassacct>
eingetragen, damit die Kunden (über ein Web-Interface) EVNe bekommen können.
(Es gab die Überlegung, direkt in C<acct> Einzeldatensätze zu schreiben,
was aber z. B. schon daran scheitert, dass wir die Daten erst im jeweiligen
Folgemonat accounten können.)

=cut

my %ipass_service_type;
list_descr(
	'ipass_service_type',
	undef, undef,
	sub {
		( undef, my $id, my $name ) = @_;
		$ipass_service_type{$name} = $id;
	}
);

my $re_ipass_service_types = qr/${\ join '|', map quotemeta, keys %ipass_service_type }/;

sub acct_ipass {
	my $acct = do_start(
	  want   => 'person',
	  dienst => 'ipass',
	  quelle => $WDESCR,
	  logdir => 'ipass')
	  or return 'Kein Accounting';
	my $day;
	while ( defined( my $line = get_line $acct ) ) {
		chomp $line;
		unless (
			my (
				$transaction_id, $billing_code,
				$user_id,        $authentication_domain,
				$description,    $gmt_time,
				$local_time,     $seconds,
				$eur_per_hour,   $net_billing_amount,
				$access_type,    $service_type
			)
			= $line =~
/^"(\w+:\d+)","(\d+)","([^"]+)","([^"]+)","([^"]+)","(\d\d-\w\w\w-\d+ \d\d:\d\d:\d\d)","(\d\d-\w\w\w-\d+ \d\d:\d\d:\d\d)","(\d+)","(\d+(?:\.\d{1,2})?)","(\d+(?:\.\d{1,2})?)","(DIAL|WIFI|ENET)","($re_ipass_service_types)"$/
		  )
		{
			warn qq(Unbekanntes Datenformat: $line);
		}
		elsif ( not defined( my $kunde = $acct->{hash_uucp}{$user_id} ) ) {
			warn qq(User "$user_id" konnte keinem Kunden zugeordnet werden.\n);
		}
		else {
			my $datum = str2time($gmt_time)
			  or die qq(Verstehe die Datumsangabe "$gmt_time" nicht: $line);
			Do <<_;
	INSERT INTO ipassacct SET
		kunde                 = $kunde,
		person                = ${\ get_person($user_id, undef, 2) },
		transaction_id        = ${\ qquote($transaction_id) },
		billing_code          = $billing_code,
		authentication_domain = ${\ qquote($authentication_domain) },
		description           = ${\ qquote($description) },
		datum                 = $datum,
		session_length        = $seconds,
		billing_rate          = $eur_per_hour * 100,
		net_billing_amount    = $net_billing_amount * 100,
		access_type           = ${\ find_descr( ipass_access_type  => $access_type , 1 ) },
		service_type          = $ipass_service_type{$service_type}
_

			$acct->acct( $kunde, undef, $description =~ /^DE\w/ ? 'd' : 'w',
				undef, $seconds, $net_billing_amount * 100, $line );
		}
	}
	do_end $acct;
}

1;
