#!/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;

my $username;
my $password;
my $tableName = 'perun2tritius_osoby';

# define service
my $service_name = "vsup_tritius";

# 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";

# 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: $!";
while(my $line = <FILE>) {
	my @parts = split /\t/, $line;
	$dataByUco->{$parts[0]}->{'LOGIN'} = $parts[1];
	$dataByUco->{$parts[0]}->{'TYPE'} = (($parts[2] ne '') ? $parts[2] : 'STU');  # fallback to students
	$dataByUco->{$parts[0]}->{'EMAIL'} = $parts[3];
	$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_BEFORE'} = (($parts[6] ne '') ? $parts[6] : undef);
	$dataByUco->{$parts[0]}->{'TITLE_AFTER'} = (($parts[7] ne '') ? $parts[7] : undef);
	$dataByUco->{$parts[0]}->{'BIRTH_NUMBER'} = (($parts[8] ne '') ? $parts[8] : undef);
	$dataByUco->{$parts[0]}->{'GENDER'} = (($parts[9] ne '') ? $parts[9] : undef);
	$dataByUco->{$parts[0]}->{'PHONE'} = (($parts[10] ne '') ? $parts[10] : undef);
	$dataByUco->{$parts[0]}->{'CARD_BARCODE'} = (($parts[11] ne '') ? $parts[11] : undef);
	$dataByUco->{$parts[0]}->{'CARD_CHIP_NUMBER'} = (($parts[12] ne '') ? $parts[12] : undef);
	$dataByUco->{$parts[0]}->{'STREET'} = (($parts[13] ne '') ? $parts[13] : undef);
	$dataByUco->{$parts[0]}->{'HOUSE_NUMBER'} = (($parts[14] ne '') ? $parts[14] : undef);
	$dataByUco->{$parts[0]}->{'TOWN'} = (($parts[15] ne '') ? $parts[15] : undef);
	$dataByUco->{$parts[0]}->{'POSTAL_CODE'} = (($parts[16] ne '') ? $parts[16] : undef);
}
close FILE;

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

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

$deleted += $dbh->do("DELETE FROM $tableName");

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

	my $LOGIN = $dataByUco->{$uco}->{'LOGIN'};
	my $TYPE = $dataByUco->{$uco}->{'TYPE'};
	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 $BIRTH_NUMBER = $dataByUco->{$uco}->{'BIRTH_NUMBER'};
	my $GENDER = $dataByUco->{$uco}->{'GENDER'};
	my $CARD_BARCODE = $dataByUco->{$uco}->{'CARD_BARCODE'};
	my $CARD_CHIP_NUMBER = $dataByUco->{$uco}->{'CARD_CHIP_NUMBER'};
	my $STREET = $dataByUco->{$uco}->{'STREET'};
	my $HOUSE_NUMBER = $dataByUco->{$uco}->{'HOUSE_NUMBER'};
	my $TOWN = $dataByUco->{$uco}->{'TOWN'};
	my $POSTAL_CODE = $dataByUco->{$uco}->{'POSTAL_CODE'};

	if($DEBUG == 1) { print "INSERT NEW RECORD: $uco\n"; }
	$inserted++;
	# we will do insert
	my $insertPerson = $dbh->prepare(qq{INSERT INTO $tableName (UCO, LOGIN, TYP_VZTAHU, EMAIL, TITUL_PRED, JMENO, PRIJMENI, TITUL_ZA, TELEFON, ROD_CISLO, POHLAVI, KARTA_KOD_CIPU, KARTA_KOD_CAROVY, ADR_ULICE, ADR_CP_CO, ADR_MESTO, ADR_PSC, ZMENENO_KDY) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())});
	$insertPerson->execute($uco, $LOGIN, $TYPE, $EMAIL, $TITLE_BEFORE, $FIRST_NAME, $LAST_NAME, $TITLE_AFTER, $PHONE, $BIRTH_NUMBER, $GENDER, $CARD_CHIP_NUMBER, $CARD_BARCODE, $STREET, $HOUSE_NUMBER, $TOWN, $POSTAL_CODE);

}

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

# print info about operations
print "=======================================\n";
print "Inserted:\t$inserted\n";
print "Deleted:\t$deleted (old rows)\n";
print "=======================================\n";

$lock->unlock();
