use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(report_fehler);
use Loader qw(line_in strip_kn set_ipnr_auto delete_ipregion list_ipregion
		list_ipaddrs set_ipregion_name set_ipregion_info
		set_ipregion_kunde log_view set_ipregion_ipkunde set_ipregion_bits
		show_free_ipr map_ip warn_arbeit warn_kunde valid_ipregion
		valid_kunde);
use Dbase::Help qw(DoFn DoSelect);
use Dbase::IP;

sub edit_ipregion($;$$) {
	my($idi,$id,$okn) = @_; # ID, Kunde

	return unless valid_ipregion($idi);
	if($id) {
		return unless valid_kunde($id,1);
	} else {
		$id = DoFn("select kunde from ipregion where id = $id");
	}

	my $kn = strip_kn($okn)."Z_$idi:".DoFn("select zone from ipregion where id = $idi");
	my $work = warn_arbeit("ipregion",$idi,"*",$kn);
	warn_kunde("ipregion",$idi,$id);

	while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		if($act eq "?") {
			print <<'END';
l   auflisten            n   Namen ändern
##  IP-Adressbereich dazunehmen/entfernen            del löschen

q   Abfrage, wieviele Adressen noch frei sind
qq  Adressplan der Netze       qa  ... mit Einzeladressen
K   anderem Kunden zuordnen    N   neues übergeordnetes Netz wählen
                               B   Breite der Belegung im übergeordneten Netz
L   alle IP-Netze dieses Kunden auflisten (dient nur zur Info!)

Das mit "N" angegebene Netz ist das, aus dem bei Bedarf neue, B bits
breite Blöcke abgetrennt werden, die zu dieser Zone gehören. Aus diesen
Blöcken (die man zu der Zone auch explizit dazunehmen kann) werden die
eigentlichen Adressen belegt, wenn man beim Anlegen von neuen
IP-Adressen den Namen (oder die Nummer) der Zone angibt.
END
			next;
		}
		if($act eq "del") { delete_ipregion($idi,$kn); return; }
		if($act eq "l") { list_ipregion($idi,$kn); next; }
		if($act eq "L") { list_ipaddrs($id,$kn,2); next; }
		if($act eq "n") { set_ipregion_name($idi,$kn);
			$kn = strip_kn($okn)."Zone_$idi:".DoFn("select zone from ipregion where id = $idi");
			next; }
		if($act eq "i") { set_ipregion_info($idi,$kn); next; }
		if($act eq "K") { set_ipregion_kunde($idi,$kn); next; }
		if($act eq "H") { log_view($kn,"ipregion","id",$idi); next; }
		if($act eq "N") { set_ipregion_ipkunde($idi,$kn); next; }
		if($act eq "B") { set_ipregion_bits($idi,$kn); next; }
		if($act eq "q") { show_free_ipr($idi,1); next; }
		if($act eq "qq" or $act eq "qa") {
			DoSelect {
				my($ip,$bit)=@_;
				$ip = Dbase::IP->new_db($ip,$bit);
				return unless defined $ip; # v6 geht hier noch nicht

				map_ip($ip,(($act eq "qa")?1:0)|($ip->is_v4rf?8:0));
			} "select ip6,bits from ipkunde where ipregion = $idi";
			next;
		}
		if($act =~ /^\d+$/) {
			set_ipnr_auto($act,$kn,$idi);
			next;
		}
		my $eip = Dbase::IP->new($act);
		if(defined $eip) {
			$act = DoFn("select id from ipkunde where ( ende is NULL or ende > UNIX_TIMESTAMP(NOW())) and ${\ $eip->dbs }");
			unless($act) {
				print "...nicht gefunden...?\n";
				next;
			}
			set_ipnr_auto($act,$kn,$idi);
			next;
		}
		print "Aktion '$act' unbekannt.\n";
		next; fehler: report_fehler(4);
	}
	$idi;
}
1;
