use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(Do DoFn);
use Fehler qw(problem);
use Loader qw(edit_ipaddrs log_update);

sub set_ipnr_parent($;$$) {
	my ( $id, $kn, $kunde ) = @_;
	$kunde ||= DoFn("SELECT kunde FROM hardware WHERE id = $id");
	defined( my $ip = edit_ipaddrs($kunde, 1 | 2, 'Parent-Objekt') )
	  or return;
	if ( my($_id) = DoFn("SELECT id FROM iptree WHERE child = $id AND parent = $ip") ) {
		log_update( ipkunde => id => $id, undef, 'parent', '-', undef, $ip );
		Do("DELETE FROM iptree WHERE id = $_id");
		print "Zuordnung gelöscht.\n";
	}
	elsif ( $ip == $id ) {
		return problem 'Ein Objekt kann nicht sein eigener Parent sein.';
	}
	else {
		{
			my @todo = $ip;
			while ( defined( my $todo = shift @todo ) ) {
				my $loop;
				DoSelect {
					my($parent) = @_;
					push @todo, $parent;
					return unless $parent == $id;
					++$loop;
					problem <<_;
Dieses Objekt kann nicht IP-Adress-Objekt #$ip als Parent bekommen,
da sich dadurch eine zirkuläre Referenz ergeben würde.
_
				} "SELECT parent FROM iptree WHERE child = $todo";
				return if $loop;
			}
		}
		log_update( ipkunde => id => $id, undef, 'parent', '*', undef, $ip );
		Do("INSERT INTO iptree (child,parent) VALUES ($id,$ip)");
		print "Parent eingetragen.\n";
	}
}

1;
