use utf8;
use warnings;
no warnings 'redefine';
use strict;
use Dbase::Globals qw(aufzaehlung);
use Dbase::Help qw(Do DoFn DoSelect);
use Fehler qw(problem warnung);
use Loader qw(edit_ipaddrs log_update);

sub set_hardware_interface_ip($;$) {
    my ( $id, $kunde ) = @_;
    $kunde ||= DoFn("SELECT kunde FROM hardware WHERE id = $id") if defined $id;
    defined( my $ip = edit_ipaddrs( $kunde, 1 | 2, 'Interface-IP' ) )
      or return;

    my $schon_assoziiert;
    {
        my @others;
        DoSelect {
            my ( $other_id, $other_name ) = @_;
            if ( defined $id && $other_id == $id ) { $schon_assoziiert = 1 }
            else {
                push @others,
                  "#$other_id" . ( defined $other_name && ":$other_name" );
            }
        }
        <<_;
	SELECT   hardware.id, hardware.name
	FROM     hardware, hardware_ip
	WHERE    hardware.id = hardware_ip.hardware
	     AND ( hardware.ende IS NULL OR hardware.ende >= UNIX_TIMESTAMP(NOW()) )
	     AND hardware_ip.ip = $ip
	ORDER BY hardware.id
_
        warnung(
            "Das ist übrigens auch die Interface-IP von\n"
              . aufzaehlung( { trenner => ",\n", letzter_trenner => " und\n" },
                @others )
              . '.'
        ) if @others;
    }

    if ( !$schon_assoziiert
        and my ( $other_id, $other_name ) =
        DoFn("SELECT id FROM hardware WHERE ip = $ip") )
    {
        if ( defined $id && $other_id == $id ) {
            return problem(
                'Das ist schon die primäre IP-Adresse dieses Hosts.');
        }
        else {
            warnung("Das ist übrigens die primäre IP-Adresse von #$other_id"
                  . ( defined $other_name && ":$other_name" )
                  . '.' );
        }
    }

    return $ip unless defined $id;

    if ($schon_assoziiert) {
        log_update(
            hardware =>
              id => $id,
            undef,
            interface_ip => '-',
            undef, $ip
        );
        Do("DELETE FROM hardware_ip WHERE hardware = $id AND ip = $ip");
        print "Zuordnung gelöscht.\n";
    }
    else {
        log_update(
            hardware =>
              id => $id,
            undef,
            interface_ip => '*',
            undef, $ip
        );
        Do("INSERT INTO hardware_ip SET hardware = $id, ip = $ip");
        print "Interface-Adresse zugeordnet.\n";
    }
}

1;
