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

use Loader qw( add_ktarif
               delete_ktarif
               edit_ktarif
               edit_tarif
               line_in list_ktarife list_kstarife list_rechnungsdatum log_view
			   select_suche
               valid_kunde
             );
use Fehler qw(report_fehler);
use Dbase::Help qw(DoSelect DoFn qquote);
use Dbase::Globals qw(find_dienst unterkunden);

my $mit_diensten = sub {
    my ( $dienste ) = @_;
	my @dienste = grep { defined } map { find_dienst $_ } split(/,/,$dienste);
	return undef unless @dienste;
	"( dienst = " . join(" or dienst = ",@dienste) . " )";
};

my $mit_name = sub {
    my ( $name, $was ) = @_;
	if($was eq ":") {
		my $tnid = DoFn "select id from tarifname where name=${\ qquote $name }";
		return undef unless $tnid;
		"tarifkunde.tarifname=$tnid";
	} else {
		my @tarife;
		DoSelect {
			push(@tarife,$_[0]);
		} "select id from tarifname where name like ${\ qquote '%'.$name.'%' }";
		return undef unless @tarife;
		"tarifkunde.tarifname in (".join(',',@tarife).")";
	}
};

my %suche = (
    d  => sub { $mit_diensten->( @_ ) },
    n  => sub { $mit_name->( @_ ) },
);

sub edit_ktarife($;$$) {
# Flag: 1 autoreturn, 2 Hauptmenu, 4 "-"
	my($id,$flag,$kn) = @_; # Kunde
	return unless valid_kunde($id,1);

	my $pers;
	tarifk: while(1) {
		my $act = line_in "$kn KundenTarif >",($flag&1)?0:4; last if $act eq "";
		( $act, my @select ) = split ' ', $act;
		for (@select) {
			$_ = select_suche($_, "tarifkunde", %suche);
			next tarifk unless defined $_;
		}

		if($act eq "?") {
			print <<'END';
l    auflisten                ll  ... mit Beschreibungen   *l, *ll, etc.:
L    auflisten (auch beende)  LL  ... mit Beschreibungen       mit Unterkunden

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

n:...  nur Tarife mit diesem Namen
d:x,y  nur Kundentarife mit Dienst X oder Y

n?...  nur Tarife, in deren Name "..." vorkommt

a    hinzufügen               lt  kundenspezifische Tarifdefinitionen auflisten
d    automatisch angelegte Tarife 'konflikt'/'unbekannt' (Anzahl=0) löschen
dd   alle automatisch angelegten Tarife löschen
RD   Rechnungs- und Tarifdatumsliste
END
			if($flag & 1) {
				print <<'END';

###  eintragen
?### bearbeiten
END
			} else {
				print <<'END';

###  bearbeiten
t### (kundenspezifische) Tarifdefinition bearbeiten
END
			}
			next;
		}
		if($act eq "a") { add_ktarif($id,$kn); next; }
		if($act eq "H") { log_view($kn,"tarifkunde"); next; }
		if($act eq "d") {
			my $kt1 = DoFn("select id from tarifname where name='unbekannt'");
			my $kt2 = DoFn("select id from tarifname where name='konflikt'");
			DoSelect {
				my($id) = @_;
				delete_ktarif($id);
			} "select id from tarifkunde where kunde = $id and ( anzahl = 0 or anzahl is null ) and ( tarifname = $kt1 or tarifname = $kt2 ) ";
			next;
		}
		if($act eq "dd") {
			DoSelect {
				my($id) = @_;
				delete_ktarif($id);
			} "select id from tarifkunde where kunde = $id and ( anzahl = 0 or anzahl is null ) ";
			next;
		}
		if($act =~ s/^t(\d+)$/$1/) {
			edit_tarif($act,$kn,$id);
			next;
		}
        my $force = ($act =~ s/^\?//);
		if($act =~ /^\d+$/) {
			unless(DoFn("select id from tarifkunde where id = $act")) {
				print "Diesen Kundentarif gibt es nicht.\n";
				next;
			}
            return $act if $flag & 1 and not $force;
			$act = edit_ktarif($act,$id,$kn);
			return $act if $flag & 1 and defined $act;
			next;
		}
		if ( $act =~ /^ (\*)? ([lL]{1,2}) \z /ix ) {
			my %ak = (l=>0,L=>2,ll=>1,LL=>3);
			if(exists $ak{$2}) {
				list_ktarife(($1 && $id) ? [ unterkunden($id) ] : $id, $kn, $ak{$2},@select);
				next;
			}
		}
		if ( $act =~ /^ (\*)? lt \z /ix ) {
			list_kstarife(($1 && $id) ? [ unterkunden($id) ]: $id, $kn );
			next;
		}
		if($act eq "RD") { list_rechnungsdatum($id,$kn); next; }
		print "Aktion '$act' kenne ich nicht.\n";
		next; fehler: report_fehler(4);
	}
	undef;
}

1;
