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

use Dbase::Help qw(Do DoFn DoT DoTime);
use Dbase::Globals qw(find_dienst get_descr get_ipnum);
use Loader qw(check_ipnr_net log_update serve_ipnr_free_range);
use Fehler qw(problem warnung);
use Cf qw($DEFAULT_ZIEL);

sub get_free_ipaddr($$) {
	my($adr,$id)=@_;

	my $datum = DoTime;

	if ( my $res = DoT <<_ ) {
		SELECT kunde.id, kunde.name, ipkunde.id
		FROM   kunde, ipkunde
		WHERE  ipkunde.kunde = kunde.id
			AND ${\ $adr->dbs("ipkunde") }
			AND ipkunde.beginn <= $datum
			AND ( ipkunde.ende IS NULL OR ipkunde.ende > $datum )
_
		my($kunde_id, $kunde_name, $_id) = @{$res->[0]};
		return problem 'Diese' . ($adr->db_bits ? 'r IP-Adressbereich' : ' IP-Adresse')
		               . " ist bereits als #$_id "
		               . ( $id != $kunde_id && "bei Kunde #$kunde_id ($kunde_name) " )
		               . 'eingetragen.';
	}

	my($ziel);
	if ( my $_id = get_ipnum($adr) ) {
		$ziel = DoFn("SELECT dest FROM ipkunde WHERE id = $_id");
		$ziel = "NULL" unless defined $ziel;
	} else {
		warnung sprintf <<_, get_descr(ziel=>($ziel = ord($DEFAULT_ZIEL)));
Da es hierzu keinen übergeordneten IP-Adressbereich in der Datenbank gibt,
wurde automatisch Ziel '%s' gesetzt.
(Falls Du keine Ahnung hast, ob das so passt, frag jemanden aus Team Netz!)
_
	}

	my $dienst = find_dienst("ip")
		or return problem "Dienst 'ip' nicht gefunden";

	my $idi = Do(<<_);
	INSERT INTO ipkunde SET
		${\ $adr->dbi },
		beginn  = $datum,
		dest    = $ziel,
		kunde   = $id,
		mail_ip = ( SELECT mail_ip FROM kunde WHERE id = $id ),
		tarif   = $dienst
_
	log_update("ipkunde","id",$idi,undef,"ipaddr","*",undef,$adr->str);

	log_update("kunde","id",$id,undef,"ipkunde","*",undef,$idi);
	Do("update kunde set geaendert=UNIX_TIMESTAMP(NOW()) where id = $id");

	serve_ipnr_free_range($adr,$id);
	check_ipnr_net($adr);

	return $idi;
}

1;
