#!/usr/bin/perl

use Modern::Perl;
use Getopt::Long;
use Pod::Usage;
use Time::HiRes qw(gettimeofday);

use Koha::Script -cron;
use C4::AuthoritiesMarc;
use Koha::Authority::MergeRequests;

use constant RESET_HOURS => 24;
use constant REMOVE_DAYS => 30;

my ( $params );
GetOptions(
    'h' => \$params->{help},
    'v' => \$params->{verbose},
    'b' => \$params->{batch},
);

$|=1; # flushes output
if ( $params->{batch} ) {
    handle_batch($params);
} else {
    pod2usage(1);
}

sub handle_batch {
    my $params = shift;
    my $verbose = $params->{verbose};

    my $starttime = gettimeofday;
    print "Started merging\n" if $verbose;

    Koha::Authority::MergeRequests->cron_cleanup({ reset_hours => RESET_HOURS, remove_days => REMOVE_DAYS });
    my $rs = Koha::Authority::MergeRequests->search(
        { done => 0 },
        { order_by => { -asc => 'id' }}, # IMPORTANT
    );
    # For best results, postponed merges should be applied in right order.
    # Similarly, we do not only select the last one for a specific id.

    while( my $req = $rs->next ) {
        $req->done(2)->store;
        print "Merging auth " . $req->authid . " to " . ( $req->authid_new // 'NULL' ) . ".\n" if $verbose;
        my $newmarc = $req->authid_new
            ? GetAuthority( $req->authid_new )
            : undef;
        # Following merge call handles both modifications and deletes
        merge({
            mergefrom => $req->authid,
            MARCfrom => scalar $req->oldmarc,
            mergeto => $req->authid_new,
            MARCto => $newmarc,
            override_limit => 1,
        });
        $req->done(1)->store;
    }
    my $timeneeded = gettimeofday - $starttime;
    print "Done in $timeneeded seconds\n" if $verbose;
}

=head1 NAME

merge_authorities.pl

=head1 DESCRIPTION

Cron script to handle authority merge requests

=head1 SYNOPSIS

merge_authorities.pl -h

merge_authorities.pl -b -v

=head1 OPTIONS

-b : batch mode (You need to pass this parameter from crontab file)

-h : print usage statement

-v : verbose mode

=head1 AUTHOR

Koha Development Team

=cut
