#!/usr/bin/perl
use strict;
use warnings;
use Log::Log4perl "get_logger";
use Time::HiRes;
use SKM::DB;

# CONS
my $APL = $ENV{APL};
my $MASTER = "$APL/var/conf/master/s_master";

# VARS
my %PurgePlan = (
    10000 => 1000,
    5000  => 200,
    0     => 500
);

require "$APL/common/bin/logger.engine";
my $log=get_logger('NEXTCAM::DB::EXPIRED_OBJECTS');
my $dbm;

die "Not a master" unless -f $MASTER;

$log->info("Recycling objects STARTED");
eval {
    $dbm = DBMaster({AutoCommit => 0, RaiseError => 1, PrintError => 0});
    
    # Fetch IDENTITY parameter
    my $ra = $dbm->selectrow_arrayref("SELECT val FROM _obj_attr WHERE obj=53 AND attr='KEEP_DELETED_OBJECTS'");
    my $keep_time = ($ra && defined($ra->[0])) ? int($ra->[0]) : 240; # 10 days be default
    if ($keep_time < 0) { # Keep always. Nothing to do
	$dbm->disconnect if $dbm;
	exit;
    }
    
    $log->info("Keep time: $keep_time hours");
    
    # Fetch all devices and external objects which were deleted more than 10 hours ago and have no events associated
    $ra = $dbm->selectrow_arrayref("SELECT count_expired_objects($keep_time)");
    if ($ra and $ra->[0]) {
	my $purge_total = $ra->[0];
	$log->info("Total $purge_total objects scheduled for purge");
	
	my $total_objs;
	my $purge_once = 1000;
	my $startTS = [Time::HiRes::gettimeofday()];
	
	$ra = $dbm->selectrow_arrayref("SELECT count(*) FROM _objs");
	$total_objs = $ra->[0];
	
	foreach (sort {$a<=>$b} keys %PurgePlan) {
	    $purge_once = $PurgePlan{$_} if $total_objs > $_;
	}
	$purge_once = $purge_total if $purge_once > $purge_total;
	$log->info("This iteration: $purge_once objects");
	
	my $cnt_del = 0;
	
	# Purge
	$ra = $dbm->selectrow_arrayref("SELECT purge_expired_objects($purge_once, $keep_time)");
	$cnt_del = $ra->[0] if $ra;
	$dbm->commit;
	    
	my $elapsed = Time::HiRes::tv_interval($startTS);
	
	$log->info(sprintf("Objects purged: $cnt_del, elapsed time: %.3f sec", $elapsed));
	
    } # if @$ra
};
if ($@) {
    $log->error("Error purging deleted objects: $@");
    eval { $dbm->rollback };
    $log->error("Rollback failed! $@") if $@;
}

$log->info("Recycling objects FINISHED");
