#!/usr/bin/perl
#
#  Use:
#        summary [ -u <user> ] [ -d <range-of-days> ] <tcharge-log-file>
#
#    Extract charge information of all connections logged
#     in <tcharge-log-file> (option `-file').
#    Option -u <name>: Only connections made by user <name>
#     will be summarized.
#    Option -d <range-of-days>: Calculate the bill for only this period
#     (instead of summing monthly).
#    Format of <range-of-days>: MM/DD/YYYY-MM/DD/YYYY or MM/DD-MM/DD
#
# File = Tools/summary,
# a part of tcharge, version 1.3, 11MAY98
# Copyright (C) 1997,98 Volker B"orchers (boercher@physik.uni-bremen.de)
# See file `tcharge.c' for legal affairs.

# get today's year (cope with the year 2000 problem):
$Y = (localtime())[5];
$Y += ($Y > 80) ? 1900 : 2000 if($Y < 100);

## use: get_day(month, day, year)
##  return a number so that: date1 > date2 => get_day(date1) > get_day(date2)
sub get_day {
    my ($month,$day,$year) = @_;
    $year = $Y if(! defined $year);
    die("get_day: Month \"", $month, "\" out of range 1..12\n")
	if $month > 12 || $month < 1;
    die("get_day: Day \"", $day, "\" out of range 1..31\n")
	if $day > 31 || $day < 1;
    die "get_day: year must include the century! (in date ($month,$day,$year))\n"
	if($year < 100);
    return $day + ($month-1 + $year*12)*31;
}

$USE=" Use:
      $0 [ -u <user> ] [ -d <range-of-days> ] <tcharge-log-file>
Extract charge information of all connections logged
 in <tcharge-log-file> (option `-file').
Option -u <name>: Only connections made by user <name>
 will be summarized.
Option -d <range-of-days>: Calculate the bill for only this period
 (instead of summing monthly).
Format of <range-of-days>: MM/DD/YYYY-MM/DD/YYYY or MM/DD-MM/DD\n";

require "getopts.pl";
&Getopts('u:d:h');
die "$0:", $USE if ($#ARGV < 0 || $opt_h);
print "##########################################\n";

if(defined $opt_u) {
    print "#  Charges of user $opt_u\n";
} else {
    print "#  Charges of all users\n";
}
if($opt_d) {
    ($start,$end) = split(/-/, $opt_d);
    @start = split(/\//, $start);
    @end = split(/\//, $end);
    push(@start, $Y) if(! defined $start[2]);
    push(@end, $Y) if(! defined $end[2]);
    print "#  for period (@start) -> (@end):\n";
    $start = get_day(@start);
    $end = get_day(@end);
}
print "##########################################\n";

$file=$ARGV[0];
open (LOG, $file) || die "Cannot open ", $file;

LOG:
while(<LOG>) {
    if(/charge/ && (!$opt_u || $lastline =~ /\b$opt_u\b/)) {
	($m,$d,$y,$charge) = m#^(\d+)/(\d+)/(\d+).*charge:\D*([\d\.]+).*#;
	if($opt_d) {
	    next LOG if(get_day($m,$d,$y) < $start);
	    if(get_day($m,$d,$y) > $end) {
		printf "-----------------\nSum %02d/%02d/%d - %02d/%02d/%d: %02.2f\n\n",
		@start, @end, $sum;
		exit(0);
	    }
	}
	print;
	if(!$opt_d && $m != $month) {
	    printf "-----------------\nSum %02d/%d: %02.2f\n\n",
	           $month, $y, $sum if($month != 0);
	    $month = $m;
	    $sum = 0;
	}
	$sum += $charge;
    }
    $lastline = $_;
}
if(!$opt_d) {
    printf "-----------------\nSum %02d/%d: %02.2f\n", $month, $y, $sum;
} else {
    printf "-----------------\nSum %02d/%02d/%d - %02d/%02d/%d: %02.2f\n\n",
           @start, @end, $sum;
}
