use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(content kpersinfo);
use Dbase::Help qw(Do DoFn DoSelect);
use Fehler qw(warnung problem);
use Loader qw(check_person_vrf log_update edit_ipaddrs line_in);

my $check_metrik = sub {
	my ($metrik) = @_;
	return problem(
		'Als Metrik sind nur ganze Zahlen zwischen 0 und 255 erlaubt.')
	  if $metrik !~ /^\d+\z/ || $metrik < 0 || $metrik > 255;
	1;
};

sub set_person_ipliste($;$) {
	my($pers,$kn) = @_;

	while(1) {
		my $ip = edit_ipaddrs(DoFn("select kunde from person where id = $pers"),1+4,$kn.' Route');
		return undef unless defined $ip;

		if($ip eq "-") {
			print "Lösche alle Einträge.\n";
			log_update("ipmap","person",$pers,undef,"-");
			Do("delete from ipmap where person = $pers");
		} else {
			DoSelect {
				my ($person) = @_;
				warnung "Dieser Eintrag ist auch Person #$person (" . kpersinfo($person) . ') zugeordnet.'
					if defined $person && $person && $person != $pers;
			} "SELECT person FROM ipmap WHERE ipkunde = $ip ORDER BY person";

			if ( defined( my $metrik = DoFn(<<_) ) ) {
	SELECT metrik FROM ipmap WHERE ipkunde = $ip AND person = $pers
_
				content(
					my $neue_metrik = line_in( qq(Route hat Metrik $metrik; "-" = löschen, Zahl = neue Metrik> ) )
				) or return;

				if ( $neue_metrik eq '-' ) {
					log_update(
						ipmap  => ipkunde => $ip,
						person => $pers,
						metrik => $metrik,
						undef, '-'
					);
					Do(<<_);
	DELETE FROM ipmap WHERE ipkunde = $ip AND person = $pers
_
					print "Gelöscht.\n";
				}
				elsif ( !$check_metrik->($neue_metrik) ) { return }
				elsif ( $neue_metrik == $metrik ) {
					print "Keine Änderung.\n";
				}
				else {
					log_update(
						ipmap  => ipkunde => $ip,
						person => $pers,
						undef,
						metrik => undef,
						$metrik
					);
					Do(<<_);
	UPDATE ipmap
	   SET metrik = $neue_metrik
	 WHERE ipkunde = $ip AND person = $pers
_
				}
			} else {
				my $metrik = line_in( 'Metrik> ', undef, undef, 0 );
				$metrik ||= 0;
				return
				  unless $check_metrik->( $metrik ||= 0 )
				  && check_person_vrf( $pers, 0, $ip );

				log_update ipmap => ipkunde => $ip, person => $pers, undef, '-';
				Do("INSERT INTO ipmap (person, ipkunde, metrik) VALUES ($pers, $ip, $metrik)");
				print "Eingefügt.\n";
			}
		}
	}
}

1;
