use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(get_rz_from_ipkunde);
use Dbase::Help qw(DoFn DoSelect);
use Loader qw(line_printer);
use noris::Table;

# $flag & 1: auch beendete Messstellen anzeigen
# $flag & 2: auch die ohne Verbraucherzuordnung
# $flag & 4: nur die ohne Verbraucherzuordnung
# $flag & 8: auch beendete Messverbraucher anzeigen
sub list_messstellen(;$@) {
    my ( $flag, @where ) = @_;
    $flag = 0 unless defined $flag;

    push @where, 'mess_verbraucher.hardware IS NOT NULL'
      unless $flag;
    push @where, '( mess_stelle.ende IS NULL OR mess_stelle.ende > UNIX_TIMESTAMP(NOW()) )'
      unless $flag & 1;
    push @where, '( mess_verbraucher.ende IS NULL OR mess_verbraucher.ende > UNIX_TIMESTAMP(NOW()) )'
      if ( !($flag & 8) and !($flag & 2) and !($flag & 4) );

    my $join = " JOIN mess_verbraucher ON mess_stelle.id = mess_verbraucher.mess_stelle \n";
    if ( $flag & 2 ) {
        $join = '';
    }
    elsif ( $flag & 4 ) {
        $join = '';
        push @where, <<_
  NOT EXISTS (
     SELECT *
       FROM mess_verbraucher
      WHERE mess_verbraucher.mess_stelle =  mess_stelle.id
  )
_
    }

    my $where = @where > 0 && "\n WHERE     " . join "\n   AND ", @where;
    line_printer;
    ( my $t = noris::Table->new )->titel(
        { name => "ID",         format => '%5s' },
        { name => "Messstelle", format => ' %s' },
        { name => "Typ",        format => ' %s' },
        { name => "OID-Präfix", format => ' %s' },
        { name => "OID",        format => ' %s' },
        { name => "Messsytem",  format => ' %s' },
        { name => "Verbraucher",format => ' %s' },
    );

    my %ipk_rz;
    DoSelect {
        my ( $msid, $msname, $mtname, $mtoid, $msoid, $ipk, $ipname, ) = @_;
        my ( $vid, $vname, $vhid );
        my $cntv = DoSelect {
            ( $vid, $vname, $vhid ) = @_;
        } <<_;
SELECT hardware.id, hardware.name, hardware.hardware_id
  FROM hardware JOIN mess_verbraucher ON hardware.id = mess_verbraucher.hardware
 WHERE mess_verbraucher.mess_stelle = $msid
_

        my $msextra = '';
        if ( $ipk_rz{$ipk} ) {
            $msextra = $ipk_rz{$ipk};
        }
        else {
            my $rzid = get_rz_from_ipkunde($ipk);
            $msextra =
              defined $rzid
              ? '@' . DoFn("SELECT name FROM rz WHERE id = $rzid")
              : '';
            $ipk_rz{$ipk} = $msextra;
        }

        my $verbraucher = '';
        if ( $cntv > 1 ) {
            $verbraucher = "($cntv Verbraucher)";
        }
        elsif ($vid) {
            $verbraucher = "#$vid"
              . ( defined $vname ? ":$vname"  : '' )
              . ( defined $vhid  ? " [#$vhid]" : '' );
        }

        $t->daten( $msid, "$msname$msextra", $mtname, $mtoid, $msoid, $ipname, $verbraucher );
    } <<_;
  SELECT DISTINCT mess_stelle.id, mess_stelle.name, mess_typ.name, mess_typ.oid_praefix, mess_stelle.oid_suffix, ipkunde.id, ipkunde.name
    FROM mess_stelle JOIN ipkunde ON mess_stelle.snmp_host = ipkunde.id
      JOIN mess_typ ON mess_stelle.typ = mess_typ.id
      $join
  $where
ORDER BY mess_stelle.id 
_

    $t->drucken( );
}

1;
