use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(line_in line_printer list_tarife log_view copy_tarife edit_tarif
	valid_tarif add_tarif list_tarife_kurz list_tarifklasse warn_kunde
	strip_kn rename_tarifklasse set_tarifklasse_klasse
	flip_tarifklasse_obsolet set_tarifklasse_laufzeit
	set_tarifklasse_kuendigung set_tarifklasse_verlaengern);
use Fehler qw(report_fehler problem);
use Dbase::Help qw(DoSelect DoFn qquote Do);
use Dbase::Globals qw(content name_kunde);

# Flag: 1: Return (der Tarif-ID)
#       2: Hauptmenu-Features
#       4: '-' akzeptieren

sub edit_tarifklasse ($;$$$) {
	my ($tkid,$flag,$okn,$kid) = @_;
	$flag=0 unless defined $flag;

	warn_kunde("tarifklasse",$tkid,$kid);

	my ($tnid,$kunde,$tn) = DoFn("select tarifname.id,tarifklasse.kunde,tarifname.name from tarifklasse,tarifname where tarifklasse.id=$tkid and tarifname.id=tarifklasse.tarifname");
	my $tkd;
	if($kunde) {
		$tkd=name_kunde($kunde);
	} else {
		$tkd="*";
	}
	my $kn=strip_kn($okn)."Tarifdef_$tkid:$tn:$tkd";

	tarife: while(1) {
		my $act = line_in "$kn >",($flag&1)?0:4;
		return undef if not content $act;

		if($act eq "?") {
			print <<'END' if $kunde;
l      Datensatz anzeigen                    ll  inkl Details
ll     Liste der Tarife                      LL  auch abgelaufene
ls     Kunden mit dieser Tarifdef (spezial)  LS  auch abgelaufene 
END
			print <<'END' unless $kunde;
l      Datensatz anzeigen                    ll  inkl Details
ll     Liste der Tarife                      LL  auch abgelaufene
ls     Kunden mit dieser Tarifdef (spezial)  LS  auch abgelaufene 
lk     Kunden mit dieser Tarifdef (direkt)   LK  auch abgelaufene 
END
			print <<'END';
=X     Alle Tarife mit Dienst X              ==X auch abgelaufene
END
			print <<'END' if $flag & 2;
lz  Laufzeit    (initial)                    ak     Altlast-Kennzeichen
vl  Verlängerung (danach)                    k      Tarifklasse(n) setzen
kf  Kündigungsfrist (vor Verlängerung)

a      Tarifdefinition hinzufügen            dup Tarifdef. komplett duplizieren
del    löschen                               ren umbenennen
END
			print <<'END' if $flag & 1;
?###   Tarif editieren
END
			print <<'END';
###    Tarif aufrufen
END
			next;
		}
		if($act eq "ren") {
			next unless defined rename_tarifklasse($tkid,$kn);
			$tn = DoFn("select tarifname.name from tarifklasse,tarifname where tarifklasse.id=$tkid and tarifname.id=tarifklasse.tarifname");
			$kn=strip_kn($okn)."Tarifdef_$tkid:$tn:$tkd";
			next;
		}
		if($act eq "del") {
			if(DoFn("select count(*) from tarif where klasse=$tkid")) {
				problem "Es gibt noch Tarife hier.";
				next;
			}
			if($kunde and not DoFn("select id from tarifklasse where tarifname=$tnid and kunde is null") and DoFn("select count(*) from tarifkunde where tarifname=$tnid and kunde=$kunde")) {
				problem "Der Kunde hat diesen Tarif eingetragen!";
				### und es gibt keine allgemeine Version
				next;
			}
			if(not $kunde and DoFn("select count(*) from tarifkunde left join tarifklasse on tarifklasse.kunde=tarifkunde.kunde and tarifklasse.tarifname=$tnid where tarifkunde.tarifname=$tnid and tarifklasse.id is null")) {
				problem "(Mindestens) ein Kunde hat diesen Tarif eingetragen!";
				next;
			}
			Do("delete from tarifklasse where id=$tkid");
			return;
		}
		if($act eq "H") { log_view($kn,"tarifklasse","id",$tkid); next; }
		if($act eq "dup") {
			print "Tarif umkopieren..:\n";
			copy_tarife($tnid,$kn,$kunde);
			next;
		}
		if($act eq "ak") { flip_tarifklasse_obsolet($tkid,$kn); next; }
		if($act eq "H") { log_view($kn,"tarifklasse","id",$tkid); next; }
		if($act eq "l") { list_tarifklasse($tkid,$kn,0); next; }
		if($act eq "L") { list_tarifklasse($tkid,$kn,1); next; }
		if($act eq "k") { set_tarifklasse_klasse($tkid,$kn); next; }
		if($act eq "lz") { set_tarifklasse_laufzeit($tkid,$kn); next; }
		if($act eq "vl") { set_tarifklasse_verlaengern($tkid,$kn); next; }
		if($act eq "kf") { set_tarifklasse_kuendigung($tkid,$kn); next; }
		if($act eq "ls") {
			my $len=0;
			my $res = DoSelect {
				my($kn) = @_;
				if(length($kn)+$len > 70) {
					print "\n" if $len;
					$len=0;
				} else {
					print " " if $len;
					$len ++;
				}
				print "$kn";
				$len += length($kn);
			} "select distinct kunde.name from tarifklasse,kunde where tarifklasse.tarifname=$tnid and kunde.id=tarifklasse.kunde and (kunde.ende is null or kunde.ende > UNIX_TIMESTAMP(NOW())) order by kunde.name";
			print "\n"; next;
		}
		if($act eq "LS") {
			my $len=0;
			my $res = DoSelect {
				my($kn) = @_;
				if(length($kn)+$len > 70) {
					print "\n" if $len;
					$len=0;
				} else {
					print " " if $len;
					$len ++;
				}
				print "$kn";
				$len += length($kn);
			} "select distinct kunde.name from tarifklasse,kunde where tarifklasse.tarifname=$tnid and kunde.id=tarifklasse.kunde order by kunde.name";
			print "\n" if $len; next;
		}
		if($act eq "lk") {
			my $len=0;
			my $res = DoSelect {
				my($kn) = @_;
				if(length($kn)+$len > 70) {
					print "\n" if $len;
					$len=0;
				} else {
					print " " if $len;
					$len ++;
				}
				print "$kn";
				$len += length($kn);
			} "select distinct kunde.name from tarifkunde,kunde where tarifkunde.kunde=kunde.id and tarifkunde.tarifname=$tnid and (tarifkunde.ende is null or tarifkunde.ende > UNIX_TIMESTAMP(NOW())) and (kunde.ende is null or kunde.ende > UNIX_TIMESTAMP(NOW())) order by kunde.name";
			print "\n" if $len; next;
		}
		if($act eq "LK") {
			my $len=0;
			my $res = DoSelect {
				my($kn) = @_;
				if(length($kn)+$len > 70) {
					print "\n" if $len;
					$len=0;
				} else {
					print " " if $len;
					$len ++;
				}
				print "$kn";
				$len += length($kn);
			} "select distinct kunde.name from tarifkunde,kunde where tarifkunde.kunde=kunde.id and tarifkunde.tarifname=$tnid order by kunde.name";
			print "\n" if $len; next;
		}
		if($act eq "-") {
			return $act if $flag & 4;
			print "???\n";
			next;
		}
		if($act eq "a" and $flag & 2) { 
			my $ret = add_tarif($tkid,$kn);
			return $ret if $flag & 1 and $ret > 0;
			next;
		}
		if($act =~ s/^\=//) { list_tarife($tkid,$kn,0,$act); next; }
		if($act eq "ll") { list_tarife($tkid,$kn,4); next; }
		if($act eq "LL") { list_tarife($tkid,$kn); next; }

		if($act =~ /^\!?\d+$/ and valid_tarif($act,1)) {
			$act =~ s/^(\!)//;
			my $flg = $1;
			return $act if $flag&1 and not $flg;
			edit_tarif($act,$kn,$kunde);
			next;
		}

		print "Aktion '$act' kenne ich nicht.\n";
		next; fehler: report_fehler(4);
	}

	# Lösche nicht benötigte Tarifklasse?
#	unless(DoFn("select count(*) from tarif where klasse=$tkid")) {
#		if($kunde or not DoFn("select count(*) from tarifklasse where tarifname=$tnid and kunde is not null")) {
#			Do("delete from tarifklasse where id=$tkid");
#			print "... leer => gelöscht.\n";
#			while(1) {
#				last if $kunde;
#				last if DoFn "select count(*) from tarifkunde where tarifname=$tnid";
#				last if DoFn "select count(*) from domainkunde where tarifname=$tnid";
#				last if DoFn "select count(*) from person where tarifname=$tnid";
#				Do("delete from tarifname where id=$tnid");
#				print "... Tarifname nicht verwendet => gelöscht.\n";
#				last;
#			}
#		}
#	}
	return undef;
}
1;
