#!/local/bin/perl
# PERL hours list writer for TIMEX
@weekdays = ("Man", "Tir", "Ons", "Tor", "Fre" ,"L|r", "S|n");
push(@INC, "/isolde/hta/sw/timex"); # Fudge!
do 'weekno.perl' || die "Could not do weekno.perl\n";

$fudge = 0.5;  # Dividing point for ROUND. Fudgeable.

while ($ARGV[0] =~ /^-[^\d]/) {
   $option = shift(@ARGV);
   if ($option eq "-adjust") {
      $adjust = 1;
   } elsif ($option eq "-round") {
      $round = 1;
   } elsif ($option eq "-fudge") {
      $fudge = shift(@ARGV);
   } elsif ($option eq "-year") {
      $year = shift(@ARGV);
   } else {
      die "Usage: $0 [-year nn ] [-adjust] [-round] [week]\nDefault week=last week\n";
   }
}

$week = shift(ARGV);
$timenow = time;
$oneday = 24 * 60 * 60;
@daynow = localtime($timenow);
if (!$week) {
   # Default is last week.
   $week = &DATE'weekno($timenow) - 1;
}
if (!$year) {
  $year = $daynow[5];
}
   
$timefetch = &DATE'firstinweek($week, $year);
print "Timeliste for uke $week 19$year\n";

for $wday (1..7) {
   @dayfetch = localtime($timefetch);
   $weekdate[$wday] = sprintf("%d/%d", $dayfetch[3], $dayfetch[4] + 1);
   $filename = sprintf("$ENV{'HOME'}/.timex/%04d-%02d-%02d",
       1900 + $dayfetch[5], 1 + $dayfetch[4], $dayfetch[3]);
   open(FILE, $filename) || do { 
       print STDERR "No file $filename\n";
       $timefetch = $timefetch + $oneday;
       next;
   };
   while (<FILE>) {
       chop;
       if (/^\s*(\d*):(\d*) (.*)/) {
	   $project = $3;
           $spent = $1 + $2 / 60;
           $worked{$project} = 1;  # Mark as worked-on this week
           $hours{"$project $wday"} = $spent;
       }
   }
   close FILE;
   $timefetch = $timefetch + $oneday;
}

&resum;
if ($hours == 0) {
   print STDERR "No hours worked this week!\n";
   exit 1;
}

if ($adjust) {
   &adjust();
}

if ($round) {
   &round;
}

# Print the result

printf "%-30.30s%5s!%5s%5s%5s%5s%5s%5s%5s\n",
	"Project", "TOT", @weekdays;
printf "%-30.30s%5s!%5s%5s%5s%5s%5s%5s%5s\n",
        "Date", "", @weekdate[1..7];
print "======================================================================\n";
for $pro (sort(keys(%hourstot))) {
   printf "%-30.30s%5.1f!", $pro, $hourstot{$pro};
   for $day (1..7) {
       if ($hours{"$pro $day"}) {
          printf "%5.1f", $hours{"$pro $day"};
       } else {
          printf "%5s", "";
       }
   }
   print "\n";
}
print "======================================================================\n";
printf "%-30.30s%5.1f!%5.1f%5.1f%5.1f%5.1f%5.1f%5.1f%5.1f\n",
	"TOTAL", $hours, @hours[1..7];

sub adjust {
   # Adjust - spread + projects across the board

   for $pro (keys(%hours)) {
     if ($pro =~ /^\+/) {
        $tospread += $hours{$pro};
     }
   }
   $factor = ($tospread/($hours - $tospread)) + 1; 
   printf STDERR "Distributing %5.1f hours across %5.1f hours, factor %5.2f\n",
	$tospread, $hours, $factor;
   # 1) Distribute across projects
   for $pro (keys(%hours)) {
      if ($pro =~ /^\+/) {
         $hours{$pro} = 0;
      } else {
         $hours{$pro} *= $factor;
      }
   }
   &resum("adjust");
}

sub round {
# Round all numbers to half-hours
   for $pro (keys(%hours)) {
      $hours{$pro} =  int(($hours{$pro} * 2) + $fudge) / 2; 
   }
   &resum("round");
}

sub resum {
   local($why) = @_;
   local($oldhours) = $hours;
   undef %hourstot;
   undef @hours;
   $hours = 0;
   for $pro (keys(%hours)) {
      if ($pro =~ /(^.*) (\d)$/) {
         $project = $1; $wday = $2;
         $hourstot{$project} += $hours{$pro};
         $hours[$wday] += $hours{$pro};
         $hours += $hours{$pro};
      } else {
         print STDERR "Bad projectday: $pro\n";
      }
   }
   if ($oldhours && (($hours - $oldhours) ** 2 > 0.1)) {
      print STDERR "$why: Changed total from $oldhours to $hours\n";
   }
}






