use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(bignum list_descr persinfo);
use Dbase::Help qw(Do DoFn isotime DoTime);
use Fehler qw(problem warnung);
use Loader qw(check_overlap select_date serve_ipnr log_update
	serve_ipnr_free_range);
use Dbase::IP;

sub set_ipnr_datum($;$$$) {
	my ( $idi, $kn, $neu_beginn, $neu_ende ) = @_;
	my $datum;
	my($kunde, $adr,$bit, $beginn,$ende, $mac) = DoFn("select kunde, ip6,bits, beginn,ende, mac from ipkunde where id = $idi");

	$adr = Dbase::IP->new_db($adr,$bit);
	$ende=0 if not defined $ende;
	my $done;

	unless ( defined $neu_beginn || defined $neu_ende ) {
		$neu_beginn = select_date( 256, 'Startdatum', undef, qw(= jetzt) );
		$neu_ende = select_date(
			16 | 256 | 1024, 'Enddatum', undef,
			'=' => 'jetzt',
			0   => 'Enddatum löschen'
		);
	}

	unless ( defined $neu_beginn ) { $neu_beginn = $beginn }
	elsif ( $neu_beginn eq '='   ) { $neu_beginn = DoTime  }

	unless ( defined $neu_ende ) { $neu_ende = $ende  }
	elsif ( $neu_ende eq '='   ) { $neu_ende = DoTime }

	if ( my $id = check_overlap ipkunde=>id=>$idi, 'ip6,bits', $neu_beginn, $neu_ende ? $neu_ende : undef ) {
		return problem(<<_);
Diese Daten können nicht gesetzt werden, da sich dadurch eine zeitliche
Überschneidung mit IP-Objekt #$id ergeben würde.
_
	}
	if ( $mac and my $id = check_overlap( ipkunde => id => $idi, 'mac', $neu_beginn, $neu_ende) ) {
		return problem(<<_);
Diese Daten können nicht gesetzt werden, da sich dadurch eine zeitliche
Überschneidung mit IP-Objekt #$id ergeben würde, wo dieselbe MAC-Adresse
($mac) gesetzt ist.
_
	}
	return problem('Das Enddatum darf nicht vor dem Startdatum liegen.')
		if defined $neu_beginn && $neu_ende && $neu_beginn > $neu_ende;

	if ($neu_beginn != $beginn) {
		log_update("ipkunde","id",$idi,undef,"beginn",undef,
			scalar isotime $beginn);
		Do("update ipkunde set beginn = $neu_beginn where id = $idi");
		Do("update kunde set geaendert = UNIX_TIMESTAMP(NOW()) where id = $kunde") if $kunde;
		serve_ipnr_free_range( $adr, $kunde ) if $adr->db_bits;

		serve_ipnr($idi,1,$kn) if ($beginn > DoTime) and ($neu_beginn < DoTime+10000);

		$done += 2;
	}

	if ($neu_ende != $ende) {
		if ($neu_ende) {
			my($pers, $mode);
			if ( $pers = DoFn("select id from person where uremip = $idi"    ) and $mode = 1 or
			     $pers = DoFn("select person from ipmap where ipkunde = $idi") and $mode = 2 ) {
				my $mask;
				list_descr pwdomain => undef, 'connect,!hide', sub { $mask |= bignum(1) << $_[1] };
				warnung $mode == 1 ? <<_ : <<_ if DoFn <<_;
Diese IP-Adresse ist folgendem Einwahl-Account zugeordnet:
${\persinfo $pers}
Der bekommt bei künftigen Einwahlen dann also dynamisch eine IP-Adresse
zugewiesen, und der anfallende Traffic kann nicht mehr accountet werden.
_
Dieser IP-Adressbereich ist folgendem Einwahl-Account zugeordnet:
${\persinfo $pers}
Den kriegt er künftig dann also nicht mehr geroutet. Nun gut.
_
	SELECT 1
	FROM   kunde, person
	WHERE  person.id = $pers
	   AND person.pwuse & $mask != 0
	   AND kunde.id = person.kunde
	   AND ( kunde.ende IS NULL                  OR
	         kunde.ende >= UNIX_TIMESTAMP(NOW()) )
_
			}
		}
		log_update("ipkunde","id",$idi,undef,"ende",undef,scalar isotime $ende);
		serve_ipnr($idi,0,$kn) if (not $ende or $ende >= DoTime) and ($neu_ende > 0 and $neu_ende <= DoTime+10000);
		$neu_ende = "NULL" if $neu_ende == 0;
		Do("update ipkunde set ende = $neu_ende where id = $idi");
		Do("update kunde set geaendert = UNIX_TIMESTAMP(NOW()) where id = $kunde") if $kunde;

		serve_ipnr_free_range( $adr, $kunde ) if $adr->db_bits;

		$done++;
	}

	$done;
}

1;
