use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(DoFn);
use Dbase::IP;
use Fehler qw(problem);
use Loader qw(line_printer);
use noris::DNS::Resolver;

# excl: IP-Objekt, das nicht betrachtet werden soll
# $cb: Callback, das mit 'gefundenen' Adressen (IP-Objekte) gefüttert wird
## TODO: Callback mit Adressbereichen aufrufen

sub show_reverse($;$&) {
	my ( $ip, $excl, $cb )   = @_;

	my $bits;
	if(ref $ip) {
		$bits = $ip->db_bits;
	} else {
		($ip,$bits) =
		  DoFn "SELECT ip6,bits FROM ipkunde WHERE id = $ip"
		  or return problem "IP-Adressbereich #$ip nicht gefunden.";
		$ip = Dbase::IP->new_db($ip,$bits);
	}
	my $resolver = noris::DNS::Resolver->new
	  or return problem 'Konnte kein noris::DNS::Resolver-Objekt erzeugen.';
	line_printer;
	local $| = 1;

	$ip = $ip->bitmask(0);
	for ( 1 .. 1 << $bits ) {
		next if defined $excl and $excl->contains($ip);

		my $fqdn = $ip->revstr;
		printf $Db::pr_fh '%-16s ', "$ip:"
			unless ref $cb;
		my $answer = $resolver->send( $fqdn, ( ref $cb ) ? 'ANY' : 'PTR' )
		  or return problem(
			"Fehler bei DNS-Auflösung für $fqdn: " . $resolver->errorstring );
		if ( $answer->header->ancount ) {
			if(ref $cb) {
				&$cb($ip,$answer);
			} else {
				print $Db::pr_fh join "              -> ",
				  map sprintf( "%-6s %s\n", $_->type . ':', $_->rdatastr ),
				  $answer->answer;
			}
		}
		else {
			print $Db::pr_fh "-\n"
				unless ref $cb;
		}
	}
	continue { ++$ip }
}

1;
