package SLUB::LZA::Rosetta::TA::Command::search;
use strict;
use warnings;
use feature qw(say);


use SLUB::LZA::Rosetta::TA -command;

sub abstract {"searches Rosetta based Archival Information System";}
my $description=<<"DESCR";
Searches a Rosetta-based AIS for descriptive oder source metadata on behalf of the Technical Analyst.
Returns SRU-response including dc-records. Only the first 10 matches will be presented by default.

Examples:

  * Is this dc identifier in Archiv?
    $0 count -d SLUB:LZA:Kitodo:kitodo:422766
  * Which IE PID has this dc identifier?
    $0 search -d SLUB:LZA:Kitodo:kitodo:422766
  * Which IE PID are public domain?
    $0 search -s publicdomain
  * Which IE PID are copyrighted?
    $0 search -s copyrighted
  * Which IEs were modified in 2021-05-31?
    $0 search -m 2021-05-31
    Which IEs have at least one invalid file?
    $0 search --with-invalid-files
  * Which IEs with mkv-files are in archive?
    $0 search --with-format=fmt/569
  * Which IEs have at least one file without virus check?
    $0 search --with-missed-viruscheck
DESCR

sub description {
    "$description"
}
sub opt_spec {
    return(
        ["verbose|v" => "enable verbose output"],
        ["datemode" => hidden => {one_of => [
        ["creationdate|c=s" => "search based on creationdate string"],
        ["modificationdate|m=s" => "search based on modificationdate string"]

        ] } ],
        [ "descriptive|d=s", "search descriptive metadata (dc identifier)"],
        [ "source|s=s", "search source metadata"],
        ["ie|i=s" => "search a specific IE"],
        ["maxrecords=i", "set maxrecords, default is 10"],
        ["startrecord=i", "set startrecord, default is 1"],
        ["format" => hidden => {one_of => [
            ["with-format=s" => "with pronom format id"],
            # unsupported by Rosetta <= 7.0
            #["without-format=s" => "without pronom format id"],
        ] } ],
        ["validation" => hidden => {one_of => [
            ["with-valid-files" => "with valid files"],
            ["with-invalid-files" => "with at least one invalid file"],
        ] } ],
        ["viruscheck" => hidden => {one_of => [
            ["with-passed-viruschecks" => "with passed virus checks"],
            ["with-missed-viruschecks" => "with missed virus checks"],
            ["with-failed-viruschecks" => "with failed virus checks"],
        ]}],

    );
}
sub validate_args {
    my ($self, $opt, $args) = @_;
    # no args allowed but options!
    $self->usage_error("No args allowed") if @$args;
}

sub execute {
    my ($self, $opt, $args) = @_;
    my $maxrecords="10";
    if (exists $opt->{maxrecords}) {
        $maxrecords = $opt->{maxrecords};
    }
    my $startrecord=1;
    if (exists $opt->{startrecord}) {
        $startrecord = $opt->{startrecord};
    }
    my @queries;
    if (exists $opt->{source}) {
        push @queries, "IE.sourceMD.content=$opt->{source}";
    }
    if (exists $opt->{ie}) {
        push @queries, "IE.dc.identifier==$opt->{ie}";
    }
    if (exists $opt->{descriptive}) {
        push @queries, "IE.dc.identifier==$opt->{descriptive}";
    }
    if (exists $opt->{creationdate}) {
        push @queries, "IE.objectCharacteristics.creationDate==$opt->{creationdate}";
    }
    if (exists $opt->{modificationdate}) {
        push @queries, "FILE.objectCharacteristics.modificationDate==$opt->{modificationdate}";
    }
    if (exists $opt->{'with_format'}) {
        push @queries, "FILE.generalFileCharacteristics.formatLibraryId=$opt->{'with_format'}";
    }
    # unsupported by Rosetta <= 7.0
    #if (exists $opt->{'without_format'}) {
    #    push @queries, "FILE.generalFileCharacteristics.formatLibraryId!=$opt->{'without_format'}";
    #}
    if (exists $opt->{'with_valid_files'}) {
        push @queries, "FILE.fileValidation.isValid=true";
    }
    if (exists $opt->{'with_invalid_files'}) {
        push @queries, "FILE.fileValidation.isValid=false";
    }
    if (exists $opt->{'with_passed_viruschecks'}) {
        push @queries, "FILE.fileVirusCheck.status=true";
    }
    if (exists $opt->{'with_failed_viruschecks'}) {
        push @queries, "FILE.fileVirusCheck.status=false";
    }
    if (exists $opt->{'with_missed_viruschecks'}) {
        push @queries, "FILE.fileVirusCheck.status==%22%22";
    }


    my $query = join(" and ", @queries);
    if (exists $opt->{debug}) {
        use Data::Printer;
        p( $opt);
        p(@queries);
        p( $query);
    }

    my $response = SLUB::LZA::Rosetta::TA::sru_search('ie', $query, $startrecord, $maxrecords, $opt->{verbose});
    say $response;
}

1;