#!/usr/bin/perl -w
# -*- perl -*-

#
# $Id: check_dates,v 1.10 2004/12/29 21:47:29 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2003,2004 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: slaven@rezic.de
# WWW:  http://bbbike.de
#

use FindBin;
use lib ("$FindBin::RealBin/..",
	 "$FindBin::RealBin/../lib",
	);
use Text::Wrap;
use Strassen::Core;
use Object::Iterate qw(iterate);
use Getopt::Long;
use BBBikeEditUtil;
use strict;

my $do_filter;
my @l = localtime;
my $today = sprintf "%04d-%02d-%02d", $l[5]+1900, $l[4]+1, $l[3];
my $nextrunfile;
my $oldparser;
my $reldays;

if (!GetOptions("filter!" => \$do_filter,
		"today=s" => \$today,
		"nextrunfile=s" => \$nextrunfile,
		"oldparser" => \$oldparser,
		"reldays=i" => \$reldays,
	       )) {
    die <<EOF;
usage: $0 [-filter] [-today YYYY-MM-SS] [-nextrunfile file] [-reldays days] files

-nextrunfile is not implented. The date of this file was supposed to be used as the date when
this script should be run the next time (because it's expensive, and it's needed seldomly). The
problem is now solved by using a special rule in data/Makefile
EOF
}

if ($reldays) {
    require Date::Calc;
    my($y,$m,$d) = split /-/, $today;
    ($y,$m,$d) = Date::Calc::Add_Delta_Days($y,$m,$d, $reldays);
    $today = sprintf "%04d-%02d-%02d", $y, $m, $d;
}

my $isodaterx = qr/\b\d{4}-\d{2}-\d{2}\b/;
my $eudaterx  = qr/\b([0123]?\d)\.([01]?\d)\.(\d{4})\b/;

if (!@ARGV) {
    push @ARGV, "-";
}
for my $file (@ARGV) {
    my $s = Strassen->new($file, PreserveLineInfo => 1);
    iterate {
	my($start_date, $end_date);
	if (!$oldparser) {
	    my($start_epoch, $end_epoch, undef, $rx_matched) =
		BBBikeEditUtil::parse_dates($_->[Strassen::NAME]);
	    if (defined $start_epoch) {
		my @l = localtime $start_epoch;
		$start_date = sprintf "%04d-%02d-%02d", $l[5]+1900, $l[4]+1, $l[3];
	    }
	    if (defined $end_epoch) {
		my @l = localtime $end_epoch;
		$end_date = sprintf "%04d-%02d-%02d", $l[5]+1900, $l[4]+1, $l[3];
	    }
	} else {
	    if ($_->[Strassen::NAME] =~
		/($isodaterx) # start date
		 .*
		  ($isodaterx) # end date
		  /x) {
		($start_date, $end_date) = ($1, $2);
	    } elsif ($_->[Strassen::NAME] =~
		     /$eudaterx # start date
		      .*
		       $eudaterx # end date
		       /x) {
		$start_date = sprintf "%04d-%02d-%02d", $3, $2, $1;
		$end_date = sprintf "%04d-%02d-%02d", $6, $5, $4;
	    } elsif ($_->[Strassen::NAME] =~
		     /\b(?: seit|ab|vom )\s+(?: dem\s+ )? ($isodaterx)/xi) {
		$start_date = $1;
	    } elsif ($_->[Strassen::NAME] =~
		     /\b(?: seit|ab|vom )\s+(?: dem\s+ )? $eudaterx/xi) {
		$start_date = sprintf "%04d-%02d-%02d", $3, $2, $1;
	    } elsif ($_->[Strassen::NAME] =~
		     /($isodaterx)      # end date
		      /x) {
		($end_date) = ($1);
	    } elsif ($_->[Strassen::NAME] =~
		     /$eudaterx         # end date
		      /x) {
		$end_date = sprintf "%04d-%02d-%02d", $3, $2, $1;
	    }
	}

	if ($do_filter) {
	    if ((defined $start_date && defined $end_date &&
		 $start_date le $today &&
		 $end_date ge $today) ||
		(!defined $start_date && defined $end_date &&
		 $end_date ge $today) ||
		(defined $start_date && !defined $end_date &&
		 $start_date le $today)) {
		print Strassen::arr2line2($_), "\n";
	    }
	} else {
	    if (defined $end_date) {
		if ($end_date lt $today) {
		    my $initial = "  $file:" . $s->line . " ";
		    print wrap($initial, " "x length($initial),
			       "$_->[Strassen::NAME] expired\n");
		}
	    }
	}
    } $s;
}

__END__

Regexes for date check: ISO and german:

\b(\d{4}-\d{2}-\d{2})\b
\b([0123]?\d\.[01]?\d\.\d{4})\b
