#!/usr/bin/perl
use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;
use Text::Unidecode;
use POSIX qw/strftime/;

local $::SERVICE_NAME = "mailman_mu";
local $::PROTOCOL_VERSION = "3.1.0";
my $SCRIPT_VERSION = "3.2.1";

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

#Constants
our $A_USER_NAME;                            *A_USER_NAME =                            \'urn:perun:user:attribute-def:core:displayName';
our $A_USER_MAIL;                            *A_USER_MAIL =                            \'urn:perun:user:attribute-def:def:preferredMail';
our $A_USER_STATUS;                          *A_USER_STATUS =                          \'urn:perun:member:attribute-def:core:status';

our $A_RESOURCE_MAILING_LIST_NAME;           *A_RESOURCE_MAILING_LIST_NAME =           \'urn:perun:resource:attribute-def:def:mailingListName';
our $A_RESOURCE_MAILING_LIST_MANAGER_MAIL;   *A_RESOURCE_MAILING_LIST_MANAGER_MAIL =   \'urn:perun:resource:attribute-def:def:mailingListManagerMail';



my $mailinglistStruc = {};
my $mailinglistAdminMailStruc = {};


my $mailinglistsDirectory = "$DIRECTORY/mailinglists";
mkdir $mailinglistsDirectory or die "Can't mkdir $mailinglistsDirectory: $!";


foreach my $resourceId ($data->getResourceIds()) {

	my $listNameAttribute = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_RESOURCE_MAILING_LIST_NAME);
	my $listManagerNameAttribute = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_RESOURCE_MAILING_LIST_MANAGER_MAIL);

	my $listName = "$listNameAttribute";
	my $adminMail = "$listManagerNameAttribute";

	# Store the admin's mail
	$mailinglistAdminMailStruc->{$listName} = $adminMail;

	# store empty mailing list
	$mailinglistStruc->{$listName} = ();

	# fill mailing list
	foreach my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {

		my $memberStatus = $data->getMemberAttributeValue(member => $memberId, attrName => $A_USER_STATUS);
		my $userMail = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_MAIL);
		my $userName = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_NAME);

		#list only VALID members except if allowNonvalidUsers is true
		next unless($memberStatus eq "VALID");

		$mailinglistStruc->{$listName}->{$userMail}->{$A_USER_NAME} = $userName;
	}
}


for my $listName (keys %$mailinglistStruc) {
	my $fileName = "$mailinglistsDirectory/$listName";
	open FILE,">$fileName" or die "Cannot open $fileName: $! \n";

	# As a first line, print header
	print FILE "#MANAGERS_MAIL=", $mailinglistAdminMailStruc->{$listName},"\n";

	for my $mail (sort keys %{$mailinglistStruc->{$listName}}) {
		print FILE "\"", unidecode($mailinglistStruc->{$listName}->{$mail}->{$A_USER_NAME});
		print FILE "\" <", $mail, ">\n";
	}

	close FILE or die $!;
}

perunServicesInit::finalize;
