use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(content get_person name_kunde unterkunden);
use Dbase::Help qw(DoFn qquote);
use Loader qw( add_kunde_leitung
  edit_leitung
  line_in list_leitungen log_view
  select_suche
);
use Fehler qw(report_fehler problem);

my $leitungen_mit = sub {
	my ( $attr, $person ) = @_;
	my $person_id = get_person($person)
	  or return problem(qq(Unbekanntes Personenobjekt "$person".));
	"$attr = $person_id";
};

my %suche = (
	A  => sub { $leitungen_mit->( a_ende  => @_ ) },
	B  => sub { $leitungen_mit->( b_ende  => @_ ) },
	c  => sub { $leitungen_mit->( carrier => @_ ) },
	n  => 'name',
	nc => 'name_carrier',
	nk => 'name_kunde',
);

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

	$kn = "Kunde $id:" . name_kunde($id) if $kn eq '' && defined $id;

	aloop: while ( content( my $act = line_in( "$kn Leitung >", 4 ) ) ) {

		( $act, my @select ) = split ' ', $act;
		for (@select) {
			$_ = select_suche($_, "leitung", %suche);
			next aloop unless defined $_;
		}

		if ( $act eq '?' ) {
			print <<'END';
l     auflisten                                   *l ... inkl. Unterkunden
L     auflisten (auch beendete Leitungen)         *L ... inkl. Unterkunden

Bei allen o.g. Funktionen können jeweils zusätzlich beliebig viele mit
Whitespace getrennte Suchargumente übergeben werden:

A:...   nur Leitungen mit A-Ende ... anzeigen
B:...   nur Leitungen mit B-Ende ... anzeigen
c:...   nur Leitungen mit Carrier ... anzeigen
n:...	nur Leitungen anzeigen, deren Name zu SQL-Wildcard "..." passt
nc:...  nur Leitungen anzeigen, deren Carrier-Leitungsbezeichnung zur
        SQL-Wildcard "..." passt
nk:...  nur Leitungen anzeigen, deren kundeneigene Leitungsbezeichnung zur
        SQL-Wildcard "..." passt

n?...   nur Leitungen anzeigen, in deren Name "..." vorkommt
nc?...  nur Leitungen anzeigen, bei denen ... in der Carrier-
        Leitungsbezeichung vorkommt
nk?...  nur Leitungen anzeigen, bei denen ... in der kundeneigenen
        Leitungsbezeichung vorkommt
END
			print <<'_' if defined $id;

a     hinzufügen
_
			next;
		}
		if ( defined $id && $act eq 'a' ) { add_kunde_leitung( $id, $kn ); next; }
		if ( $act =~ /^ (\*)? ([lL]) \z /ix ) {
				list_leitungen( ($1 && $id) ? [ unterkunden($id) ] : $id, $2 eq 'L'
, @select );
				next;
		}

		if ( $act eq "H" ) { log_view( $kn, 'leitung' ); next; }
		if ( $act =~ /^\d+$/ ) { edit_leitung( $act, $id, $kn ); next; }

		my $qqact = qquote($act);
		if (
			defined(
				my $leitung = DoFn(
					    "SELECT id FROM leitung WHERE name = $qqact "
					  . ( defined $id && "AND kunde = $id " )
					  . 'ORDER BY id LIMIT 1'
				)
			)
		  )
		{
			edit_leitung( $leitung, $id, $kn );
			next;
		}
		if ( defined( my $leitung = DoFn(<<_) ) ) {
SELECT id FROM leitung WHERE name = $qqact ORDER BY kunde, id LIMIT 1
_
			edit_leitung( $leitung, $id, $kn ); next;
		}
		print "Aktion '$act' kenne ich nicht. Liste mit '?'.\n";
		next;
		fehler: report_fehler(4);
	}
	undef;
}

1;
