use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(line_in line_printer);
use Dbase::Globals qw(
  find_descr
  get_descr
  get_gruppen
  persinfo
  test_gruppe
  test_gruppen
);
use Dbase::Help qw(DoFn DoSelect in_list);
use Fehler qw(hat_problem problem warnung);

my $rolle_standort = find_descr( dienst => standort => 1 );

sub list_personen($;$$$$);
sub list_personen($;$$$$) {
# Diese Funktion soll gelegentlich ganz neu implementiert werden.
# Erstmal machen wir das aber nur für "l", was wir daran erkennen,
# dass sie (nur) in diesem Fall mit einem Argument aufgerufen wird.
	if ( @_ == 1 ) {
		my ($kunde_id) = @_;

		line_printer();

		my ( $adr, $billc, $adminc ) = DoFn(<<_);
	SELECT hauptperson, billc, adminc FROM kunde WHERE id = $kunde_id
_
		return problem('Keine Hauptperson gefunden!')
			unless $adr;

		my %excl = ( $adr => 1 );
		print $Db::pr_fh <<'_', persinfo($adr), "\n";
    ID Firma/Adresse
_
		if($billc) {
			++$excl{$billc};
			print $Db::pr_fh <<'_', persinfo($billc), "\n";

    ID Rechnungsempfänger
_
		}
		if($adminc) {
			++$excl{$adminc};
			print $Db::pr_fh <<'_', persinfo($adminc), "\n";

    ID Standard-Admin-C für Domains
_
		}
		{
			my $ausgegeben;
			DoSelect {
				print $Db::pr_fh <<_ unless $ausgegeben++;

    ID Person(en)
_
				print $Db::pr_fh persinfo(shift) . "\n";
			} <<_
		SELECT   DISTINCT person.id
		FROM     kundemail, person
		WHERE    kundemail.kunde = $kunde_id
			AND kundemail.person = person.id
			AND SUBSTRING_INDEX(person.name, ' ', 1) IN ('Frau','Herr')
			AND ${\ in_list( 'person.id' => NOT => keys %excl ) }
		ORDER BY SUBSTRING_INDEX(person.name, ' ', -1),
				SUBSTRING(person.name, 6),
				person.user,
				person.id
_
		}
		{
			my $ausgegeben;
			DoSelect {
				my ($person_id) = @_;
				print $Db::pr_fh <<_ unless $ausgegeben++;

    ID Standort(e)
_
				print $Db::pr_fh persinfo($person_id) . "\n";
				++$excl{$person_id};
			} <<_
	SELECT   DISTINCT person.id
	FROM     kundemail, person
	WHERE    kundemail.kunde  = $kunde_id
	     AND kundemail.person = person.id
	     AND kundemail.dienst = $rolle_standort
	ORDER BY IF( SUBSTRING_INDEX(person.name, ' ', 1) IN ('Frau','Herr'),
	             SUBSTRING_INDEX(person.name, ' ', -1),
	             person.name ),
	         IF( SUBSTRING_INDEX(person.name, ' ', 1) IN ('Frau','Herr'),
	             SUBSTRING(person.name, 6),
	             person.name ),
	         person.user,
	         person.id
_
		}
		{
			my $ausgegeben;
			DoSelect {
				print $Db::pr_fh <<_ unless $ausgegeben++;

    ID Sonstiges
_
				print $Db::pr_fh persinfo(shift) . "\n";
			} <<_
		SELECT   DISTINCT person.id
		FROM     kundemail, person
		WHERE    kundemail.kunde = $kunde_id
			AND kundemail.person = person.id
			AND ( person.name IS NULL
			    OR SUBSTRING_INDEX(person.name, ' ', 1) NOT IN ('Frau','Herr') )
			AND ${\ in_list( 'person.id' => NOT => keys %excl ) }
		ORDER BY person.name, person.user, person.id
_
		}
		return;
	}
	my($id,$kn,$flag,$fl,$fld) = @_;
	$flag ||= 0;

	# Flag: 0: alles
	#      -3: alle nichtassoziierten Einträge
	#      -4: alle Einträge
	# $fl : Einschränkungen Personenflags (String)
	# $fld: Einschränkungen Dienst (Dienstnr.)

	my $hdr;
	line_printer;

	my ($grs,$grc) = get_gruppen("dienst_ident","domain");
	my ($fls,$flc) = get_gruppen("pwdomain",$fl,1);
	return if hat_problem();
	my $num;
	my %seen;
	my $res;

	if($id >= 0) {
		$num=0;
		$res = DoSelect {
			my($pfl,$dringend,$dienst,$persid);
			if($flag <= -3) {
				($pfl,$persid) = @_;
			} else {
				($pfl,$dringend,$dienst,$persid) = @_;
 				return if defined $fld and $fld != $dienst;
			}
			return if not test_gruppen($pfl,$fls,$flc);
			if($flag > 0) {
				return unless test_gruppe("dienst",$dienst,$grs,$grc);
			}
			if($flag <= -3) {
				$dringend = "?";
				$dienst = "?";
			} else {
				$dienst = get_descr ("dienst",$dienst);
			}
			print $Db::pr_fh <<END unless $hdr++;
Dienst          Pr Person Adresse
=================================
END

			goto out unless
			printf $Db::pr_fh "%-15s%3s %s\n", $dienst, $dringend, persinfo($persid);
			$num++ unless $seen{$persid}++;
		}
			($flag==-4)?
				"select person.pwuse,person.id from person where kunde = $id order by name,id":
			($flag==-3)?
				"select person.pwuse,person.id from person
				      left join kundemail
					         on kundemail.person = person.id and kundemail.kunde = $id
						  where person.kunde = $id and kundemail.person is null":
				"select person.pwuse,kundemail.dringend,kundemail.dienst,person.id
							from kundemail,person
						   where kundemail.kunde = $id
							 and person.id = kundemail.person ".
							(($flag > 0)?"and kundemail.dringend = $flag":"").
							<<'_'
	ORDER BY kundemail.dienst,
	         kundemail.dringend,
	         SUBSTRING_INDEX(person.name, ' ', -1),
	         SUBSTRING(person.name, 6),
	         person.user,
	         person.id
_
		and do { print "(keine passenden Einträge)\n" unless $hdr; }
		or print "(leer)\n";

		if ( $flag == 0 and my $anzahl = DoFn(<<_) ) {
	SELECT    COUNT( DISTINCT person.id )
	FROM      person
	LEFT JOIN kundemail ON kundemail.person = person.id AND kundemail.kunde = $id
	WHERE     person.kunde = $id AND kundemail.person IS NULL
_
			warnung( "Bei diesem Kunden gibt es noch $anzahl nicht assoziierte Person"
			         . ( $anzahl != 1 && 'en' )
			         . qq(.\nDu möchtest ggf. "L" verwenden, um die, oder "LL", um alle zu sehen.) );
		}
	} else {
		$res = DoSelect {
			my($kid,$knm) = @_;
			print "* Kunde #$kid: $knm\n";
			$res += list_personen($kid,$kn,$flag,$fl,$fld);
			print "\n";
		} "select id,name from kunde";
	}
out:	
	$res;
}

1;
