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

local $::SERVICE_NAME = "vsup_tritius";
local $::PROTOCOL_VERSION = "3.1.0";
my $SCRIPT_VERSION = "3.0.3";

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

#Constants
our $A_LOGIN; *A_LOGIN = \'urn:perun:user_facility:attribute-def:virt:login';
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_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_TITLE_AFTER;  *A_TITLE_AFTER = \'urn:perun:user:attribute-def:core:titleAfter';
our $A_BIRTH_NUMBER;  *A_BIRTH_NUMBER = \'urn:perun:user:attribute-def:def:birthNumber';
our $A_GENDER;  *A_GENDER = \'urn:perun:user:attribute-def:def:gender';
our $A_PHONE;  *A_PHONE = \'urn:perun:user:attribute-def:virt:preferredPhone';
our $A_CARD_BARCODES;  *A_CARD_BARCODES = \'urn:perun:user:attribute-def:def:cardBarCodes';
our $A_CARD_CHIP_NUMBERS;  *A_CARD_CHIP_NUMBERS = \'urn:perun:user:attribute-def:def:cardCodes';
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';
# 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';
# relation
our $A_R_RELATION_TYPE; *A_R_RELATION_TYPE = \'urn:perun:resource:attribute-def:def:relationType';

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

	# Users from Resource must be in a relation
	unless ($relationType) {
		next;
	}

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

		my $uco  = $data->getUserAttributeValue(member => $memberId, attrName => $A_UCO);
		my $login  = $data->getUserFacilityAttributeValue( member => $memberId, attrName => $A_LOGIN);
		my $prefMail = $data->getUserAttributeValue(member => $memberId, attrName => $A_VSUP_PREF_MAIL);
		my $vsupMail = $data->getUserAttributeValue(member => $memberId, attrName => $A_VSUP_MAIL);
		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 $phone = $data->getUserAttributeValue(member => $memberId, attrName => $A_PHONE);
		my $gender = $data->getUserAttributeValue(member => $memberId, attrName => $A_GENDER);
		my $birthNumber = $data->getUserAttributeValue(member => $memberId, attrName => $A_BIRTH_NUMBER);
		my $cardBarCodes = $data->getUserAttributeValue(member => $memberId, attrName => $A_CARD_BARCODES);
		my $cardChipNumbers = $data->getUserAttributeValue(member => $memberId, attrName => $A_CARD_CHIP_NUMBERS);

		$users->{$uco}->{$A_LOGIN} = $login;
		$users->{$uco}->{$A_VSUP_MAIL} = ($prefMail || ($vsupMail || $login . '@vsup.cz'));
		$users->{$uco}->{$A_TITLE_BEFORE} = $titleBefore || '';
		$users->{$uco}->{$A_FIRST_NAME} = ($artisticFirstName || ($firstName || ''));
		$users->{$uco}->{$A_LAST_NAME} = ($artisticLastName || ($lastName || ''));
		$users->{$uco}->{$A_TITLE_AFTER} = $titleAfter || '';
		$users->{$uco}->{$A_PHONE} = $phone || '';
		$users->{$uco}->{$A_GENDER} = $gender || '';
		$users->{$uco}->{$A_BIRTH_NUMBER} = $birthNumber || '';

		if ($relationType eq "ZAM") {
			# prefer ZAM over anything
			$users->{$uco}->{'TYPE'} = $relationType;
		} elsif ($relationType eq "STU") {
			# set STU if not ZAM
			if (!defined $users->{$uco}->{'TYPE'} || $users->{$uco}->{'TYPE'} ne 'ZAM') {
				$users->{$uco}->{'TYPE'} = $relationType;
			}
		}

		# if multiple, send only first one
		if (defined $cardBarCodes) {
			$users->{$uco}->{$A_CARD_BARCODES} = $cardBarCodes->[0];
		}
		else {
			$users->{$uco}->{$A_CARD_BARCODES} = '';
		}
		if (defined $cardChipNumbers) {
			$users->{$uco}->{$A_CARD_CHIP_NUMBERS} = $cardChipNumbers->[0];
		}
		else {
			$users->{$uco}->{$A_CARD_CHIP_NUMBERS} = '';
		}

		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);

			$users->{$uco}->{'STREET'} = $streetDC2;
			$users->{$uco}->{'HOUSE_NUMBER'} = $houseNumberDC2 ? $houseNumberDC2 : '';
			$users->{$uco}->{'TOWN'} = $townDC2 || '';
			$users->{$uco}->{'POSTAL_CODE'} = $postalCodeDC2 || '';
		}
		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);

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

	}
}

#
# 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 $uco (@keys) {

	# print attributes, which are never empty
	print FILE $uco . "\t" . $users->{$uco}->{$A_LOGIN} . "\t" . $users->{$uco}->{'TYPE'} . "\t" . $users->{$uco}->{$A_VSUP_MAIL}
		. "\t" . $users->{$uco}->{$A_FIRST_NAME} . "\t" . $users->{$uco}->{$A_LAST_NAME} . "\t" . $users->{$uco}->{$A_TITLE_BEFORE}
		. "\t" . $users->{$uco}->{$A_TITLE_AFTER} . "\t" . $users->{$uco}->{$A_BIRTH_NUMBER} . "\t" . $users->{$uco}->{$A_GENDER}
		. "\t" . $users->{$uco}->{$A_PHONE} . "\t" . $users->{$uco}->{$A_CARD_BARCODES} . "\t" . $users->{$uco}->{$A_CARD_CHIP_NUMBERS}
		. "\t" . $users->{$uco}->{'STREET'} . "\t" . $users->{$uco}->{HOUSE_NUMBER} . "\t" . $users->{$uco}->{'TOWN'}
		. "\t" . $users->{$uco}->{'POSTAL_CODE'} . "\n";

}

close(FILE);

perunServicesInit::finalize;
