#!/usr/bin/perl
use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;

local $::SERVICE_NAME = "vsup_ifis";
local $::PROTOCOL_VERSION = "3.0.0";
my $SCRIPT_VERSION = "3.0.1";

perunServicesInit::init;
my $DIRECTORY = perunServicesInit::getDirectory;
my $fileName = "$DIRECTORY/$::SERVICE_NAME".".csv";
my $data = perunServicesInit::getHashedHierarchicalData;

#Constants
our $A_UCO; *A_UCO = \'urn:perun:user:attribute-def:def:ucoVsup';

our $A_TITLE_BEFORE;  *A_TITLE_BEFORE = \'urn:perun:user:attribute-def:core:titleBefore';
our $A_FIRST_NAME;  *A_FIRST_NAME = \'urn:perun:user:attribute-def:core:firstName';
our $A_LAST_NAME;  *A_LAST_NAME = \'urn:perun:user:attribute-def:core:lastName';
our $A_TITLE_AFTER;  *A_TITLE_AFTER = \'urn:perun:user:attribute-def:core:titleAfter';

our $A_ARTISTIC_FIRST_NAME; *A_ARTISTIC_FIRST_NAME = \'urn:perun:user:attribute-def:def:artisticFirstName';
our $A_ARTISTIC_LAST_NAME; *A_ARTISTIC_LAST_NAME = \'urn:perun:user:attribute-def:def:artisticLastName';

our $A_GENDER;  *A_GENDER = \'urn:perun:user:attribute-def:def:gender';
our $A_JOB;  *A_JOB = \'urn:perun:user:attribute-def:def:job';
our $A_BIRTH_NUMBER;  *A_BIRTH_NUMBER = \'urn:perun:user:attribute-def:def:birthNumber';

# to define STUD | ZAM | Externista - pedagog
our $A_R_RELATION_TYPE; *A_R_RELATION_TYPE = \'urn:perun:resource:attribute-def:def:relationType';

# address
our $A_ADDRESS_STREET_KOS; *A_ADDRESS_STREET_KOS = \'urn:perun:user:attribute-def:def:addressStreetKos';
our $A_ADDRESS_STREET_DC2; *A_ADDRESS_STREET_DC2 = \'urn:perun:user:attribute-def:def:addressStreetDc2';
our $A_ADDRESS_HOUSE_NUMBER_KOS; *A_ADDRESS_HOUSE_NUMBER_KOS = \'urn:perun:user:attribute-def:def:addressHouseNumberKos';
our $A_ADDRESS_HOUSE_NUMBER_DC2; *A_ADDRESS_HOUSE_NUMBER_DC2 = \'urn:perun:user:attribute-def:def:addressHouseNumberDc2';
our $A_ADDRESS_TOWN_KOS; *A_ADDRESS_TOWN_KOS = \'urn:perun:user:attribute-def:def:addressTownKos';
our $A_ADDRESS_TOWN_DC2; *A_ADDRESS_TOWN_DC2 = \'urn:perun:user:attribute-def:def:addressTownDc2';
our $A_ADDRESS_POSTAL_CODE_KOS; *A_ADDRESS_POSTAL_CODE_KOS = \'urn:perun:user:attribute-def:def:addressPostalCodeKos';
our $A_ADDRESS_POSTAL_CODE_DC2; *A_ADDRESS_POSTAL_CODE_DC2 = \'urn:perun:user:attribute-def:def:addressPostalCodeDc2';
our $A_ADDRESS_COUNTRY_CODE_KOS; *A_ADDRESS_COUNTRY_CODE_KOS = \'urn:perun:user:attribute-def:def:addressCountryCodeKos';
our $A_ADDRESS_COUNTRY_CODE_DC2; *A_ADDRESS_COUNTRY_CODE_DC2 = \'urn:perun:user:attribute-def:def:addressCountryCodeDc2';
our $A_ADDRESS_TYPE_KOS; *A_ADDRESS_TYPE_KOS = \'urn:perun:user:attribute-def:def:addressTypeKos';
our $A_ADDRESS_TYPE_DC2; *A_ADDRESS_TYPE_DC2 = \'urn:perun:user:attribute-def:def:addressTypeDc2';

our $A_LOGIN; *A_LOGIN = \'urn:perun:user:attribute-def:def:login-namespace:vsup';
our $A_PHONE;  *A_PHONE = \'urn:perun:user:attribute-def:virt:preferredPhone';
our $A_BANK_ACCOUNT_DC2; *A_BANK_ACCOUNT_DC2 = \'urn:perun:user:attribute-def:def:bankAccount';
our $A_BANK_ACCOUNT_KOS; *A_BANK_ACCOUNT_KOS = \'urn:perun:user:attribute-def:def:bankAccountKos';

# users mail
our $A_VSUP_MAIL; *A_VSUP_MAIL= \'urn:perun:user:attribute-def:def:vsupMail';
our $A_VSUP_PREF_MAIL; *A_VSUP_PREF_MAIL= \'urn:perun:user:attribute-def:def:vsupPreferredMail';

# GATHER USERS
my $users;  # $users->{$uco}->{ATTR} = $attrValue;

#
# AGGREGATE DATA
#
# FOR EACH USER
foreach my $resourceId ($data->getResourceIds()) {

	my $relationType = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_R_RELATION_TYPE);

	# Must be in a relation
	unless ($relationType) {
		next;
	}

	foreach my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {

		my $key = $data->getUserAttributeValue(member => $memberId, attrName => $A_UCO);
		my $titleBefore = $data->getUserAttributeValue(member => $memberId, attrName => $A_TITLE_BEFORE);
		my $artisticFirstName = $data->getUserAttributeValue(member => $memberId, attrName => $A_ARTISTIC_FIRST_NAME);
		my $firstName = $data->getUserAttributeValue(member => $memberId, attrName => $A_FIRST_NAME);
		my $artisticLastName = $data->getUserAttributeValue(member => $memberId, attrName => $A_ARTISTIC_LAST_NAME);
		my $lastName = $data->getUserAttributeValue(member => $memberId, attrName => $A_LAST_NAME);
		my $titleAfter = $data->getUserAttributeValue(member => $memberId, attrName => $A_TITLE_AFTER);
		my $birthNumber = $data->getUserAttributeValue(member => $memberId, attrName => $A_BIRTH_NUMBER);
		my $gender = $data->getUserAttributeValue(member => $memberId, attrName => $A_GENDER);
		my $job = $data->getUserAttributeValue(member => $memberId, attrName => $A_JOB);
		my $prefMail = $data->getUserAttributeValue(member => $memberId, attrName => $A_VSUP_PREF_MAIL);
		my $vsupMail = $data->getUserAttributeValue(member => $memberId, attrName => $A_VSUP_MAIL);
		my $userLogin = $data->getUserAttributeValue(member => $memberId, attrName => $A_LOGIN);
		my $phone = $data->getUserAttributeValue(member => $memberId, attrName => $A_PHONE);

		$users->{$key}->{$A_TITLE_BEFORE} = $titleBefore || '';
		$users->{$key}->{$A_FIRST_NAME} = ($artisticFirstName || ($firstName || ''));
		$users->{$key}->{$A_LAST_NAME} = ($artisticLastName || ($lastName || ''));
		$users->{$key}->{$A_TITLE_AFTER} = $titleAfter || '';

		$users->{$key}->{$A_BIRTH_NUMBER} = $birthNumber || '';
		$users->{$key}->{$A_GENDER} = $gender || '';
		$users->{$key}->{$A_JOB} = $job || '';

		$users->{$key}->{'EMAIL'} = ($prefMail || ($vsupMail || $userLogin . '@vsup.cz'));
		$users->{$key}->{$A_PHONE} = $phone || '';

		if ($relationType eq "ZAM") {
			$users->{$key}->{'TYP_VTAHU'} = $relationType;
		} elsif ($relationType eq "STU") {
			unless ($users->{$key}->{'TYP_VTAHU'}) {
				$users->{$key}->{'TYP_VTAHU'} = $relationType;
			}
		} elsif ($relationType eq "Externista - pedagog") {
			unless ($users->{$key}->{'TYP_VTAHU'}) {
				$users->{$key}->{'TYP_VTAHU'} = $relationType;
			}
		}

		my $streetDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_STREET_DC2);
		my $streetKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_STREET_KOS);

		if (defined $streetDC2) {
			# has address from DC2
			my $houseNumberDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_HOUSE_NUMBER_DC2);
			my $townDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_TOWN_DC2);
			my $postalCodeDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_POSTAL_CODE_DC2);
			my $countryCodeDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_COUNTRY_CODE_DC2);
			my $typeDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_TYPE_DC2);

			$users->{$key}->{'STREET'} = $streetDC2;
			$users->{$key}->{'HOUSE_NUMBER'} = $houseNumberDC2 || '';
			$users->{$key}->{'TOWN'} = $townDC2 || '';
			$users->{$key}->{'POSTAL_CODE'} = $postalCodeDC2 || '';
			$users->{$key}->{'COUNTRY_CODE'} = $countryCodeDC2 || '';
			$users->{$key}->{'ADR_TYPE'} = $typeDC2 || '';
		} elsif (defined $streetKOS) {
			# has address from KOS
			my $houseNumberKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_HOUSE_NUMBER_KOS);
			my $townKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_TOWN_KOS);
			my $postalCodeKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_POSTAL_CODE_KOS);
			my $countryCodeKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_COUNTRY_CODE_KOS);
			my $typeKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_ADDRESS_TYPE_KOS);

			$users->{$key}->{'STREET'} = $streetKOS;
			$users->{$key}->{'HOUSE_NUMBER'} = $houseNumberKOS || '';
			$users->{$key}->{'TOWN'} = $townKOS || '';
			$users->{$key}->{'POSTAL_CODE'} = $postalCodeKOS || '';
			$users->{$key}->{'COUNTRY_CODE'} = $countryCodeKOS || '';
			$users->{$key}->{'ADR_TYPE'} = $typeKOS || '';
		} else {
			# don't have address
			$users->{$key}->{'STREET'} = '';
			$users->{$key}->{'HOUSE_NUMBER'} = '';
			$users->{$key}->{'TOWN'} = '';
			$users->{$key}->{'POSTAL_CODE'} = '';
			$users->{$key}->{'COUNTRY_CODE'} = '';
			$users->{$key}->{'ADR_TYPE'} = '';
		}

		my $bankAccountDC2 = $data->getUserAttributeValue(member => $memberId, attrName => $A_BANK_ACCOUNT_DC2);
		my $bankAccountKOS = $data->getUserAttributeValue(member => $memberId, attrName => $A_BANK_ACCOUNT_KOS);

		if ($bankAccountDC2) {
			$users->{$key}->{'BANK_ACCOUNT'} = $bankAccountDC2;
		} elsif ($bankAccountKOS) {
			$users->{$key}->{'BANK_ACCOUNT'} = $bankAccountKOS;
		} else {
			$users->{$key}->{'BANK_ACCOUNT'} = '';
		}

		# relation ID for "Externista - pedagog"
		$users->{$key}->{'USER_ID'} = $data->getUserIdForMember(member => $memberId);

	}

}

#
# PRINT user data LDIF
#
open FILE,">$fileName" or die "Cannot open $fileName: $! \n";
binmode FILE, ":utf8";

# FOR EACH USER ON FACILITY
my @keys = sort keys %{$users};
for my $key (@keys) {

	# print attributes, which are never empty
	print FILE $key . "\t" . $users->{$key}->{'TYP_VTAHU'} . "\t" . $users->{$key}->{$A_TITLE_BEFORE} . "\t" .
		$users->{$key}->{$A_FIRST_NAME} . "\t" . $users->{$key}->{$A_LAST_NAME} . "\t" .
		$users->{$key}->{$A_TITLE_AFTER} . "\t" . $users->{$key}->{$A_BIRTH_NUMBER} . "\t" .
		$users->{$key}->{$A_GENDER} . "\t" . $users->{$key}->{$A_JOB} . "\t" .
		$users->{$key}->{'STREET'} . ' ' . $users->{$key}->{'HOUSE_NUMBER'} . "\t" .
		$users->{$key}->{'TOWN'} . "\t" . $users->{$key}->{'POSTAL_CODE'} . "\t" .
		$users->{$key}->{'COUNTRY_CODE'} . "\t" . $users->{$key}->{'ADR_TYPE'} . "\t" .
		$users->{$key}->{'EMAIL'} . "\t" . $users->{$key}->{'BANK_ACCOUNT'} . "\t" .
		$users->{$key}->{$A_PHONE} . "\t" . $users->{$key}->{'USER_ID'} . "\n";

}

close(FILE);

perunServicesInit::finalize;
