use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(kpersinfo mpersinfo);
use Dbase::Help qw(Do DoFn);
use Fehler qw(problem warnung);
use Loader qw(
  current_user
  edit_hardwares
  log_update
  set_hardware_standort
  warn_leitungshardware
);

sub set_hardware_enthalten_in($$;$) {
	my ( $id, $kn, $kunde ) = @_;

	my ( $o_enthalten_in, $rack, $standort, $_kunde, $verantwortlich ) =
	  DoFn <<_
	SELECT enthalten_in, rack, standort, kunde, verantwortlich
	FROM   hardware
	WHERE  id = $id
_
	  or return problem "Hardwarekomponente #$id nicht gefunden!?";

	$kunde ||= $_kunde;

	return problem <<_ if defined $rack;
Diese Hardwarekomponente ist laut Housing-Datenbank (selbst) in ein Rack
eingebaut. Falls sie nun als Bauteil einer anderen Hardwarekomponente markiert
werden soll, muss zunächst diese Zuordnung in der Housing-Datenbank gelöscht
werden.
_
	warn_leitungshardware($id);

	defined( my $enthalten_in = edit_hardwares $kunde, $kn, 1 ) or return;
	return
	  if $enthalten_in eq '-'
	  ? !defined $o_enthalten_in
	  : defined $o_enthalten_in && $o_enthalten_in == $enthalten_in;

	my $add_sql = '';
	if ( $enthalten_in eq '-' ) {
		return set_hardware_standort( $id, $kn, $kunde,
			kpersinfo( current_user() ), 1 );
	}
	else {
		return problem(
			'Eine Hardware kann nicht in sich selbst eingebaut sein.')
		  if $enthalten_in == $id;
		my @enthalten_in = $enthalten_in;
		while ( defined( my $p_enthalten_in = DoFn <<_ ) ) {
	SELECT enthalten_in FROM hardware WHERE id = $enthalten_in[-1]
_
			push @enthalten_in, $p_enthalten_in;
			return problem
"Man kann Hardwarekomponenten nicht gegenseitig ineinander einbauen.\n("
			  . join( ' ist enthalten in ', map "#$_", @enthalten_in ) . '.)'
			  if $p_enthalten_in == $id;
		}
		if ( defined $standort ) {
			$add_sql = ', standort=NULL';
			log_update hardware =>
			  id                => $id,
			  undef,
			  standort => undef,
			  $standort;
			warnung "Bisheriger Standort #$standort:"
			  . mpersinfo($standort)
			  . " wurde gelöscht.";
		}
	}
	log_update hardware =>
	  id                => $id,
	  undef,
	  enthalten_in => undef,
	  defined $o_enthalten_in ? $o_enthalten_in : '-';

	if (
		!defined $verantwortlich
		&& defined( my $super_verantwortlich = DoFn(<<_) )
	SELECT verantwortlich FROM hardware WHERE id = $enthalten_in
_
	  )
	{
		warnung(<<_);
Übernehme den Verantwortlichen aus der übergeordneten Hardwarekomponente.
_
		$add_sql .= ", verantwortlich = $super_verantwortlich";
		log_update(
			hardware =>
			  id     => $id,
			undef,
			verantwortlich => undef,
			'-'
		);
	}
	Do "UPDATE hardware SET enthalten_in=$enthalten_in $add_sql WHERE id = $id";
	Do "UPDATE kunde SET geaendert=UNIX_TIMESTAMP(NOW()) WHERE id=$kunde";
}

1;
