#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib ("$FindBin::RealBin/..", "$FindBin::RealBin/../lib");

use File::Glob qw(bsd_glob);

use BBBikeUtil qw(bbbike_root bbbike_aux_dir);
use Strassen::Core ();   # load Strassen::Core
use Strassen ();         # Strassen->new_stream is in Strassen, not Strassen::Core

my $bbbike_root = bbbike_root;
my $bbbike_aux_datadir = defined bbbike_aux_dir() ? bbbike_aux_dir() . '/bbd' : undef;

# 1. Parse documented directives
my %documented;

open my $pod, "<:encoding(iso-8859-1)", "$bbbike_root/doc/bbd.pod"
    or die "Cannot open $bbbike_root/doc/bbd.pod: $!";
my $stage = 'search_for_section';
while (<$pod>) {
    if ($stage eq 'search_for_section' && m{^=head3\s+Line/block directives}) {
	$stage = 'in_section';
    } elsif ($stage eq 'in_section' && /^=head[12]/) {
	last;
    } elsif (/^=item\s+C<([^>]+)>/) {
        my $entry = $1;
        $entry =~ s/:.*$//;      # strip after colon if params like "by: I<source>"
        $entry =~ s/\s.*$//;     # strip after whitespace
        $documented{$entry} = 1;
    }
}
close $pod;

# 2. Collect .bbd files
my @files = bsd_glob("$bbbike_root/data/*-orig");
for my $candidate (
    "$bbbike_root/tmp/bbbike-temp-blockings.bbd",
    (defined $bbbike_aux_datadir ? "$bbbike_aux_datadir/fragezeichen_lowprio.bbd" : ()),
) {
    push @files, $candidate if -f $candidate;
}

# 3. Scan files
my %undoc;

for my $file (@files) {
    my $stream = Strassen->new_stream($file)
      or die "Cannot create stream for $file";

    $stream->read_stream(sub {
        my ($record, $directives) = @_;
        for my $dir (keys %$directives) {
            unless ($documented{$dir}) {
                $undoc{$dir}{count}++;
                $undoc{$dir}{files}{$file}++;
            }
        }
    });
}

# 4. Report
if (scalar keys %undoc) {
    for my $dir (sort { $undoc{$b}{count} <=> $undoc{$a}{count} } keys %undoc) {
	my $count = $undoc{$dir}{count};
	my @files = sort keys %{ $undoc{$dir}{files} };
	print "Undocumented directive '$dir': $count occurrences in files: @files\n";
    }
    exit 1;
}
