use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(problem);
use Loader qw(select_date log_update add_kunde_ipaddr serve_ipnr);
use Dbase::Help qw(DoFn Do DoCopy DoTime DoTrans isotime);
use Dbase::Globals qw(timerange);
use Dbase::IP;

sub copy_ipnr($;$$$$) {
	my($id,$kn,$nipaddr,$datum) = @_;

	my($kid,$beginn,$ende,$ip,$bits) = DoFn("select kunde,beginn,ende,ip6,bits from ipkunde where id = $id");
	$ip= Dbase::IP->new_db($ip,$bits);

	unless($nipaddr) {
		$nipaddr = add_kunde_ipaddr($kid,$kn,1,$ip->db_bits,"Neue Adresse");
		return undef unless defined $nipaddr;
	}
	return problem "Die Adressbreite kann nicht geändert werden"
		if $ip->db_bits != $nipaddr->db_bits;

	unless($datum) {
		$datum = select_date(256, "ab Zeitpunkt",undef,qw(= jetzt));
		return undef unless defined $datum;
		$datum = DoTime if $datum eq "=";
	}

	return problem "Datum nicht im Bereich ".timerange($beginn,$ende)." !\n"
		if $datum < $beginn or defined $ende and $datum > $ende;
	{
		my $oid = DoFn("select id from ipkunde where ${\ $nipaddr->dbs } and (ende is null or ende >= UNIX_TIMESTAMP(NOW()))");
		return problem "Adresse bereits bekannt: #$oid" if $oid;
	}

	my $nid;
	DoTrans {
		$nid = DoCopy("ipkunde","id = $id", id=>undef, beginn=>$beginn, ende=>$datum);
		log_update("ipkunde","id",$id,undef,"beginn","ip","id",undef,scalar isotime($beginn),$ip->str,$nid);
		log_update("ipkunde","id",$nid,undef,"ende","id",undef, $ende ? scalar isotime($ende) : "-",$id);
		Do("update ipkunde set beginn = $datum, ${\ $nipaddr->dbi } where id = $id");
	};
	serve_ipnr($nid,0);
	serve_ipnr($id,1);

	print "IP-Adresse geändert (alt: #$nid)\n";
	$nid;
}
1;
