# Überprüft, ob alle bei einer Person angegebenen IP-Adressen und optional
# zusätzliche neue alle zum selben VRF gehören.
# Falls ja, wird ein wahrer Wert zurückgegeben, andernfalls ein problem().

use strict;
use utf8;
use warnings;
no warnings 'redefine';

use Dbase::Help qw(DoSelect in_list);
use Dbase::IP ();
use Fehler qw(problem);

# $flag & 1: bisherige person.uremip nicht beachten

sub check_person_vrf($;$@) {
    my ( $person_id, $flag, @ip_ids ) = @_;
    $flag = 0 unless defined $flag;

    my @ips;
    DoSelect {
        my ( $typ, $ip, $bits ) = @_;
        push @ips, [ $typ, Dbase::IP->new_db( $ip, $bits ) ];
    }
    join <<1, $flag & 1 ? () : <<2, <<3, @ip_ids > 0 ? <<4 : ();
	UNION
1
	SELECT 'Peer-IP', ipkunde.ip6, ipkunde.bits
	FROM   ipkunde, person
	WHERE  ipkunde.id = person.uremip AND person.id = $person_id
2
	SELECT 'Route'  , ipkunde.ip6, ipkunde.bits
	FROM   ipkunde, ipmap
	WHERE  ipkunde.id = ipmap.ipkunde AND ipmap.person = $person_id
3
	SELECT 'neu'    , ipkunde.ip6, ipkunde.bits
	FROM   ipkunde
	WHERE  ${\ in_list( 'ipkunde.id', '', @ip_ids ) }
4
    return 1 if @ips < 2;

    my $last_vrf;
    for (@ips) {
        my $vrf = $_->[1]->is_v4rf == 2 ? $_->[1]->vrf_id : -1;

        unless ( defined $last_vrf ) { $last_vrf = $vrf }
        elsif ( $last_vrf != $vrf ) {
            return problem(
                join "\n",
                'Zugeordnete IP-Adressen liegen in unterschiedlichen VRFs:',
                map sprintf( '%8s %s', "$_->[0]:", $_->[1]->str(4) ),
                @ips
            );
        }
    }

    1;
}

1;
