#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use DBI;
use Getopt::Long qw(:config no_ignore_case);
use Data::Dumper;
use Encode qw(encode);
use ScriptLock;
binmode STDOUT, ":utf8";

my $username;
my $password;
my $tableName = 'IDM2WEB_OSOBY';
my $tableName_cao = 'IDM2WEB_CAO';
my $tableName_ext = 'IDM2WEB_EXT';
my $tableName_pass = 'IDM2WEB_PRIHLASKY';
my $tableName_ns = 'IDM2WEB_NS';

# define service
my $service_name = "vsup_web";

# GEN folder location
my $facility_name = $ARGV[0];
chomp($facility_name);
my $service_files_base_dir="../gen/spool";
my $service_files_dir="$service_files_base_dir/$facility_name/$service_name";
my $service_file = "$service_files_dir/$service_name.csv";
my $service_file_cao = "$service_files_dir/$service_name" . "_cao.csv";
my $service_file_ext = "$service_files_dir/$service_name" . "_ext.csv";
my $service_file_pass = "$service_files_dir/$service_name" . "_pass.csv";
my $service_file_ns = "$service_files_dir/$service_name" . "_ns.csv";

# propagation destination
my $destination = $ARGV[1];
chomp($destination);

# create service lock
my $lock = ScriptLock->new($facility_name . "_" . $service_name . "_" . $destination);
($lock->lock() == 1) or die "Unable to get lock, service propagation was already running.";

# parse destination
my ($db_machine,$db_port,$db_name) = split(/:/, $destination);

# load authz
my $configPath = "/etc/perun/services/$service_name/$db_name";
open FILE, $configPath or die "Could not open config file $configPath: $!";
while(my $line = <FILE>) {
	if($line =~ /^username: .*/) {
		$username = ($line =~ m/^username: (.*)$/)[0];
	} elsif($line =~ /^password: .*/) {
		$password = ($line =~ m/^password: (.*)$/)[0];
	}
}

if(!defined($password) || !defined($username) || !defined($tableName)) {
	print "Can't get config data from config file.\n";
	exit 14;
}

#Main Structure
my $dataByUco = {};

open FILE, $service_file or die "Could not open $service_file: $!";
binmode FILE, ":utf8";
while(my $line = <FILE>) {
	my @parts = split /\t/, $line;
	chomp(@parts);
	$dataByUco->{$parts[0]}->{'LOGIN'} = $parts[1];
	$dataByUco->{$parts[0]}->{'EMAIL'} = $parts[2];
	$dataByUco->{$parts[0]}->{'TITLE_BEFORE'} = (($parts[3] ne '') ? $parts[3] : undef);
	$dataByUco->{$parts[0]}->{'FIRST_NAME'} = (($parts[4] ne '') ? $parts[4] : undef);
	$dataByUco->{$parts[0]}->{'LAST_NAME'} = (($parts[5] ne '') ? $parts[5] : undef);
	$dataByUco->{$parts[0]}->{'TITLE_AFTER'} = (($parts[6] ne '') ? $parts[6] : undef);
	$dataByUco->{$parts[0]}->{'PHONE'} = (($parts[7] ne '') ? $parts[7] : undef);
	$dataByUco->{$parts[0]}->{'MOBILE'} = (($parts[8] ne '') ? $parts[8] : undef);
	$dataByUco->{$parts[0]}->{'EMAIL_PRIV'} = (($parts[9] ne '') ? $parts[9] : undef);
	$dataByUco->{$parts[0]}->{'PHONE_PRIV'} = (($parts[10] ne '') ? $parts[10] : undef);
	$dataByUco->{$parts[0]}->{'FOTO'} = (($parts[11] ne '') ? $parts[11] : undef);
}
close FILE;

my $dbh = DBI->connect("dbi:mysql:$db_name:$db_machine:$db_port", $username, $password,{ RaiseError=>1, AutoCommit=>0, mysql_enable_utf8 => 1}) or die "Connect to database $db_name Error!\n";

my $DEBUG=0;
#statistic and information variables
my $foundAndSkipped = 0;
my $foundAndUpdated = 0;
my $inserted = 0;

#update and insert new
foreach my $uco (sort keys %$dataByUco) {

	my $LOGIN = $dataByUco->{$uco}->{'LOGIN'};
	my $EMAIL = $dataByUco->{$uco}->{'EMAIL'};
	my $TITLE_BEFORE = $dataByUco->{$uco}->{'TITLE_BEFORE'};
	my $FIRST_NAME = $dataByUco->{$uco}->{'FIRST_NAME'};
	my $LAST_NAME = $dataByUco->{$uco}->{'LAST_NAME'};
	my $TITLE_AFTER = $dataByUco->{$uco}->{'TITLE_AFTER'};
	my $PHONE = $dataByUco->{$uco}->{'PHONE'};
	my $MOBILE = $dataByUco->{$uco}->{'MOBILE'};
	my $EMAIL_PRIV = $dataByUco->{$uco}->{'EMAIL_PRIV'};
	my $PHONE_PRIV = $dataByUco->{$uco}->{'PHONE_PRIV'};
	my $FOTO = $dataByUco->{$uco}->{'FOTO'};

	# There is
	my $personExists = $dbh->prepare(qq{select 1 from $tableName where UCO=?});
	$personExists->execute($uco);

	if($personExists->fetch) {
		if($DEBUG == 1) { print "FIND: $uco\n"; }

		# generate proper select on NULLs
		my $select = "SELECT 1 from $tableName where UCO=? and LOGIN=? and EMAIL_SKOLNI=? and TITUL_PRED";
		my @params = ($uco, $LOGIN, $EMAIL);
		if ($TITLE_BEFORE) {
			$select = $select . "=?";
			push(@params, $TITLE_BEFORE);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and JMENO";
		if ($FIRST_NAME) {
			$select = $select . "=?";
			push(@params, $FIRST_NAME);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and PRIJMENI";
		if ($LAST_NAME) {
			$select = $select . "=?";
			push(@params, $LAST_NAME);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and TITUL_ZA";
		if ($TITLE_AFTER) {
			$select = $select . "=?";
			push(@params, $TITLE_AFTER);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and TEL_PRAC_LINKA";
		if ($PHONE) {
			$select = $select . "=?";
			push(@params, $PHONE);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and TEL_PRAC_MOB";
		if ($MOBILE) {
			$select = $select . "=?";
			push(@params, $MOBILE);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and EMAIL_SOUKR";
		if ($EMAIL_PRIV) {
			$select = $select . "=?";
			push(@params, $EMAIL_PRIV);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and TEL_SOUKR";
		if ($PHONE_PRIV) {
			$select = $select . "=?";
			push(@params, $PHONE_PRIV);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and FOTO";
		if ($FOTO) {
			$select = $select . "=?";
			push(@params, $FOTO);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . ";";

		#we need to know if these two records are without changes, if yes, skip them
		my $recordAreEquals = $dbh->prepare($select);
		$recordAreEquals->execute(@params);

		if(!$recordAreEquals->fetch) {

			my $updatePerson = $dbh->prepare(qq{UPDATE $tableName SET LOGIN=? , EMAIL_SKOLNI=? , TITUL_PRED=? , JMENO=? , PRIJMENI=? , TITUL_ZA=? , TEL_PRAC_LINKA=? , TEL_PRAC_MOB=? , EMAIL_SOUKR=? , TEL_SOUKR=? , FOTO=? , ZMENENO_KDY=NOW() WHERE UCO=?});
			$updatePerson->execute($LOGIN, $EMAIL, $TITLE_BEFORE, $FIRST_NAME, $LAST_NAME, $TITLE_AFTER, $PHONE, $MOBILE, $EMAIL_PRIV, $PHONE_PRIV, $FOTO, $uco);
			if($DEBUG == 1) { print "UPDATING EXISTING RECORD: $uco\n"; }
			$foundAndUpdated++;

		} else {

			if($DEBUG == 1) { print "SKIP RECORD: $uco\n"; }
			$foundAndSkipped++;

		}

	} else {

		if($DEBUG == 1) { print "INSERT NEW RECORD: $uco\n"; }
		$inserted++;
		# we will do insert
		my $insertPerson = $dbh->prepare(qq{INSERT INTO $tableName (UCO, LOGIN, EMAIL_SKOLNI, TITUL_PRED, JMENO, PRIJMENI, TITUL_ZA, TEL_PRAC_LINKA, TEL_PRAC_MOB, EMAIL_SOUKR, TEL_SOUKR, FOTO, ZMENENO_KDY) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,NOW())});
		$insertPerson->execute($uco, $LOGIN, $EMAIL, $TITLE_BEFORE, $FIRST_NAME, $LAST_NAME, $TITLE_AFTER, $PHONE, $MOBILE, $EMAIL_PRIV, $PHONE_PRIV, $FOTO);

	}
}

##########################
#
# CAO handling
#
##########################

my $cao;
my $insertedCao = 0;
my $foundAndSkippedCao = 0;
my $deletedCao = 0;
my $deletedCao2 = 0;
my $deletedCao3 = 0;

open FILE, $service_file_cao or die "Could not open $service_file_cao: $!";
while(my $line = <FILE>) {

	my @parts = split /\t/, $line;

	my $UCO = (($parts[0] ne '') ? $parts[0] : undef);
	my $CAO_ORGAN = (($parts[1] ne '') ? $parts[1] : undef);
	my $CAO_FUNKCE = (($parts[2] ne '') ? $parts[2] : undef);
	my $CAO_FUNKCE_ID = (($parts[3] ne '') ? $parts[3] : undef);

	# fill existing CAO relations for UCO
	$cao->{$UCO}->{$CAO_FUNKCE_ID} = 1;

	# There is a CAO function
	my $caoExist = $dbh->prepare(qq{select 1 from $tableName_cao where UCO=? and VZTAH_TYP=? and CAO_FUNKCE_ID=?});
	$caoExist->execute($UCO, 'CAO', $CAO_FUNKCE_ID);

	if($caoExist->fetch) {
		if($DEBUG == 1) { print "FIND: $UCO\n"; }

			if($DEBUG == 1) { print "SKIP RECORD: $UCO\n"; }
			$foundAndSkippedCao++;

	} else {

		if($DEBUG == 1) { print "INSERT NEW RECORD: $UCO\n"; }
		$insertedCao++;
		# we will do insert
		my $insertCao = $dbh->prepare(qq{INSERT INTO $tableName_cao (UCO, VZTAH_TYP, CAO_ORGAN, CAO_FUNKCE_NAZEV, CAO_FUNKCE_ID, ZMENENO_KDY) VALUES (?,?,?,?,?,NOW())});
		$insertCao->execute($UCO, 'CAO', $CAO_ORGAN, $CAO_FUNKCE, $CAO_FUNKCE_ID);

	}

}
close FILE;

#####
# Delete removed CAOs
#####

# delete completly removed people from CAO
my @keptUcos = sort keys %{$cao};
my $elements = join(',',@keptUcos);
if($DEBUG == 1) { print "DELETED NOT IN ($elements)\n"; }
if (length $elements) {
	# delete some
	$deletedCao += $dbh->do("DELETE FROM $tableName_cao WHERE VZTAH_TYP='CAO' and UCO not in ($elements)");
} else {
	# delete all
	$deletedCao += $dbh->do("DELETE FROM $tableName_cao WHERE VZTAH_TYP='CAO'");
}

# delete invalid CAO relations for kept people

for my $UCO (sort keys %{$cao}) {
	my @keptCaos = sort keys %{$cao->{$UCO}};
	my $kept = join('","',@keptCaos);
	$kept = '"'.$kept.'"';
	if($DEBUG == 1) { print "DELETED FOR $UCO NOT IN ($kept)\n"; }
	$deletedCao2++;
	$deletedCao3 += $dbh->do("DELETE FROM $tableName_cao WHERE VZTAH_TYP='CAO' and UCO='$UCO' and CAO_FUNKCE_ID not in ($kept)");
}



##########################
#
# EXT handling
#
##########################

my $ext;
my $insertedExt = 0;
my $foundAndUpdatedExt = 0;
my $foundAndSkippedExt = 0;
my $deletedExt = 0;

open FILE, $service_file_ext or die "Could not open $service_file_ext: $!";
while(my $line = <FILE>) {

	my @parts = split /\t/, $line;

	my $UCO = (($parts[0] ne '') ? $parts[0] : undef);
	my $VZTAH_ID = (($parts[1] ne '') ? $parts[1] : undef);
	my $VZTAH_TYP = (($parts[2] ne '') ? $parts[2] : undef);
	my $ZAM_FCE_NAZ = (($parts[3] ne '') ? $parts[3] : undef);
	my $ZAM_FCE_CIS = (($parts[4] ne '') ? $parts[4] : undef);
	my $NS = (($parts[5] ne '') ? $parts[5] : undef);

	# fill existing EXT relations for UCO
	$ext->{$UCO} = 1;

	# There is a EXT
	my $extExist = $dbh->prepare(qq{select 1 from $tableName_ext where UCO=? and VZTAH_ID=?});
	$extExist->execute($UCO, $VZTAH_ID);

	if($extExist->fetch) {
		if($DEBUG == 1) { print "FIND: $UCO\n"; }

		my $select = "SELECT 1 from $tableName_ext where UCO=? and VZTAH_ID=? and VZTAH_TYP=? and ZAM_FUNKCE_NAZEV";
		my @params = ($UCO, $VZTAH_ID, $VZTAH_TYP);
		if ($ZAM_FCE_NAZ) {
			$select = $select . "=?";
			push(@params, $ZAM_FCE_NAZ);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and ZAM_FUNKCE_CISLO";
		if ($ZAM_FCE_CIS) {
			$select = $select . "=?";
			push(@params, $ZAM_FCE_CIS);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and NS";
		if ($NS) {
			$select = $select . "=?";
			push(@params, $NS);
		} else {
			$select = $select . " is NULL";
		}

		my $recordAreEquals = $dbh->prepare($select);
		$recordAreEquals->execute(@params);

		if(!$recordAreEquals->fetch) {

			my $updatePerson = $dbh->prepare(qq{UPDATE $tableName_ext SET VZTAH_TYP=? , ZAM_FUNKCE_NAZEV=? , ZAM_FUNKCE_CISLO=? , NS=? , ZMENENO_KDY=NOW() WHERE UCO=? and VZTAH_ID=?});
			$updatePerson->execute($VZTAH_TYP, $ZAM_FCE_NAZ, $ZAM_FCE_CIS, $NS, $UCO, $VZTAH_ID);
			if($DEBUG == 1) { print "UPDATING EXISTING RECORD: $UCO\n"; }
			$foundAndUpdatedExt++;

		} else {

			if($DEBUG == 1) { print "SKIP RECORD: $UCO\n"; }
			$foundAndSkippedExt++;

		}

	} else {

		if($DEBUG == 1) { print "INSERT NEW RECORD: $UCO\n"; }
		$insertedExt++;
		# we will do insert
		my $insertExt = $dbh->prepare(qq{INSERT INTO $tableName_ext (UCO, VZTAH_ID, VZTAH_TYP, ZAM_FUNKCE_CISLO, ZAM_FUNKCE_NAZEV, NS, ZMENENO_KDY) VALUES (?,?,?,?,?,?,NOW())});
		$insertExt->execute($UCO, $VZTAH_ID, $VZTAH_TYP, $ZAM_FCE_CIS, $ZAM_FCE_NAZ, $NS);

	}

}
close FILE;

#####
# Delete removed EXTs
#####

# delete completly removed people from EXT
my @keptExtUcos = sort keys %{$ext};
my $elementsExt = join(',',@keptExtUcos);
if($DEBUG == 1) { print "DELETED NOT IN ($elementsExt)\n"; }
if (length $elementsExt) {
	# delete some
	$deletedExt += $dbh->do("DELETE FROM $tableName_ext WHERE UCO not in ($elementsExt)");
} else {
	# delete all
	$deletedExt += $dbh->do("DELETE FROM $tableName_ext");
}

##########################
#
# First pass app handling
#
##########################
my $pass;
my $insertedPass = 0;
my $foundAndUpdatedPass = 0;
my $foundAndSkippedPass = 0;
my $deletedPass = 0;

my $passExist = $dbh->prepare(qq{select 1 from $tableName_pass where UCO=?});
my $insertExt = $dbh->prepare(qq{INSERT INTO $tableName_pass (UCO, STUDIUM_ID, STUDIUM_OD, PRIHLASKA_KOD, ROCNIK, DR, ZMENENO_KDY) VALUES (?,?,STR_TO_DATE(?,'%Y-%m-%d'),?,?,?,NOW())});

open FILE, $service_file_pass or die "Could not open $service_file_pass: $!";
while(my $line = <FILE>) {

	my @parts = split /\t/, $line;
	chomp(@parts);

	my $UCO = (($parts[0] ne '') ? $parts[0] : undef);
	my $STUDY_ID = (($parts[1] ne '') ? $parts[1] : undef);
	my $STUDY_SINCE = (($parts[2] ne '') ? $parts[2] : undef);
	my $STUDY_PRIHLASKA = (($parts[3] ne '') ? $parts[3] : undef);
	my $STUDY_ROCNIK = (($parts[4] ne '') ? $parts[4] : undef);
	my $DR = (($parts[5] ne '') ? $parts[5] : undef);

	unless ($STUDY_ID and $STUDY_PRIHLASKA and $DR) {
		if ($DEBUG == 1) { print "SKIPPED PASS - WRONG INPUT PARAMS: $UCO\n"; }
		next;
	}

	# fill existing CAO relations for UCO
	$pass->{$UCO} = 1;

	# There is a PASS
	$passExist->execute($UCO);

	if($passExist->fetch) {
		if ($DEBUG == 1) { print "FIND PASS: $UCO\n"; }

		my $select = "SELECT 1 from $tableName_pass where UCO=? and STUDIUM_ID=? and PRIHLASKA_KOD=? and DR=? and STUDIUM_OD";
		my @params = ($UCO, $STUDY_ID, $STUDY_PRIHLASKA, $DR);
		if ($STUDY_SINCE) {
			$select = $select . "=STR_TO_DATE(?,'%Y-%m-%d')";
			push(@params, $STUDY_SINCE);
		} else {
			$select = $select . " is NULL";
		}
		$select = $select . " and ROCNIK";
		if ($STUDY_ROCNIK) {
			$select = $select . "=?";
			push(@params, $STUDY_ROCNIK);
		} else {
			$select = $select . " is NULL";
		}

		my $recordAreEquals = $dbh->prepare($select);
		$recordAreEquals->execute(@params);

		if(!$recordAreEquals->fetch) {

			my $updatePerson = $dbh->prepare(qq{UPDATE $tableName_pass SET STUDIUM_ID=? , STUDIUM_OD=STR_TO_DATE(?,'%Y-%m-%d') , PRIHLASKA_KOD=? , DR=? , ROCNIK=? , ZMENENO_KDY=NOW() WHERE UCO=?});
			$updatePerson->execute($STUDY_ID, $STUDY_SINCE, $STUDY_PRIHLASKA, $DR, $STUDY_ROCNIK, $UCO);
			if($DEBUG == 1) { print "UPDATING EXISTING PASS RECORD: $UCO\n"; }
			$foundAndUpdatedPass++;

		} else {

			if($DEBUG == 1) { print "SKIP PASS RECORD: $UCO\n"; }
			$foundAndSkippedPass++;

		}

	} else {

		if($DEBUG == 1) { print "INSERT NEW PASS RECORD: $UCO\n"; }
		$insertedPass++;
		# we will do insert
		$insertExt->execute($UCO, $STUDY_ID, $STUDY_SINCE, $STUDY_PRIHLASKA, $STUDY_ROCNIK, $DR);

	}

}
close FILE;

#####
# Delete removed PASS
#####

# delete completly removed people from PASS
my @keptPassUcos = sort keys %{$pass};
my $elementsPass = join(',',@keptPassUcos);
if($DEBUG == 1) { print "DELETED PASS NOT IN ($elementsPass)\n"; }
if (length $elementsPass) {
	# delete some
	$deletedPass += $dbh->do("DELETE FROM $tableName_pass WHERE UCO not in ($elementsPass)");
} else {
	# delete all
	$deletedPass += $dbh->do("DELETE FROM $tableName_pass");
}

##########################
#
# NS handling
#
##########################

#Main Structure
my $dataByNs = {};

open FILE, $service_file_ns or die "Could not open $service_file_ns: $!";
while(my $line = <FILE>) {
	my @parts = split /\t/, $line;
	chomp(@parts);
	$dataByNs->{$parts[0]}->{'NAME'} = $parts[1];
	$dataByNs->{$parts[0]}->{'USERS'}->{$parts[2]} = 1
}
close FILE;

#statistic and information variables
my $inserted_NS = 0;
my $deleted_NS = 0;

$deleted_NS += $dbh->do("DELETE FROM $tableName_ns");

#update and insert new
foreach my $NS_KOD (sort keys %$dataByNs) {

	my $NS_NAZEV = $dataByNs->{$NS_KOD}->{'NAME'};

	foreach my $UCO (sort keys %{$dataByNs->{$NS_KOD}->{'USERS'}}) {

		if($DEBUG == 1) { print "INSERT NEW RECORD: ".$NS_KOD." ".$NS_NAZEV." ".$UCO."\n"; }
		$inserted_NS++;
		# we will do insert
		my $insertPerson = $dbh->prepare(qq{INSERT INTO $tableName_ns (NS_KOD, NS_NAZEV, UCO) VALUES (?,?,?)});
		$insertPerson->execute($NS_KOD, $NS_NAZEV, $UCO);

	}

}

#
# CLEAR all data for People removed from the WEB
#
my $deletedUsers = 0;
my $ary_ref_users = $dbh->selectcol_arrayref(qq{select distinct UCO from $tableName where UCO is not null});
my @web_ucos = @$ary_ref_users;
my $deleteUser = $dbh->prepare(qq{DELETE from $tableName where UCO=?});
my $deleteCao = $dbh->prepare(qq{DELETE from $tableName_cao WHERE UCO=?});
my $deletePass = $dbh->prepare(qq{DELETE from $tableName_pass WHERE UCO=?});
my $deleteExt = $dbh->prepare(qq{DELETE from $tableName_ext WHERE UCO=?});
my $deleteNs = $dbh->prepare(qq{DELETE from $tableName_ns WHERE UCO=?});
my $deleteDC2 = $dbh->prepare(qq{DELETE from DC22WEB_VZTAHY WHERE UCO=?});
my $deleteKOS = $dbh->prepare(qq{DELETE from KOS2WEB_VZTAHY WHERE UCO=?});

foreach my $uco (@web_ucos) {
	unless (exists $dataByUco->{$uco}) {
		if($DEBUG == 1) {
			print "DELETE UCO: $uco (including all relations etc.)\n";
		}
		# delete all relations
		$deleteCao->execute($uco);
		$deleteExt->execute($uco);
		$deletePass->execute($uco);
		$deleteNs->execute($uco);
		$deleteDC2->execute($uco);
		$deleteKOS->execute($uco);
		$deleteUser->execute($uco);

		$deletedUsers++;

	}
}

commit $dbh;
$dbh->disconnect();

# print info about operations
print "=======================================\n";
print "Newly inserted:   \t$inserted\n";
print "Found and skipped: \t$foundAndSkipped\n";
print "Found and updated:\t$foundAndUpdated\n";
print "---------------------------------------\n";
print "Newly inserted CAO:    \t$insertedCao\n";
print "Found and skipped CAO: \t$foundAndSkippedCao\n";
print "Deleted CAO completely:\t$deletedCao (rows)\n";
print "Deleted CAO partially:  \t$deletedCao2 processed people ($deletedCao3 deleted rows)\n";
print "---------------------------------------\n";
print "Newly inserted EXT:    \t$insertedExt\n";
print "Found and updated EXT: \t$foundAndUpdatedExt\n";
print "Found and skipped EXT: \t$foundAndSkippedExt\n";
print "Deleted EXT completely:\t$deletedExt (rows)\n";
print "---------------------------------------\n";
print "Newly inserted PASS:    \t$insertedPass\n";
print "Found and updated PASS: \t$foundAndUpdatedPass\n";
print "Found and skipped PASS: \t$foundAndSkippedPass\n";
print "Deleted PASS completely:\t$deletedPass (rows)\n";
print "---------------------------------------\n";
print "Inserted NS:\t$inserted_NS (new rows)\n";
print "Deleted NS:\t$deleted_NS (old rows)\n";
print "---------------------------------------\n";
print "Deleted users:\t$deletedUsers\n";
print "=======================================\n";

$lock->unlock();
