use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(kpersinfo timerange name_kunde);
use Dbase::Help qw(DoFn DoSelect in_list);
use Fehler qw(problem);
use Loader qw(line_printer);
use Dbase::IP;
use noris::Table;

# $flag & 1: auch beendete Geräte anzeigen
# $flag & 2: auch Geräte ohne Hardware-ID anzeigen
# $flag & 4: nur Geräte mit primärer IP-Adresse anzeigen

sub list_hardwares(;$$@) {
	my ( $kunde_id, $flag, @where ) = @_;

    my $mehrere_kunden;
    if ( ref $kunde_id ) {
        push @where, in_list( "hardware.kunde" => '', @$kunde_id );
        $mehrere_kunden = 1;
    } elsif ( defined $kunde_id ) {
        push @where, "hardware.kunde = $kunde_id";
    } else {
        $mehrere_kunden = 1;
    }

	push @where, '( hardware.ende IS NULL or hardware.ende > UNIX_TIMESTAMP(NOW()) )'
	  unless $flag & 1;
	push @where, 'hardware.ip IS NOT NULL' if $flag & 4;

	my $where = @where > 0 && "\n\tWHERE     " . join "\n\t      AND ", @where;
	my $ohne_id;
	my $t = noris::Table->new()->titel("ID", "Kunde", "Name etc.", "Standort", "Zeitraum");
	$t->skip(5) unless $flag & 1;
	$t->skip(2) unless $mehrere_kunden;
	$t->ausrichten(right=>1);

	DoSelect {
		my ( $id, $kid, $name, $hardware_id, $standort, $rack, $unterste_he, $he, $beginn, $ende, $enthalten_in, $ip,$bits, $fqdn ) = @_;

		my $at = '';
		while ($enthalten_in) {
			( my $enthalten_in_id, my $enthalten_in_hardware_id, my $enthalten_in_name, $enthalten_in, $rack, $unterste_he, $he ) =
			DoFn(<<_);
	SELECT id, hardware_id, name, enthalten_in, rack, unterste_he, he
	FROM   hardware
	WHERE  id = $enthalten_in
_
			$at .= " in #$enthalten_in_id:$enthalten_in_name"
			       . ( defined $enthalten_in_hardware_id && " [#$enthalten_in_hardware_id]" );
		}

		if ( $flag & 2 or defined $hardware_id ) {
			if ( defined $standort ) {
				return problem "Bei Hardware #$id sind Standort (#$standort) UND Rack (#$rack) gesetzt!?"
				  if defined $rack;
				$at = ' @ ' . kpersinfo($standort) . $at;
			}
			elsif ( defined $rack ) {
				my( $rack_name, $rz_name ) = DoFn <<_
	SELECT rack.name, rz.name
	FROM   rack, rz
	WHERE  rack.id = $rack AND rack.rz = rz.id
_
				  or return problem "Hardware #$id: Rack #$rack ist keinem RZ zugeordnet!?";
				$at = ' @ ' . "$rz_name, $rack_name"
				      . ( defined $unterste_he && ", HE $unterste_he" . ( defined $he && "+$he" ) )
				      . $at;
			}
			# Trennung von Variablen-Deklaration und bedingter
			# Initialisierung wichtig, vgl. RT#244828:
			my $timerange = "";
			$timerange = timerange( $beginn, $ende ) if $flag & 1;
			$ip = Dbase::IP->new_db($ip,$bits) if defined $bits;
			my $kunde;
			$kid = name_kunde($kid) if $mehrere_kunden;
			$at =~ s/^\s+(?:\@\s*)?//;
			$t->daten($id, $kid, $name.(
			  $fqdn ? " ($fqdn)" : defined $bits && ' [' . $ip->str(4) . ']').
			  ( defined $hardware_id && " [$hardware_id]" ), $at,
			  $timerange);
		}
		else { ++$ohne_id }
	  }
	  <<_;
	SELECT    hardware.id,
	          hardware.kunde,
	          hardware.name,
	          hardware.hardware_id,
	          hardware.standort,
	          hardware.rack,
	          hardware.unterste_he,
	          hardware.he,
	          hardware.beginn,
	          hardware.ende,
	          hardware.enthalten_in,
	          ipkunde.ip6,ipkunde.bits,
	          ipkunde.name
	FROM      hardware
	LEFT JOIN ipkunde ON hardware.ip = ipkunde.id$where
	ORDER BY  hardware.name, ipkunde.name, hardware.ende
_

	$t->drucken( trailer => $ohne_id ? ($ohne_id == 1) ? <<_1 : <<_2 : "" );
(ein weiteres Gerät ohne Hardware-IDs)
_1
($ohne_id weitere Geräte ohne Hardware-IDs)
_2
}

1;
