#!/usr/bin/perl -w

use strict;
use Getopt::Std;
use IO::File;
use File::Find;
use Text::Query;

my %opts;
getopts('a', \%opts);

my $mode = $opts{a} ? "advanced_text" : "simple_text";

my ($dir, $query) = @ARGV;

if(! defined $dir or ! -d $dir) {
    usage("Directory not specified or unreadable");
}

if(! defined $query) {
    usage("No query given");
}

my $q=Text::Query->new($query, 
                       -mode   => $mode,
                      );

find(sub { search_file($q) }, $dir);

##################################################
sub search_file {
##################################################
    my ($q) = @_;

    my $file = $_;

    return unless -T $file;

    my $fh = IO::File->new("< $file");

    if(! $fh) {
        warn "Cannot open '$File::Find::dir/$file'";
        return 1;
    }

    my $data = join '', <$fh>;

    $fh->close;

    if($q->match($data)) {
        print "$File::Find::dir/$file\n";
    }

    $_ = $file;
}

##################################################
sub usage {
##################################################
    my ($message) = @_;
    (my $prog = $0) =~ s#.*/##g;

    print <<EOT;
$message
usage: $prog [-a] dir query
  dir:   Directory to start search in
  query: Query string
    simple: [+-]ausdruck [+-]ausdruck ...
    -a: ausdruck AND|OR|NEAR [NOT] ausdruck ...
EOT

    exit 1;
}
