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 !defined $act || $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
M   IP-Adresse für ausgehende E-Mails festlegen

az  Zone im Nameserver anlegen
AZ  Default-Zone Nameserver anlegen (keine Datenübernahme aus aktuellem DNS)
az TEMPLATE
AZ TEMPLATE
    Zone im Nameserver anlegen;
    sofern dabei keine Datenübernahme aus dem aktuellen DNS stattfindet,
    wird das angebene TEMPLATE als Vorlage für die Zone verwendet.
    Dabei wird primär nach einem entsprechenden kundenspezifischen und
    hilfsweise nach einem allgemeinen Template des angegebenen Namens gesucht.
bz  Anzeige: Welche Zeile der DNS-Zone stammt von wann und wem?
cz  Änderungs-Log für Zone anzeigen  lz  DNS-Zone anzeigen (AXFR)
ez  DNS-Zone editieren               dz  DNS-Zone löschen

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 =~ / ^ (AZ|az) (?: \s+ (\S+) )? \z /x ) {
			add_zone( $idi, 1 | ( $1 eq 'AZ' ? 8 : 0 ), defined $2 ? $2 : () );
			next;
		}
		if($act eq "ez") { edit_zone($idi,$kn); next; }
		if($act =~ /^lz(?:\s+(\S+))?$/) { list_zone($idi,$kn,$1); next; }
		if ( $act eq 'bz' ) { list_zonelog( blame => $idi ); next; }
		if ( $act eq 'cz' ) { list_zonelog( rlog  => $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;
