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, $key) = @_;
	if ( $key eq '-') {
		return "$attr IS NULL";
	}
	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 => @_ ) },
	i  => 'infotext',
	n  => 'name',
	nc => 'name_carrier',
	t  => 'ktarif',
);

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:

Folgende Suchoptionen sind möglich:
n   Name          i   Infotext 
A   A-Ende        B   B-Ende
c   Carrier       nc  Carrier-Leitungsbezeichnung 

Wenn man diese mit folgenden benutzt:
:... wird ... als SQL-Wildcard "..." zur Suche im Feld verwendet
?... werden Einträge angezeigt in desen Feld "..." vorkommt
-    werden Einträge deren feld leer (NULL) ist angezeigt

Beispiele:
* "l n?FEU1"  zeigt Leitungen in deren Name 'FEU1' vorkommt.
* "l A-"      zeigt Leitungen die kein A-Ende gesetzt haben.
* "l A:noris" zeigt Leitungen in deren A-Ende bei noris liegt.
* "l A?noris" zeigt Leitungen in deren A-Ende bei noris liegt.

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;
