use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(get_kunde);
use Dbase::Help qw(DoFn DoTime);
use Dbase::IP;
use Fehler qw(report_fehler problem);
use Loader qw(
  copy_ipnr
  delete_ipnr
  edit_ipaddr_person
  ipnr_prints
  line_in
  line_ja_nein
  list_ipnr
  log_view
  map_ip
  rename_vrf
  serve_cname
  set_ipnr_auto
  set_ipnr_datum
  set_ipnr_description
  set_ipnr_flags
  set_ipnr_info
  set_ipnr_kiste
  set_ipnr_kunde
  set_ipnr_mac
  set_ipnr_nic
  set_ipnr_parent
  set_ipnr_person
  set_ipnr_snmp_community
  set_ipnr_tarif
  set_ipnr_ticket
  set_ipnr_ziel
  set_mail_ip
  set_nagiosconf
  show_free_ip
  show_reverse
  strip_kn
  toggle_host_in_group
  valid_ip
  valid_kunde
  warn_arbeit
  warn_kunde
);

sub edit_ipaddr($;$$) {
	my($idi,$id,$okn) = @_;

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

	my($kn,$ip);
	{
		my $bits;
		($ip,$bits) = DoFn("select ip6,bits from ipkunde where id = $idi");
		$ip = Dbase::IP->new_db($ip,$bits);
		$kn = strip_kn($okn)."IP_$idi:".$ip->str(4);
	}
	my $work = warn_arbeit("ipkunde",$idi,"*",$kn);
	warn_kunde("ipkunde",$idi,$id);
	my $bits = DoFn("select bits from ipkunde where id = $idi");

	while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		if($act eq "?") {
			print <<'END';
l   auflisten
sd  Dienst manuell setzen (Default: ip)             z   Ziel ändern
k   Lokales Ziel der Route angeben ("'K'iste")      f   Flags setzen/löschen
t   Doku-Ticket assoziieren                         x   Anfang-/Ende-Datum
j   Reverse-Lookup via CNAMEs umdelegieren          J   CNAMEs löschen
r   tatsächliches Reverse-Lookup anzeigen (= DNS-Abfrage)
i   Info-Text ändern                                ip  IP-Adresse ändern
K   anderem Kunden zuordnen ("schon immer", d.h. Eintrag wird NICHT repliziert)
a   Auto-Allokation: Subnetz zu einer Zone zuordnen
M   IP-Adresse für ausgehende E-Mails festlegen
END
			print $bits ? <<'NETZ' : <<'ADDR';
n   Netzname setzen/ändern                          p   RIPE-Antrag ausgeben
q   Abfrage, wieviele Adressen frei sind            qq  Adressplan
v   VRF umbenennen                                  qa  ... mit Einzeladressen
NETZ
c   MAC-Adresse
C   SNMP-Community
n   FQDN in Datenbank und DNS setzen/ändern
hg  Hostgroups (vgl. RT#437749)
N   spezielle Nagios-Konfigurationswerte pflegen (vgl. RT#259990)
P   Parent-Objekt eintragen oder löschen
ADDR
			print <<END;
??  Hilfstext für RIPE-Adressblockantrag etc.

d   löschen (beenden)
END
			next;
		}
		if($act eq "??") {
			print <<'END';
p   RIPE-Eintrag generieren, anzeigen
rg  Registrar ändern ("RIPE" -- was sonst?)

sf/sa/st   Inhaber/Admin-C/Tech-C setzen
ef/ea/et   Inhaber/Admin-C/Tech-C editieren

Ticket K:  Ticket, mit dem der Kunde die Domain beantragt hat
Ticket A:  Followup-Ticket, in dem der eigentliche Antrag bearbeitet wird
END
			next;
		}
		if($act eq "ip") {
			my $bits;
			copy_ipnr($idi,$kn);
			($ip,$bits) = DoFn("select ip6,bits from ipkunde where id = $idi");
			$ip = Dbase::IP->new_db($ip,$bits);
			$kn = strip_kn($okn)."IP_$idi:$ip";
			next; }
		if($act eq "sf") { set_ipnr_person($idi,$kn,"owner"); next; }
		if($act eq "sa") { set_ipnr_person($idi,$kn,"adminc"); next; }
		if($act eq "st") { set_ipnr_person($idi,$kn,"techc"); next; }
		if($act eq "ef") { edit_ipaddr_person($idi,$kn,"owner"); next; }
		if($act eq "ea") { edit_ipaddr_person($idi,$kn,"adminc"); next; }
		if($act eq "et") { edit_ipaddr_person($idi,$kn,"techc"); next; }
		if($act eq "a") { set_ipnr_auto($idi,$kn); next; }
		if($act eq "K") { set_ipnr_kunde($idi,$kn) && last; next; }
		if($act eq 'z') { set_ipnr_ziel($idi,$kn); next; }
		if($act eq 'rg') { set_ipnr_nic($idi,$kn); next; }
		if($act eq 'i') { set_ipnr_description($idi,$kn); next; }
		if($act eq "x") { set_ipnr_datum($idi,$kn); next; }
		if($act eq "sd") { set_ipnr_tarif($idi,$kn); next; }
		if($act eq "H") { log_view($kn,"ipkunde","id",$idi); next; }
		if($act eq "l") { list_ipnr($idi,$kn); next; }
		if($act eq "t") { set_ipnr_ticket($idi,$kn); next; }
		if($act eq "v") { rename_vrf($idi); next; }
		if($act eq "k") { set_ipnr_kiste($idi,$kn); next; }
		if($act eq "p") { ipnr_prints($idi); next; }
		if($act eq "j" or $act eq "J") {
			my $flag = 0;
			$flag = 16 if $act eq "J";
			my $domain = line_in "Redirect auf Domain: ";
			return undef unless defined $domain;
			if($domain !~ /\w\.\w/) {
				problem "Domainnamen enthalten Punkte...\n";
				next;
			}
			my $knd = get_kunde $domain;
  			print <<END if $knd and $knd != $id;

*** Vorsicht: Du bearbeitest gerade Kunde #$id.
              Diese Domain gehört aber zu Kunde #$knd!

END
			my $def = $bits;
			$def = int(($def-1)/8)+1;

			my $num = line_in "Wieviele Bytes ($def-4)[$def] sollen vorangestellt werden?";
			return if not defined $num;
			$num = $def if $num !~ /^[$def-4]$/;
			$flag |= $num;

			$flag |= 8
			  if ( $flag & 7 ) > 1
			  and line_ja_nein( 'Letztes Byte vorne', undef, undef, 'nein' );

			serve_cname($idi,$domain,$flag);
			next;
		}
		if($act eq 'r') { show_reverse($idi); next; }
		# bewusst undokumentiert, vgl. RT#369340:
		if($act eq 'expunge') { delete_ipnr($idi,$kn); return undef; }
		if($act eq 'del') { print <<_; next; }
Du meinst "d". Falls nicht, mach ein netz-Ticket auf!
_
		if ( $act eq 'd' ) {
			set_ipnr_datum( $idi, $kn, undef, DoTime() ) and return undef;
		}
		if ( $act eq 'f' ) { set_ipnr_flags $idi, $kn; next; }
		if ( $act eq 'n' ) { set_ipnr_info($idi,$kn); next; }
		if ( $act eq 'M' ) { set_mail_ip( $id, ipkunde => $idi ); next }

		if ($bits) {
			if( $act eq 'q' ) { show_free_ip($idi,1); next; }
			if( $act =~ /^q[aq]\z/ ) {
				map_ip( $ip, (($act eq 'qa')?1:0)|($ip->is_v4rf?8:0) );
				next;
			}
		}
		else {
			if( $act eq 'c' ) { set_ipnr_mac           ($idi,$kn); next; }
			if( $act eq 'C' ) { set_ipnr_snmp_community($idi    ); next; }
			if ( $act eq 'hg' ) { toggle_host_in_group( $id, $kn, $idi ); next; }
			if( $act eq 'N' ) { set_nagiosconf( ipkunde => $idi, $kn ); next; }
			if( $act eq 'P' ) { set_ipnr_parent    ($idi,$kn,$id); next; }
		}
		print "Aktion '$act' unbekannt.\n";
		next; fehler: report_fehler(4);
	}
	$idi;
}
1;
