use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(problem warnung);
use Loader qw(check_domain_delegation line_printer ticket_get_header);
use Dbase::Help qw(isotime DoSelect DoFn);
use Dbase::Globals qw(
  aufzaehlung
  bignum
  find_descr
  flag_names
  get_descr
  get_gruppen
  kpersinfo
  mpersinfo
  name_kunde
  puny_decode
  name_dienst
  test_gruppe
);
use Dbase::IP;

my $domainflag_dnszone = find_descr( domainflags => dnszone => 1 );
my $domainflag_nsentry = find_descr( domainflags => nsentry => 1 );
$_ = bignum(1) << $_ for $domainflag_dnszone, $domainflag_nsentry;

my ( $registriert_grs, $registriert_grc ) =
  get_gruppen( domainstatus_ident => registriert => 1 );

sub list_domain($;$) {
	my($idi,$kn) = @_;
	line_printer;

	DoSelect {
		my (
			$timestamp, $domain,    $kunde, $status,     $beginn,
			$ende,      $tname,     $info,  $ktarif,     $person,
			$mail_ip,   $nachricht, $owner, $adminc,     $techc,
			$zonec,     $billc,     $nic,   $auftragsnr, $nserver,
			$tsig,      $ticket,    $exp,   $flags,
		) = @_;

		print $Db::pr_fh "ID       : $idi\n";
		print $Db::pr_fh "Timestamp: ".isotime($timestamp)."\n";
		my $ddom = puny_decode($domain);
		if($domain eq $ddom) {
			print $Db::pr_fh "Domain   : $domain\n";
		} else {
			print $Db::pr_fh "Domain   : $ddom\n";
			print $Db::pr_fh "encDomain: $domain\n";
		}
		print $Db::pr_fh "Kunde    : #$kunde:".name_kunde($kunde)."\n" if $kunde;
		print $Db::pr_fh "Status   : ".get_descr('domainstatus',$status)." ($status)\n" if $status =~ /^\d+$/;
		print $Db::pr_fh "Beginn   : ".isotime($beginn)."\n" if $beginn;
		print $Db::pr_fh "Ende     : ".isotime($ende)."\n" if $ende;
		print $Db::pr_fh "Expire   : ".isotime($exp)."\n" if $exp;
		print $Db::pr_fh "Info     : $info\n" if $info;
		print $Db::pr_fh "Ticket K : ".ticket_get_header($ticket,32768|1) if $ticket;
		print $Db::pr_fh "Tarif    : $tname (vorgemerkt)\n" if defined $tname and not $ktarif;
		print $Db::pr_fh "Tarif    : $ktarif "
				.DoFn("select tarifname.name from tarifname,tarifkunde where tarifkunde.id = $ktarif and tarifname.id = tarifkunde.tarifname")
				."/".name_dienst(DoFn("select dienst from tarifkunde where id = $ktarif"))."\n"
			if $ktarif;
		print $Db::pr_fh "assoz.bei: #$person:".kpersinfo($person)."\n" if $person;
		print $Db::pr_fh "Mail-IP  : *.$mail_ip\n" if defined $mail_ip;
		print $Db::pr_fh "Registrar: ".get_descr('nic',$nic)."\n" if $nic;
		print $Db::pr_fh "AuftragNr: $auftragsnr\n" if defined $auftragsnr;
		print $Db::pr_fh "Firma    : #$owner:".mpersinfo($owner)."\n" if $owner;
		print $Db::pr_fh "Admin-C  : #$adminc:".mpersinfo($adminc)."\n" if $adminc;
		print $Db::pr_fh "Tech-C   : #$techc:".mpersinfo($techc)."\n" if $techc;
		print $Db::pr_fh "Zone-C   : #$zonec:".mpersinfo($zonec)."\n" if $zonec;
		print $Db::pr_fh "Bill-C   : #$billc:".mpersinfo($billc)."\n" if $billc;
		print $Db::pr_fh "benachr. : #$nachricht:".mpersinfo($nachricht)."\n" if $nachricht;
		if($nserver) {
			my($ip,$bit,$name)=DoFn("select ip6,bits,name from ipkunde where id=$nserver");
			$ip = Dbase::IP->new_db($ip,$bit);
			print $Db::pr_fh "Nameserv : #$nserver:$ip ".($name ? " $name" : "")."\n";
		}
		print $Db::pr_fh 'TSIG-Key : ' . get_descr(tsig=>$tsig) . "\n" if defined $tsig;
		print $Db::pr_fh "Flags    : ".flag_names($flags,"domainflags")."\n";

		if (
			!( $flags & $domainflag_nsentry )
			&& test_gruppe(
				domainstatus => $status,
				$registriert_grs, $registriert_grc
			)
		  )
		{
			my ( $error, $our_ns, $foreign_ns ) = check_domain_delegation($idi);

			warnung($error) if defined $error;

			if ( defined $our_ns && defined $foreign_ns ) {

				if ( @$our_ns && not $flags & $domainflag_dnszone ) {
					warnung('Die Domain ist '
						  . ( @$foreign_ns ? 'auch ' : '' ) . 'auf '
						  . aufzaehlung(@$our_ns)
						  . " delegiert,\n"
						  . 'Wir führen dafür aber keine DNS-Zone.' );
				}
				elsif ( !@$our_ns && $flags & $domainflag_dnszone ) {
					warnung('Wir führen hier unnötigerweise eine DNS-Zone, '
						  . "denn die Domain ist nur auf\n"
						  . aufzaehlung(@$foreign_ns)
						  . " delegiert.\n" );
				}
				else {
					print $Db::pr_fh 'DNS-Deleg: '
					  . ( $flags & $domainflag_dnszone
						? $nserver
						? @$foreign_ns
						? 'Master beim Kunden; wir sind Slave.'
						: 'externer hidden primary'
						: 'ausschließlich bei uns (Master)'
						: 'ausschließlich extern' )
					  . "\n";
				}

				print $Db::pr_fh 'DNS hier : '
				  . ( join( ', ', sort @$our_ns ) || '-' ) . "\n";
				print $Db::pr_fh 'DNS sonst: '
				  . ( join( ', ', sort @$foreign_ns ) || '-' ) . "\n";
			}
		}
	} <<_
	SELECT    domainkunde.timestamp,
	          domainkunde.domain,
	          domainkunde.kunde,
	          domainkunde.status,
	          domainkunde.beginn,
	          domainkunde.ende,
	          tarifname.name,
	          domainkunde.infotext,
	          domainkunde.ktarif,
	          domainkunde.person,
	          domainkunde.mail_ip,
	          domainkunde.nachricht,
	          domainkunde.owner,
	          domainkunde.adminc,
	          domainkunde.techc,
	          domainkunde.zonec,
	          domainkunde.billc,
	          domainkunde.nic,
	          domainkunde.auftragsnr,
	          domainkunde.nserver,
	          domainkunde.tsig,
	          domainkunde.ticket,
	          domainkunde.expires,
	          domainkunde.flags
	FROM      domainkunde
	LEFT JOIN tarifname ON domainkunde.tarifname = tarifname.id
	WHERE     domainkunde.id = $idi
_
		or problem "Domain '$idi' unbekannt";
}

1;
