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

use Cf qw($VRF_PREFIX);
use Dbase::Globals qw(content timerange
	get_descr DoSelect_flaglist gen_flaglist name_kunde);
use Dbase::Help qw(DoSelect in_list);
use Dbase::IP;
use noris::Table;

# Flag:
# 1: auch beendete Adressen
# 2: nur Netze
# 4: IPv6-Adressen
# 8: keine IPv4-Adressen

## Bits 4+8:
## l          0   IPv4 und VRFs als !
## ll         4   IPv4 und IPv6, VRFs als !
## l4         8   IPv4, keine VRFs
## l6       4|8   IPv6, VRFs als IPv6-Adressen

my $gvrf;
# 
sub list_ipaddrs($;$$$@) {
	my($id,$kn,$flag,$vrf,@where) = @_;

	$flag=0 unless defined $flag;
	$gvrf = Dbase::IP->new($VRF_PREFIX)->bitmask(48)
		unless defined $gvrf;

    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;
    }

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

	my $all =
	  !( $flag & 1 ) && " AND ( ende IS NULL OR ende > UNIX_TIMESTAMP(NOW()) )";

	$all .= " AND bits > 0" if $flag & 2;

	$all .= {
		0  => (defined $vrf) ? '' :
			  " AND ( ip6 LIKE '" . ( '0' x 24 ) . "%' " .
			  "  OR ${\$gvrf->dbsub} )",                      # nur IPv4
		4  => '',                                             # IPv4 + IPv6
		8  => " AND ip6 LIKE '" . ( '0' x 24 ) . "%' ",
		12 => " AND ip6 NOT LIKE '" . ( '0' x 24 ) . "%'",    # nur IPv6
	}->{ $flag & 12 };

	if(defined $vrf) {
		my $ip = (Dbase::IP->new($VRF_PREFIX)->bitmask(32) + $vrf)->db_ip6;
		$ip = substr($ip,0,24);
		$all .= " AND ip6 LIKE '${ip}%'";
	}

	my $hpr = sub {
		my $delim = "|"x (0+@_);
		$t->titel($delim, "ID","Kunde","Adress{e,bereich}","Ziel","FQDN/Netzname","Zeitraum");
		$t->skip(1) if $delim eq "";
		$t->skip(3) unless $mehrere_kunden;
		$t->skip(7) unless $flag & 1;
		$t->ausrichten(right=>2);
		$t->ausrichten(left=>4);
END
	};

	my $where = (@where > 0) ? ' AND ' . join ' AND ', @where : "";
	my @res = DoSelect_flaglist "ipflags", sub {
		my($flags,$id,$kid,$ip,$ipbits,$beginn,$ende,$ziel,$info) = @_;
		$ip = Dbase::IP->new_db($ip,$ipbits);

		$info = "" unless content $info;

		$ip = $ip->mask4 if defined $vrf and not ($flag&12);
		$kid = name_kunde($kid) if $mehrere_kunden;
		$t->daten($flags,$id, $kid, $ip->str(($flag&8) ? 0 : 4),
		  ( defined $ziel ) ? substr( get_descr( ziel => $ziel ), 0, 1 ) : '-',
		  $info, timerange($beginn,$ende) );
	}, <<_, undef, \&$hpr;
	SELECT   flags, id, kunde, ip6, bits, beginn, ende, dest, name
	FROM     ipkunde
	WHERE    1 $where $all
	ORDER BY ende, ip6, bits DESC
_
	$t->drucken(
		pre  => scalar gen_flaglist( 1, @res ),
		post => scalar gen_flaglist( 0, @res ),
	);
}

1;
