
=head1 acct_postfach

ermittelt den Speicherverbrauch eines POP3-Postfachs

=head2 Argumente

=over 4

=item $person_id

Personen-ID des abzufragenden Postfachs

=back

=head2 Ergebnisse

Normalerweise werden drei Werte zurückgeliefert:

=over 4

=item 1.

die Anzahl der Nachrichten

=item 2.

die Summe der Größe der Nachrichten in Octets

=item 3.

die von L<Net::POP3-E<gt>list> gelieferte Hash-Referenz

=back

Im Fehlerfall wird ein L<Problem|Fehler/problem> zurückgegeben.

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Cf qw($POSTFACHSERVER);
use Dbase::Globals qw(bignum content find_descr);
use Dbase::Help qw(DoFn);
use Fehler qw(problem warnung);
use List::Util qw(sum);
use Tie::IxHash ();

sub acct_postfach($;&) {
	my ($person_id, $cb_func) = @_;
	return problem qq("$person_id" ist keine gültige Personen-ID.)
	  unless $person_id =~ /^\d+\z/;
	defined( my $flag_mail = find_descr pwdomain => 'mail' )
	  or return problem qq(Finde kein Personen-Flag namens "mail".);
	my ( $username, $passwort, $person_pwuse ) = DoFn(<<_)
	SELECT LOWER(user), pass, pwuse FROM person WHERE id = $person_id
_
	  or return problem "Kann Person #$person_id nicht finden.";
	return problem
	  'Diese Person hat keinen Usernamen und somit auch kein Postfach.'
	  unless content($username);
	return problem
	  'Diese Person hat kein Passwort und somit auch kein Postfach.'
	  unless content($passwort);
	return problem
	  'Diese Person hat kein mail-Flag und somit auch kein Postfach.'
	  unless $person_pwuse & bignum(1) << $flag_mail;

	require Net::IMAP::Simple::SSL;
	my $imap;
	{
		no warnings 'once';
		$imap = Net::IMAP::Simple::SSL->new($POSTFACHSERVER)
		  or return problem( 'Kann keine IMAP-Verbindung zu '
			  . "$POSTFACHSERVER herstellen: $Net::IMAP::Simple::errstr" );
	}

	$imap->login( $username, $passwort )
		or return problem "Kann mich als $username nicht einloggen: " . $imap->errstr . "\n";

	tie my %folders, 'Tie::IxHash';
	my $size = 0;
	my $messages = 0;

	foreach my $folder ( $imap->mailboxes() ) {
		my ( $folder_messages, $folder_size ) = ( 0, 0 );
		if ($cb_func) {
			$cb_func->($folder);
		}
		$folder_messages = $imap->messages($folder) || 0;

		if ($folder_messages) {
			$messages += $folder_messages;

			foreach my $msg ( 1 .. $folder_messages ) {
				$folder_size += $imap->list($msg)
				  or return problem 
				  "Fehler bei der Abfrage der Nachrichten für den Ordner $folder :" . $imap->errstr;
			}
			$size += $folder_size;

			$folders{$folder} = {
				'size'     => $folder_size,
				'messages' => $folder_messages,
			};
		}
	}
	$imap->quit
		or warnung 'Fehler beim Schließen der IMAP-Session';

	$messages, $size, \%folders;
}

1;
