use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(def_or_minus);
use Dbase::Help qw(Do DoFn DoSelect);
use Fehler qw(problem);
use Loader qw(add_messverbraucher edit_kunden line_in log_update);

sub set_hardware_kunde($;$) {
	my ( $idi, $kn ) = @_;
	my ($okk) = DoFn("SELECT kunde FROM hardware WHERE id = $idi")
	  or return problem "Hardware #$idi nicht gefunden.";
	my $kk = edit_kunden( 1, $kn );
	return undef unless defined $kk;
	return 0 if $kk == $okk;

    my @mv_ids;
    DoSelect { push @mv_ids, shift } <<_;
SELECT mess_verbraucher.id
  FROM mess_verbraucher
 WHERE mess_verbraucher.hardware = $idi
   AND mess_verbraucher.kunde = $okk
   AND ( mess_verbraucher.ende IS NULL OR mess_verbraucher.ende > UNIX_TIMESTAMP(NOW()) )
_

	if ( @mv_ids ) {
        return undef
        unless line_in(
'Die Hardware hat Messverbraucher zugeordnet. Diese werden dem neuen Kunden zugeordnet werden? '
        ) =~ /^[jy]/i;
	}

	log_update hardware => id => $idi, undef, 'kunde', undef, $okk;
	Do "UPDATE hardware SET kunde = $kk WHERE id = $idi";
	Do "UPDATE kunde SET geaendert=UNIX_TIMESTAMP(NOW()) WHERE id = $kk OR id = $okk";

	for (@mv_ids) {
		my ($ams, $aacct, $aende) = DoFn "SELECT mess_stelle, acct, ende FROM mess_verbraucher WHERE id = $_";

		log_update mess_verbraucher => id => $_, undef, 'ende', undef, def_or_minus($aende);
		Do "UPDATE mess_verbraucher SET ende = UNIX_TIMESTAMP(NOW()) WHERE id = $_";

		my ($other_mvid) = DoFn <<_;
SELECT id
  FROM mess_verbraucher
 WHERE mess_stelle = $ams
   AND hardware = $idi
   AND kunde = $kk
   AND ( ende IS NOT NULL OR ende >= UNIX_TIMESTAMP( NOW() ) )
_

		if ($other_mvid) {
			print <<_;
Der Kunde hat schon einen Messverbraucher mit der Messstelle.
Also hab ich bloss den alten Messverbraucher '$_' deaktiviert
und keinen neuen angelegt.
_
		}
		else {
			add_messverbraucher( undef, 1, $ams, $idi, $kk, $aacct, $aende );
		}
    }
	$kk;
}

1;
