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

use Dbase::Globals qw(content get_gruppen get_descr name_kunde puny_encode test_gruppe);
use Dbase::Help qw(Do DoFn qquote);
use Fehler qw(problem);
use Loader qw(check_mailrule line_in log_update select_descr);

my ( $target_irrelevant_grs, $target_irrelevant_grc ) =
  get_gruppen( mailrules_ident => 'target_irrelevant', 1 );

my ( $to_freetext_grs, $to_freetext_grc ) =
  get_gruppen( mailrules_ident => 'to_freetext', 1 );

sub set_mailrule($;$) {
	my ( $id, $kn ) = @_;

	content( my $quelle = line_in('Quelladresse: ') ) or return;

	my ( $id_mailrule, $alter_typ, $altes_ziel );

	if ( $quelle eq '*' ) {
		undef $quelle;
		( $id_mailrule, $alter_typ, $altes_ziel ) = DoFn(<<_);
	SELECT id, typ, ziel
	FROM   mailrules
	WHERE  kunde = $id AND quelle IS NULL
_
	}
	else {
		( $id_mailrule, $alter_typ, $altes_ziel, my $id_kunde ) = DoFn(<<_);
	SELECT id, typ, ziel, kunde
	FROM   mailrules
	WHERE  quelle = ${\ qquote(puny_encode($quelle,4)) }
_
		return problem( "Diese Regel gehört zu Kunde #$id_kunde"
			  . name_kunde($id_kunde)
			  . '.' )
		  if defined $id_kunde && $id_kunde != $id;
	}
	return problem('Für diese Adresse gibt es gar keine Regel.')
	  unless defined $id_mailrule;

	defined( my $alter_typ_name = get_descr( mailrules => $alter_typ ) )
	  or return problem("Unbekannter Mailregel-Typ #$alter_typ!");

	defined(
		my $neuer_typ = select_descr(
			mailrules => 128 | 1024,
			'', 'Typ', '!hide', $alter_typ_name
		)
	  )
	  or return;

	my $neues_ziel;
	unless (
		test_gruppe(
			mailrules => $neuer_typ,
			$target_irrelevant_grs, $target_irrelevant_grc
		)
	  )
	{
		$neues_ziel = line_in( 'Zieladresse: ', undef, undef, $altes_ziel )
		  or return;
		$neues_ziel = join ',', map puny_encode( $_, 4 ), split /\s*,\s*/,
		  $neues_ziel
		  unless test_gruppe(
			mailrules => $neuer_typ,
			$to_freetext_grs, $to_freetext_grc
		  );
	}

	return problem('Wolltest Du nicht was ändern?!')
	  if $neuer_typ == $alter_typ
	  and $neues_ziel eq $altes_ziel;

	check_mailrule( $quelle, $neuer_typ, $neues_ziel ) or return;

	log_update(
		mailrules =>
		  kunde   => $id,
		undef,
		qw(quelle typ ziel),
		undef,
		defined $quelle ? $quelle : '*', $alter_typ_name, $altes_ziel
	);
	Do(<<_);
	UPDATE mailrules
	SET    typ=$neuer_typ, ziel=${\qquote($neues_ziel)}
	WHERE  id = $id_mailrule
_
}

1;
