use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(
	add_kunde_person
	add_person
	delete_kunde_person
	edit_person
	line_in
	line_printer
	list_personen
	log_view
	personenliste
	pruefe_kunde_personen
	set_kunde_ansprechpartner
	valid_kunde
  );
use Fehler qw(hat_problem problem report_fehler warnung);
use Dbase::Globals qw(find_descr get_kunde get_person mpersinfo name_kunde
	content);
use Dbase::Help qw(DoFn DoSelect qquote);

# flag: 1: Person zurückliefern
#       4: '-' erlauben
#       8: '*' erlauben
#      16: '*KUNDE' erlauben
#      32: 'MailArt:id' erlauben
#      64: '=id' erlauben (zählt)
#     128: 'n' erlauben (nicht-assoziiert)

my %suche = (
	f  => 'fax',
	g  => 'pager',
	n  => 'name',
	nr => 'fon|fax|pager|isdn',
	p  => 'fon',
	t  => 'fon',
	un => 'isdn',
);

sub edit_personen($;$$$$$) {
	my($id,$flag,$kn,$htext,$pinfo,$template) = @_;

	return unless valid_kunde($id,1);

	$kn = "Kunde $id:" .name_kunde($id) if not defined $kn or $kn eq "";
	$pinfo = "Person" if not defined $pinfo or $pinfo eq "";

	while(1) {
		content( my $act = line_in "$kn $pinfo >",($flag&1)?0:4, undef, $template ) or last;
		if($act eq "?") {
			print <<'END';
l   alle assoziierten Personen sortiert ohne Art(en) der Assoziierung anzeigen
la  alle assoziierten Personen inkl. Art(en) der Assoziierung anzeigen
LL  alle Personen sortiert anzeigen
L   nur nicht assoziierte Personen anzeigen

LL:Flag    Personen mit diesem Flag anzeigen
la.Dienst  über diesen Dienst zugeordnete Personen

n?...  Suche nach Personen, in deren Namen ... vorkommt
nr?... Suche nach Personen, der irgendeine Rufnummer zugeordnet ist,
       in der ... vorkommt
f?...  Suche nach Personen mit Faxnummer, in der ... vorkommt
g?...  Suche nach Personen mit Pager-Nummer, in der ... vorkommt
p?...  Suche nach Personen mit Telefonnummer, in der ... vorkommt
t?...  dito
un?... Suche nach Personen mit ISDN-Rufnummer, in der ... vorkommt

END
			print <<'END';
n       Person neu anlegen (ohne Assoziierung)
END
			print <<'END' unless $flag & 1;
aa      Person anlegen und assoziieren oder bestehende Person assoziieren
d       eine Assoziierung löschen

hp      Hauptperson des Kunden          va  vertrieblicher Ansprechpartner
bi      Rechnungsanschrift              ta  technischer Ansprechpartner
ad      AdminC (für Domains)

END
			print <<'END' if $flag & 8;
*       alle
END
			print <<'END' if $flag & 16;
*KUNDE  alle eines Kunden
END
			if ($flag & 1) {
				print <<'END';
###     wähle Person Nr. ## aus
?###    editiere Person Nr. ##

END
			} else {
				print <<'END';
###     editiere Person Nr. ##

END
			}
			print <<END if $flag & 4;
-       alle Personen
END
			next;
		}
		if($act eq "-") {
			return $act if $flag & 4;
			print "???\n";
			next;
		}
		if($act eq "H") { log_view($kn,"kundemail","kunde",$id); next; }
		if($act eq "%") {
			pruefe_kunde_personen($id);
			next;
		}
		if($act eq "%%") {
			pruefe_kunde_personen($id,1);
			next;
		}
		if($act eq "*") {
			return $act if $flag & 8;
			print "???\n";
			next;
		}
		if($act =~ s/^\*//) {
			return "*$act" if $flag & 16 and ($act = get_kunde $act);
			print "???\n";
			next;
		}
		if($flag & 32 and $act =~ s/(.+)://) {
			my $dd = find_descr("mailart",$1);
			return "$dd:$act" if $dd;
			print "Modus '$1' unbekannt.\n";
			next;
		}
		if($act eq "n") {
			my $pers = add_person($id,$kn);
			return $pers if $flag & (1|128);
			next;
		}

		if($flag & 64 and $act =~ s/^=//) {
			my $dd = find_descr("pwdomain",$act);
			unless($dd) {
				warn "'Flag '$act' unbekannt!\n";
				next;
			}
			print DoFn("select count(*) from person where kunde = $id and pwuse & $flag"),"\n";

			next;
		}
		if($act eq "a") {
			print <<_;
Ätsch, das haben wir im Rahmen von RT#256089 geändert! :-P
Falls Du nur einen Account anlegen möchtest, bei dem uns die Person letztlich
nicht wirklich interessiert, verwende bitte "n"! Der Eintrag wird dann nicht
assoziiert und nur mit "L" und "LL" sichtbar sein.
Falls Du hingegen eine Person anlegen möchtest, die uns wirklich (z. B. als
Ansprechpartner) interessiert und daher auch bei "l" angezeigt werden soll,
verwende bitte "aa"!
_
			next;
		}
		if($act eq "aa" or $act eq "A") {
			my $ret = add_kunde_person($id,$kn);
			return $ret if $flag & 1 and $ret > 0;
			next;
		}
		if($act eq "d") { delete_kunde_person($id,$kn); next; }

		if ( $act eq 'l' ) { list_personen($id); next; }

		my($fd,$fl); # $fd: dienstnr; $fl:Personenflags
		if ( $act =~ s/^(l[-al]):(.+)/$1/i ) {
			$fl = $2;
		}
		elsif ( $act =~ s/^(l[-al])\.(.+)/$1/ ) {
			$fd = find_descr( dienst => $2 );
			unless(defined $fd) {
				problem "Der Dienst '$2' existiert nicht.";
				next;
			}
		}
		if($act eq 'la') { list_personen($id,$kn, 0,$fl,$fd); next; }
		if($act eq "L")  { list_personen($id,$kn,-3,$fl,$fd); next; }
		if($act eq "LL") { list_personen($id,$kn,-4,$fl,$fd); next; }

		if ( $act =~ s/^(${\ join '|', keys %suche })\?\s*(?=\S)//o ) {
			$act = "%$act" unless $act =~ /^%/;
			$act .= '%'    unless $act =~ /%\z/;
			$act = qquote($act);
			my $suche = "( " . join(" LIKE $act OR ",split(/\|/,$suche{$1})) . " LIKE $act )";
			my @pers;
			DoSelect { push @pers, \@_ } <<_;
	SELECT   DISTINCT id, kunde
	FROM     person
	WHERE    $suche
	ORDER BY IF( kunde = $id, 0, 1 ), kunde, id
_
			unless (@pers) {
				print "Keine passende Person gefunden.\n";
				next;
			}
			elsif ( @pers == 1 ) {
				edit_person $pers[0][0], $id, $kn;
			}
			else {
				line_printer;
				no warnings 'once';
				print $Db::pr_fh <<_, personenliste(@pers);

Es wurden mehrere einschlägige Personen gefunden:

_
			}
			next;
		}

		# der Einfachheit halber hier auch, vgl. RT#376076:
		if ( $act eq 'hp' ) { set_kunde_ansprechpartner( 'Kundenname etc',           $id, 'hauptperson'    ); next; }
		if ( $act eq 'bi' ) { set_kunde_ansprechpartner( 'Rechnungsanschrift',       $id, 'billc'          ); next; }
		if ( $act eq 'ad' ) { set_kunde_ansprechpartner( 'Admin-C',                  $id, 'adminc'         ); next; }
		if ( $act eq 'ta' ) { set_kunde_ansprechpartner( 'Ansprechpartner Technik',  $id, 'ap_technik',  1 ); next; }
		if ( $act eq 'va' ) { set_kunde_ansprechpartner( 'Ansprechpartner Vertrieb', $id, 'ap_vertrieb', 1 ); next; }

		# editiere Person?
		my $force = $act =~ s/^\?//;
		if ( my $pers = get_person($act,undef,undef,$id) ) {
			return $pers if $flag & 1 and not $force;
			edit_person($pers,$id,$kn);
		}
		elsif ( !hat_problem() ) {
			problem("Person '$act' unbekannt.")
		}
		next; fehler: report_fehler(4);
	}
	undef;
}

1;
