use utf8;
use warnings;
no warnings "redefine";
use strict;
use Loader qw(check_domain_delegation);
use Dbase::Globals qw(
  bignum
  DoSelect_flaglist 
  find_descr
  gen_flaglist 
  get_descr
  get_gruppen
  name_kunde
  puny_decode
  test_gruppe
  timerange
);
use Dbase::Help qw(in_list);
use Term::ANSIColor qw(BOLD RESET UNDERLINE);
use noris::Table;

my $domainflag_dnszone = find_descr( domainflags => dnszone => 1 );
my $domainflag_nsentry = find_descr( domainflags => nsentry => 1 );
my $domainflag_wichtig = find_descr( domainflags => 'wichtig' );
$_ = defined() ? bignum(1) << $_ : 0
  for $domainflag_dnszone, $domainflag_nsentry, $domainflag_wichtig;

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

sub list_domains($;$@) {
    my ( $id, $all, @where ) = @_;

    my $mehrere_kunden;
    if ( ref $id ) {
        push @where, in_list( kunde => '', @$id );
	$mehrere_kunden = 1;
    }
    elsif ( defined $id ) {
        push @where, "kunde = $id";
    }
    else {
        $mehrere_kunden = 1;
    }

    push @where, '( ende IS NULL OR ende > UNIX_TIMESTAMP(NOW()) )' unless $all;

    my $err = 0;
    my $t = noris::Table->new();

    my $hpr = sub {
        my $delim = "|"x (0+@_);

        $t->titel(
            $delim,
            { name => 'ID',     format => '%5s' },
            { name => 'Kunde',  format => ' %-16s' },
            { name => 'Domain', format => ' %s' },
            { name => 'Status', format => ' (%s/' },
            { name => 'Deleg.', format => '%s' },
            { name => 'NIC',    format => ' @%s)' },
            { name => 'Zeit',   format => ' %s' },
            { name => '?',      format => ' %s' },
        );
        $t->skip(1) if $delim eq "" || $ENV{KUNDE_NO_TABLES};
        $t->skip(3) unless $mehrere_kunden;
        $t->skip(8) unless $all;
        $t->ausrichten(right=>1);
END
    };

    my @res = DoSelect_flaglist "domainflags", sub {
        my (
            $flag_chars, $flags,  $id,     $kunde, $status,
            $nic,        $domain, $beginn, $ende,  $nserver,
        ) = @_;

        my $domain_ist_wichtig = $flags & $domainflag_wichtig ? 1 : '';

	my ( $error, $delegation );
	my $_domain = puny_decode($domain);
	if (
		!( $flags & $domainflag_nsentry )
		&& test_gruppe(
			domainstatus => $status,
			$registriert_grs, $registriert_grc
		)
	  )
	{
		$t->info("Prüfe:",$_domain);
		( $error, my $our_ns, my $foreign_ns ) = check_domain_delegation($id);

		$error = $t->ansi(BOLD) . $error . $t->ansi(RESET) if defined $error;

		if ( defined $our_ns && defined $foreign_ns ) {
			unless (@$foreign_ns) {
				if ( $flags & $domainflag_dnszone ) {
					$delegation = 'Master';
				}
				else {
					$delegation = $t->ansi(BOLD) . 'Fehler' . $t->ansi(RESET);
					$error =
					    $t->ansi(BOLD)
					  . 'Für diese Domain fehlt bei uns offenbar die DNS-Zone.'
					  . $t->ansi(RESET);
				}
			}
			elsif ( !@$our_ns ) {
				$delegation = $nserver;
				$error = 'Wir führen dafür unnötigerweise eine DNS-Zone.'
				  if defined !$error && $flags & $domainflag_dnszone;
			}
			else {
				(
					$delegation = sprintf '%1s%5d',
					@$foreign_ns ? 's' : 'S', ( $nserver ? $nserver : '' )
				) =~ y/ /_/;
			}
		}
		$t->info();
	}

        $_domain = uc $_domain if $domain_ist_wichtig;
	my $ws = $domain_ist_wichtig ? $t->ansi(BOLD) : "";
	my $we = $domain_ist_wichtig ? $t->ansi(RESET) : "";
	$t->daten($flag_chars, $ws.$id, name_kunde($kunde), $_domain, get_descr( domainstatus => $status, 1 ),
		defined $delegation ? $delegation : '', get_descr( nic => $nic, 1 ) . $we,
		$all ? timerange( $beginn, $ende ) : '',
		$error || "");
	$err++ if defined $error;
    },
    <<1 . ( @where > 0 && <<2 ) . <<3, undef, \&$hpr;
	SELECT   flags, flags, id, kunde, status, nic, domain, beginn, ende, nserver
	FROM     domainkunde
1
	WHERE    ${\ join ' AND ', @where }
2
	ORDER BY ende, domain
3

  out:
	$t->skip(9) unless $err;
	$t->drucken(
		pre  => scalar gen_flaglist( 1, @res ),
		post => scalar gen_flaglist( 0, @res ),
        );
}

1;
