#!/usr/bin/perl
#To do: accept negative hour offset, like this: toucher.pl -2
#Then subtract 2 hours from current time.
#Touch file, process file, [sleep], next.
use warnings;
use strict;

#To do: use opts for command line args:
my $stamp=shift;
chomp($stamp) if($stamp);
unless (($stamp) && ($stamp =~ /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/)) {
    die "Required args missing:\ntoucher.pl YYYY-MM-DD HH:MM [NN (increment)]\n";
}

my $increment=shift;
$increment=8 unless $increment;
printf STDERR "increment: $increment\n";
if (($increment) && ($increment !~ /\d+/)) {
    die "NN is increment in seconds:\
toucher.pl YYYY-MM-DD HH:MM NN\n";
}

my $year=my $mon=my $day=my $min=my $hour=0;

my $outfile='.toucher';
open OF, '>', $outfile or die $!;

my $infile='.number';
if(! -f $infile) {
    die "$infile not found!"
}
else {
    open LS, '<', $infile or die $!;

    while (<LS>) {
        chomp(my $fn=$_);
        die unless -f $fn;
        next if $fn=~/^#/; #no comment
        #touch: invalid date format `-rw-r--r-- 1 e3 e3 5674332 2011-02-25 11:20'
        $fn=~s#^.*/##; #basename
        ($year=$stamp)=~s/^(\d{4})-.*/$1/e;
        ($mon =$stamp)=~s/^.*-(\d{2})-.*/$1/e;
        ($day= $stamp)=~s/^.*-(\d{2}) .*$/$1/e;
        ($min=$stamp)=~s/^.*:// unless($min>0);
        ($hour=$stamp)=~s/^.* (\d{2}):.*/$1/ unless($hour>0);
        (my $date=$stamp)=~s/ .*//;
        die "$fn: $!" unless -f $fn;
        my $cmd=sprintf "touch -d %s\\ %02d:%02d\ %s\n", $date, $hour, $min, $fn;
        print OF $cmd;

        my $doit=1;
        if($doit) {
            my @result=`$cmd`;
            foreach my $res (@result) {
                printf STDERR "$res\n";
            }
        }

        #warn "before: $min";
        $min+=$increment;
        #if($min>55) && ($hour>1)) { #why test hour?
        warn "hour $hour < 1\n" if($hour<1);

        if($min>=60) {
            $hour++;
            if($hour==24) {
                $hour=0;
                $day++;
            }
            $min=$min%60;
            #$min="00";

            if(($day > 30) &&
               (($mon == 4 ) ||
                ($mon == 6 ) ||
                ($mon == 9 ) ||
                ($mon == 11))) {
                $day=1;
                $mon++;
                #$mon="0$mon" if $mon<10;
            }

            elsif($day > 31) {            #Most months
                $day=1;
                $mon++;
                #$mon="0$mon" if $mon<10;
            }

            elsif(($day>28) && ($mon==2)) { $mon++; $day=01; } #Mar 1

            if($mon>12) { $day=01; $mon=01; $year++; } #NYD

            $stamp=sprintf "%004d-%02d-%02d %02d:%02d", $year, $mon, $day, $hour, $min;
            #warn "new stamp: $stamp";
        }
    }
}

close LS;
close OF;

open OF, '<', $outfile or die $!;
print while(<OF>);
close OF;
