use utf8;
use warnings; no warnings "redefine";
use strict;

use Dbase::Globals qw(get_descr get_gruppen name_kunde puny_decode test_gruppe);
use Dbase::Help qw(DoSelect in_list qquote);
use Fehler qw(problem warnung);
use Loader qw(line_printer);
use noris::Table;

my ( $is_to_domain_grs, $is_to_domain_grc ) =
  get_gruppen( mailrules_ident => 'to_domain', 1 );

my ( $is_to_freetext_grs, $is_to_freetext_grc ) =
  get_gruppen( mailrules_ident => 'to_freetext', 1 );

sub list_mailrules($;$) {
	my ( $kunde_id, $match ) = @_;
	line_printer;

	( my $t = noris::Table->new )->titel(
		{ name => "K-Nr.",         format => '%5s' },
		{ name => "Kundenname",    format => '%16s' },
		{ name => "Quelladresse",  format => '%-39s' },
		{ name => "Typ",           format => '%15s' },
		{ name => "Ziele",         format => '%s' },
	);
	if ($kunde_id) {
		$t->skip(1);
		$t->skip(2);
	}
	$t->ausrichten( right => 4 );

	my $where = '';
	{

		# Trennung von Variablen-Deklaration und bedingter
		# Initialisierung wichtig, vgl. RT#244828
		my @where;
		push @where, "kunde = $kunde_id" if $kunde_id;

		if ( defined $match ) {

			if ( ref $match ) {
				push @where, in_list( 'mailrules.id', '', @$match );
			}
			else {
				my $matchtype;

				# Trennung von Variablen-Deklaration und bedingter
				# Initialisierung wichtig, vgl. RT#244828
				$matchtype = $1 if $match =~ s/^([<>])//;
				warnung <<'_' if $match =~ /[^-0-9a-z%+.=\@_]/i;
Das Suchen nach IDNs wird (noch) nicht unterstützt,
bzw. muss ggf. die Punycode-Repräsentation angegeben werden.
_
				my $qqmatch = qquote($match);
				push @where,
				  defined $matchtype
				  ? ( $matchtype eq '<' ? 'quelle' : 'ziel' ) . " LIKE $qqmatch"
				  : "( quelle LIKE $qqmatch OR ziel LIKE $qqmatch )";
			}
		}
		$where = 'WHERE ' . ( join ' AND ', @where ) . "\n" if @where;
	}

	my $name_kunde;
	DoSelect {
			my ( $quelle, $typ, $ziel, $kunde ) = @_;
			my $ptyp;
			$ptyp = get_descr(mailrules => $typ) if defined $typ;
			$ptyp = "??" unless defined $ptyp;

			my $is_freetext_target = test_gruppe(
				mailrules => $typ,
				$is_to_freetext_grs, $is_to_freetext_grc
			);
			$quelle = defined $quelle ? puny_decode( $quelle, 4 ) : '*';

			unless ( defined $ziel ) { $ziel = '' }
			elsif ( !$is_freetext_target ) { $ziel = puny_decode( $ziel, 4 ) }

			if ( !length $ziel ) { $ziel = '-' }
			elsif (
				test_gruppe(
					mailrules => $typ,
					$is_to_domain_grs, $is_to_domain_grc
				)
			  )
			{
				$ziel = join ',', map "\@$_", split /,/, $ziel;
			}
			$name_kunde = name_kunde($kunde);
			$name_kunde = '' unless $name_kunde;

			for (
				test_gruppe(
					mailrules => $typ,
					$is_to_freetext_grs, $is_to_freetext_grc
				) ? $ziel : $ziel =~ /\G([^,]+(?:,|\z))/g
			  )
			{
				$t->daten($kunde, $name_kunde, $quelle, $ptyp, $_);
				$quelle = $typ = '';
				$ptyp = "";
			}
	}
		  "\tSELECT quelle, typ, ziel"
		  . ( !$kunde_id && ', kunde' )
		  . " FROM mailrules $where"
		  . <<'_' or print "(leer)\n";
	ORDER BY quelle IS NULL,
	         SUBSTRING_INDEX(quelle, '@', -1),
	         IF( INSTR(quelle, '@'), 0, 1 ),
	         quelle
_

		# *-Regeln als Letztes anzeigen,
		# ansonsten Sortierung primär nach Domain,
		# dabei user-spezifische Regeln zuerst,
		# sekundär nach Username
	$t->drucken();

	1;
}

1;
