#!/usr/bin/perl

use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;
use Data::Dumper;

local $::SERVICE_NAME = "o365_mail_forward_export";
local $::PROTOCOL_VERSION = "3.0.0";
my $SCRIPT_VERSION = "3.0.2";

perunServicesInit::init;
my $DIRECTORY = perunServicesInit::getDirectory;
my $data = perunServicesInit::getHashedHierarchicalData;

#Constants
our $A_USER_O365_EMAIL_ADDRESSES_MU;       *A_USER_O365_EMAIL_ADDRESSES_MU =       \'urn:perun:user:attribute-def:def:o365EmailAddresses:mu';
our $A_USER_FACILITY_LOGIN;                *A_USER_FACILITY_LOGIN =                \'urn:perun:user_facility:attribute-def:virt:login';
our $A_USER_FACILITY_MAIL_FORWARD;         *A_USER_FACILITY_MAIL_FORWARD =         \'urn:perun:user_facility:attribute-def:def:o365MailForward';
our $A_USER_FACILITY_DISABLE_MAIL_FORWARD; *A_USER_FACILITY_DISABLE_MAIL_FORWARD = \'urn:perun:user_facility:attribute-def:def:disableO365MailForward';
our $A_USER_FACILITY_STORE_AND_FORWARD;    *A_USER_FACILITY_STORE_AND_FORWARD =    \'urn:perun:user_facility:attribute-def:def:o365MailStoreAndForward';
our $A_FACILITY_FORWARD_EXPORT_DOMAINS;    *A_FACILITY_FORWARD_EXPORT_DOMAINS =    \'urn:perun:facility:attribute-def:def:o365MailForwardExportDomains';

our $DEFAULT_FORWARDING_DOMAIN = '@mo.muni.cz';
our $userStruc = {};

my %allowedForwardDomains = map { $_ => 1 } @{$data->getFacilityAttributeValue( attrName => $A_FACILITY_FORWARD_EXPORT_DOMAINS )};

foreach my $memberId ($data->getMemberIdsForFacility()) {

	#skip this user if disabled forward is set to true
	next if $data->getUserFacilityAttributeValue( member => $memberId, attrName => $A_USER_FACILITY_DISABLE_MAIL_FORWARD );
	#skip this user if store and forward is set to true
	next if $data->getUserFacilityAttributeValue( member => $memberId, attrName => $A_USER_FACILITY_STORE_AND_FORWARD );

	#login in MU is UCO
	my $login = $data->getUserFacilityAttributeValue( member => $memberId, attrName => $A_USER_FACILITY_LOGIN );

	#mailForward is unique for the same login, don't need to be loaded more than once
	unless ($userStruc->{$login}) {
		my $mailForward = $data->getUserFacilityAttributeValue( member => $memberId, attrName => $A_USER_FACILITY_MAIL_FORWARD ) || $login . $DEFAULT_FORWARDING_DOMAIN;
		$userStruc->{$login}->{$A_USER_FACILITY_MAIL_FORWARD} = $mailForward;
	}

	#user email addresses
	my $userEmailAddresses = $data->getUserAttributeValue( member => $memberId, attrName => $A_USER_O365_EMAIL_ADDRESSES_MU );
	if (defined $userEmailAddresses) {
		#filter only allowed email addresses
		foreach my $mail (@{$userEmailAddresses}) {
			my $domainOfEmail = $mail;
			$domainOfEmail =~ s/^.*@//;
			#this email is in allowed domain, add it
			if($allowedForwardDomains{$domainOfEmail}) {
				$userStruc->{$login}->{$A_USER_O365_EMAIL_ADDRESSES_MU}->{$mail} = 1;
			}
		}
	}
}

my $fileName = "$DIRECTORY/$::SERVICE_NAME";
open FILE,">$fileName" or die "Cannot open $fileName: $! \n";

#	$email $forward
foreach my $login (sort keys %$userStruc) {
	next unless $userStruc->{$login}->{$A_USER_O365_EMAIL_ADDRESSES_MU};
	my $mailForward = $userStruc->{$login}->{$A_USER_FACILITY_MAIL_FORWARD};
	foreach my $email (sort keys %{$userStruc->{$login}->{$A_USER_O365_EMAIL_ADDRESSES_MU}}) {
		print FILE $email, " ", $mailForward, "\n";
	}
}

close (FILE);
perunServicesInit::finalize;
