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

#
# Author: Slaven Rezic
#
# Copyright (C) 2001,2010 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.
#

use strict;

use Getopt::Long;
use FindBin;
use lib ("$FindBin::RealBin/..", "$FindBin::RealBin/../lib");
use Strassen;

unshift(@Strassen::datadirs, "$FindBin::RealBin/../data");

my $datatype;
my $datafile;
my @err;

my %cat_to_nr_of_points =
    ('P1' => 3,
     'P2' => 3,
     '0'  => 1,
     'BNP' => 1,
    );
my %cat_to_min_nr_of_points =
    ('3' => 3,
    );

GetOptions("data=s"     => \$datafile,
	   "type=s"     => \$datatype,
	  );
if (!$datafile) {
    die "-data option missing";
}

my $s = Strassen->new($datafile);
$s->init;
while(1) {
    my $r = $s->next;
    last if !@{ $r->[Strassen::COORDS] };
    if (defined $datatype) {
	if ($datatype eq 'vorfahrt') {
	    if ($r->[Strassen::CAT] =~ m{^Vf($|::)}) {
		if (scalar @{$r->[Strassen::COORDS]} != 3) {
		    push @err, "Vf entry in vorfahrt file must have exactly 3 points (pos @{[ $s->pos ]}, coords \"@{$r->[Strassen::COORDS]}\")";
		}
	    } elsif ($r->[Strassen::CAT] eq 'Kz') {
		if (scalar @{$r->[Strassen::COORDS]} != 1) {
		    push @err, "Kz entry in vorfahrt file must have exactly 1 point (pos @{[ $s->pos ]})";
		}
	    } else {
		our %seen_vorfahrt_warn;
		if (!$seen_vorfahrt_warn{$datafile}) {
		    warn "*** WARNING: Unhandled category " . $r->[Strassen::CAT] . " in file $datafile";
		    $seen_vorfahrt_warn{$datafile}++;
		}
	    }
	}
    } else {
	my($cat) = split /:/, $r->[Strassen::CAT];
	if (exists $cat_to_nr_of_points{$cat} &&
	    $cat_to_nr_of_points{$cat} != scalar @{$r->[Strassen::COORDS]}) {
	    push @err, "Category $cat expects $cat_to_nr_of_points{$cat} points (pos @{[ $s->pos ]})";
	} elsif (exists $cat_to_min_nr_of_points{$cat} &&
		 $cat_to_min_nr_of_points{$cat} < scalar @{$r->[Strassen::COORDS]}) {
	    push @err, "Category $cat expects min. $cat_to_nr_of_points{$cat} points (pos @{[ $s->pos ]})";
	}
    }
}

if (@err) {
    die join("\n", @err), "\n";
}

__END__
