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

use Loader qw(
	acct_domain_gebuehr add_zone
	delete_domain delete_zone
	domain_regprint domain_whois
	edit_acct edit_domain_person edit_ktarif edit_ktarife edit_zone
	line_in line_printer
	list_domain list_ktarife list_zone list_zonelog
	log_update log_view
	set_domain_datum
	set_domain_flags set_domain_from
	set_domain_info
	set_domain_kunde
	set_domain_nic set_domain_nserver
	set_domain_person
	set_domain_status
	set_domain_tarif set_domain_ticket set_domain_tname set_domain_tsig
	set_mail_ip
	strip_kn
	valid_domain valid_kunde
	warn_arbeit warn_kunde
  );
use Dbase::Globals qw(bignum chomped find_descr puny_decode);
use Dbase::Help qw(DoFn Do);
use Fehler qw(report_fehler warnung);

my $domainflag_wichtig = find_descr( domainflags => 'wichtig' );
$domainflag_wichtig =
  defined $domainflag_wichtig ? bignum(1) << $domainflag_wichtig : 0;

sub edit_domain($;$$) {
	my($idi,$id,$kn) = @_;

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

	my ( $name, $flags ) =
	  DoFn("SELECT domain, flags FROM domainkunde WHERE id = $idi");

	warnung( chomped(<<_) ) if $flags & $domainflag_wichtig;
Diese Domain ist als wichtig markiert. Bitte besondere Vorsicht walten lassen!
_

	$name = puny_decode($name);
	$kn = strip_kn($kn)."Domain_$idi:$name";
	my $work = warn_arbeit("domainkunde",$idi,"*",$kn);
	warn_kunde("domainkunde",$idi,$id);

	domq: while(1) {
		my $act = line_in "$kn >",4; last if $act eq "";
		if($act eq "?") {
			print <<'END';
??  Hilfstext für Domain- und NIC-Handle-Anträge
??? Hilfstext zum Domainberechnen

l   auflisten

s   Status der Domain ändern         t   Ticket zuordnen
i   Infotext setzen                  ns  Adresse des Kunden-Nameservers
x   Start/Enddatum ändern            kd  Assoziation zum 'B'-Tarif löschen
sr  Registrar setzen                 B   Tarif des Kunden eintragen
O   einer Person zuordnen (Besitzer, z. B. des Webspaces)
K   anderem Kunden zuordnen (OHNE Historie -- dazu z. B. den Dienst ändern)
f   Flags editieren                  ts  TSIG-Key zuordnen
az  Zone im Nameserver anlegen       dz  ... löschen
AZ  Default-Zone Nameserver anlegen (keine Datenübernahme aus aktuellem DNS)
ez  ... editieren                    lz  ... anzeigen (AXFR)
cz  Änderungs-Log für Zone anzeigen
M   IP-Adresse für ausgehende E-Mails festlegen

w [<server>] whois-Anfrage an <server> (oder den Default-Server für diese TLD)

del löschen (Fehleingabe -- rauswerfen)
END
			next;
		}
		if($act eq "???") {
			print <<'END';
Domainberechnung passiert in zwei Stufen.
- Beim Beantragen wird die Bearbeitungsgebühr festgelegt.
  Bei neuen Domains wird außerdem der Tarif festgelegt.
  Gebühr und Tarif werden endgültig erst vom Automaten eingetragen,
  sobald der Domainantrag bestätigt ist.
- Der Roboter wird, so der Eintrag erfolgreich war,
  automatisch den Tarif eintragen und die Berechnung anstoßen.
  Diese Funktion kann auch manuell aufgerufen werden.

b     Standard-Tarif vormerken
B     vorgemerkten Tarif ändern

k   den Tarif dieser Domain editieren (+ evtl. assoziieren)
T   Tarife des Kunden auflisten
bp  Person eintragen, an die auto-Hostmaster-Mails kopiert werden

Sonderfunktionen für manuelle Bearbeitung:
bb    Datensatz zur Berechnung der Bearbeitung generieren
BB    Tarifeintrag generieren (Startzeitpunkt: jetzt)
END
			next;
		}
		if($act eq "??") {
			print <<'END';
r   Registry- und Personeneinträge etc. überprüfen und ausgeben
na  zu benachrichtigende person setzen

s=DOMAIN       setze leere Inhaber/*-c aus DOMAIN
S=DOMAIN       setze alle Inhaber/*-c aus DOMAIN

s[oatzb]    Owner/Admin-C/Tech-C/Zone-C/Bill-C setzen
e[oatZb]    Owner/Admin-C/Tech-C/       Bill-C editieren
            (jeweils für Owner / Adminc / Techz / Zonec / Billc)

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 "b") {
			my($kt,$tn)=DoFn("select domainkunde.ktarif,tarifname.name from domainkunde left join tarifname on domainkunde.tarifname=tarifname.id where domainkunde.id=$idi");
			if($kt) {
				print "Die Domain hat bereits einen Tarif.\n";
			} elsif($tn) {
				print "Der Tarif '$tn' ist bereits vermerkt.\n";
			} else {
				set_domain_tname($idi,$kn,"?");
			}
			next;
		}
		if($act eq "B") { set_domain_tname($idi,$kn); next; }
		if($act eq "BB") { set_domain_tarif($idi,$kn,"?",1); next; }
		if($act eq "bb") { acct_domain_gebuehr($idi,$kn,2); next; }
		if($act eq "H") { log_view($kn,"domainkunde","id",$idi); next; }
		if($act eq "T") { list_ktarife($id,$kn); next; }
		if($act eq "K") { set_domain_kunde($idi,$kn); return undef; }
		if($act eq "O") { set_domain_person($idi,$kn,"person",1); next; }
		if($act eq "eo") { edit_domain_person($idi,$kn,"owner"); next; }
		if($act eq "ea") { edit_domain_person($idi,$kn,"adminc"); next; }
		if($act eq "et") { edit_domain_person($idi,$kn,"techc"); next; }
		if($act eq "eZ") { edit_domain_person($idi,$kn,"zonec"); next; }
		if($act eq "eb") { edit_domain_person($idi,$kn,"billc"); next; }
		if($act eq "na") { set_domain_person($idi,$kn,"nachricht"); next; }
		if($act eq "so") { set_domain_person($idi,$kn,"owner"); next; }
		if($act eq "sa") { set_domain_person($idi,$kn,"adminc"); next; }
		if($act eq "st") { set_domain_person($idi,$kn,"techc"); next; }
		if($act eq "sz") { set_domain_person($idi,$kn,"zonec"); next; }
		if($act eq "sb") { set_domain_person($idi,$kn,"billc"); next; }
		if($act =~ s/^s=//) { set_domain_from($idi,$kn,$act); next; }
		if($act =~ s/^S=//) { set_domain_from($idi,$kn,$act,1); next; }
		if($act eq "sr") { set_domain_nic($idi,$kn); next; }
		if($act eq "l") { list_domain($idi,$kn); next; }
		if($act eq "t") { set_domain_ticket($idi,$kn); next; }
		if($act eq "x") { set_domain_datum($idi,$kn); next; }
		if($act eq "i") { set_domain_info($idi,$kn); next; }
		if($act eq "f") { set_domain_flags($idi,$kn); next; }
		if($act eq "r") { domain_regprint($idi, $kn); next; }
		if($act =~ /^w(?:\s+(.*))?\s*$/) {
			line_printer;
			no warnings 'once';
			print $Db::pr_fh domain_whois scalar DoFn("SELECT domain FROM domainkunde WHERE id = $idi"), $1;
			next;
		}

		if ( $act eq 'del' ) {
			if   ( delete_domain( $idi, $kn ) ) { return undef }
			else                                { next }
		}
		if($act eq "s") { set_domain_status($idi,$kn); next; }
		if($act eq "ns") { set_domain_nserver($idi,$kn); next; }
		if($act eq 'ts') { set_domain_tsig $idi,$kn; next; }
		if($act eq "az") { add_zone($idi,$kn,1); next; }
		if ( $act eq 'AZ' ) { add_zone( $idi, $kn, 1 | 8 ); next; }
		if($act eq "ez") { edit_zone($idi,$kn); next; }
		if($act =~ /^lz(?:\s+(\S+))?$/) { list_zone($idi,$kn,$1); next; }
		if($act eq 'cz') { list_zonelog $idi; next; }
		if ( $act eq 'M' ) { set_mail_ip( $id, domainkunde => $idi ); next }
		if($act eq "dz") { delete_zone($idi,$kn); next; }
		if($act eq "kd") {
			log_update("domainkunde","id",$idi,undef,"ktarif",undef,
				DoFn("select ktarif from domainkunde where id=$idi"));
			Do("update domainkunde set ktarif=NULL where id=$idi");
			next;
		}
		if($act eq "k") {
			my $idk = DoFn("select ktarif from domainkunde where id = $idi");
			unless ($idk) {
				$idk = edit_ktarife($id,5,$kn);
				next if !defined $idk || $idk eq '' || $idk eq '-';
				if ( my $dod = DoFn("SELECT id FROM domainkunde WHERE ktarif = $idk") ) {
					print "...schon mit Domain #$dod '".DoFn("select domain from domainkunde where id = $dod")."' assoziiert.\n";
					next;
				}
				log_update("domainkunde","id",$idi,undef,"ktarif",undef,
					DoFn("select ktarif from domainkunde where id=$idi"));
				Do("update domainkunde set ktarif=$idk where id=$idi");
			}
			edit_ktarif($idk,$id,$kn);
			next;
		}
		print "Aktion '$act' unbekannt.\n";
		next; fehler: report_fehler(4);
	}
	$idi;
}

1;
