#!/usr/bin/env perl
use v5.18;
use warnings;
use Getopt::Long qw(GetOptions);
use App::p5find qw<p5_doc_iterator>;

sub print_usage {
    print <<USAGE;
p5find-words-used-only-once [switches] -- [path1] [path2]...

  -h    show help message
USAGE
}

my %opts;
GetOptions(
    \%opts,
    "h",
);

if ($opts{h}) {
    print_usage();
    exit(0);
}

my %idx;

my @paths = @ARGV;
@paths = ('.') unless @paths;

my $iter = p5_doc_iterator(@paths);
while (my $doc = $iter->()) {
    my $file = $doc->filename;
    my $o;

    $o = $doc->find(sub { $_[1]->isa("PPI::Token::QuoteLike::Words") }) ||[];
    for my $token (@$o) {
        for my $word ($token->literal) {
            if (defined($idx{"$word"})) {
                $idx{"$word"}{frequency}++;
            } else {
                $idx{"$word"} = +{
                    frequency => 1,
                    WHERE => [
                        $file,
                        $token->line_number,
                        $token->column_number,
                    ]
                };
            }
        }
    }

    $o = $doc->find(sub { $_[1]->isa("PPI::Token::Word") }) ||[];
    for my $token (@$o) {
        if (defined($idx{"$token"})) {
            $idx{"$token"}{frequency}++;
        } else {
            $idx{"$token"} = +{
                frequency => 1,
                WHERE => [
                    $file,
                    $token->line_number,
                    $token->column_number,
                ]
            };
        }
    }
}

for my $tok (keys %idx) {
    next unless $idx{$tok}{frequency} == 1;
    say join ":", @{$idx{$tok}{WHERE}}, $tok;
}
