use utf8;
use strict;
use warnings; no warnings "redefine";
use Cf qw($FORBIDDEN_DOMAINS);
use Dbase::Globals qw(aufzaehlung content def_or_minus get_bitmap name_kunde);
use Dbase::Help qw(Do DoFn DoSelect qquote);
use Fehler qw(problem report_status warnung);
use Loader qw(line_in line_ja_nein log_update serve_ipnr valid_fqdn);

my $monitoring_flag_is_set;
{
	my $bitmap;
	$monitoring_flag_is_set = sub {
		my ($flags) = @_;
		$flags & ( $bitmap ||= get_bitmap( ipflags => monitoring => 1 ) );
	};
}

sub set_ipnr_info($;$) {
	my($idi,$kn) = @_;
	my($id,$bits,$oinfo,$flags) = DoFn("SELECT kunde, bits, name, flags FROM ipkunde WHERE id = $idi");

	warnung(<<_) if content($oinfo) and DoFn("select count(*) from ip_hostgroup where host=$idi") || $monitoring_flag_is_set->($flags);
Dieser Host wird offenbar überwacht.
Die Änderung seines DNS-Namens kann daher zu Inkonsistenzen
in der Monitoring-Konfiguration führen, vgl. RT#311419.
=> Bitte mach das nur, wenn Du wirklich weißt, was Du tust!
   Andernfalls lass Dir bitte von Team Admin helfen!
_

	my $isdom = 1;

	content ( my $kk = line_in $bits ? 'Netzname: ' : 'FQDN: ' ) or return;

	if($kk eq "-") {
		# nix zu tun
	} elsif ( !$bits and !valid_fqdn($kk) ) {
		return problem qq("$kk" ist kein gültiger FQDN.);
	} elsif ( !$bits && grep $kk =~ /(?:^|\.)\Q$_\E$/, split ' ', $FORBIDDEN_DOMAINS ) {
		return problem 'Diese Domain ist gesperrt, vgl. RT#221083.';
	} elsif (  $bits && $kk !~ /^[A-Z0-9][A-Z0-9-]*[A-Z0-9]$/i ) {
		return problem qq("$kk" ist kein gültiger Netzname.);
	}

	if ( $kk ne '-' ) {

		if ( $bits == 0 ) {
			my $dom = $kk;
			while (1) {
				my ($kd) = DoFn <<_ or next;
	SELECT kunde
	FROM   domainkunde
	WHERE  domain = '$dom'
	   AND ( beginn IS NULL                  OR
	         beginn  = 0                     OR
	         beginn <= UNIX_TIMESTAMP(NOW()) )
	   AND ( ende   IS NULL                  OR
	         ende   >= UNIX_TIMESTAMP(NOW()) )
_
				warnung("VORSICHT: Diese Domain gehört Kunde #$kd.")
				  if $kd != $id;
				last;
			}
			continue {
				if ( $dom !~ s/^.*?\.// ) {
					warnung("VORSICHT: Diese Domain ist unbekannt.");
					last;
				}
			}
		}
		else { $isdom = 0 }

		my @aktiv_bei_kunden;
		DoSelect { push @aktiv_bei_kunden, @_ } <<_;
	SELECT DISTINCT kunde
	FROM   ipkunde
	WHERE  name = ${\ qquote($kk) }
	   AND ( ende IS NULL OR ende >= UNIX_TIMESTAMP(NOW()) )
_
		if (@aktiv_bei_kunden) {

			warnung('Dieser '
				  . ( $bits ? 'Netzname' : 'FQDN' )
				  . ' ist bereits bei Kunde'
				  . ( @aktiv_bei_kunden != 1 && 'n' ) . ' '
				  . aufzaehlung( sort map name_kunde($_), @aktiv_bei_kunden )
				  . ' eingetragen.' );

			if ( @aktiv_bei_kunden > 1 || $aktiv_bei_kunden[0] != $id ) {
				report_status();
				line_ja_nein( 'Trotzdem eintragen', undef, undef, 'nein' )
				  or return;
			}
		}
	}

	serve_ipnr($idi,0,$kn) unless $bits;
	log_update("ipkunde","id",$idi,undef,"name",undef,def_or_minus($oinfo));
	Do("update ipkunde set name=${\qquote $kk,1} where id=$idi");
	serve_ipnr($idi,1,$kn) if !$bits && $isdom;

	if($id > 0) {
		Do("update kunde set geaendert=UNIX_TIMESTAMP(NOW()) where id=$id");
	}
}

1;
