use utf8;
use warnings; no warnings "redefine";
use strict;

use Dbase::Globals qw(content);
use Dbase::Help qw(DoFn qquote);
use Loader qw( 
  add_messtyp
  delete_messtyp
  edit_hardware
  edit_messtyp
  list_messtypen
  line_in 
);
use Fehler qw(problem report_fehler);

my %suchfeld = (
    'l' => 'mess_typ',
);
my %suche = (
    n => 'name',
    i => 'info',
);

sub edit_messtypen($) {
    my ( $kn ) = @_;

    aloop: while ( content( my $act = line_in "$kn Messtypen >", 4 ) ) {
        ( $act, my @select ) = split ' ', $act;


        if ( $act eq '?' ) {
            print <<'_';

l       Auflistung aller Messtypen des Messsystems
a       Fügt einen neuen Messtyp hinzu
###     Wählt ein Messtyp aus

Bei der Auflistungsfunktion 'l' können zusätzlich beliebig viele mit
Whitespace getrennte Suchargumente übergeben werden:

n:...   nur die Mess... anzeigen in deren Name     zu SQL-Wildcard "..." passt
i:...   nur die Mess... anzeigen deren Infotext    zu SQL-Wildcard "..." passt

dt:...  Löscht einen Messtyp (Keine Messstellen sollten davon abhängig sein)

_
            next;
        }
        if ( $act eq 'l' ) {
            for (@select) {
                unless (s/^(${\ join '|', keys %suche })(:)\s*//o) {
                    problem "Unbekannte Suchmethode: $_";
                    next aloop;
                }
                else {
                    $_ = "%$_" unless /^%/;
                    $_ .= '%' unless /%$/;
                    $_ =
                      "$suchfeld{$act}.$suche{$1} "
                      . ( length() ? "LIKE ${\ qquote($_) }" : 'IS NULL' );
                }
            }
            list_messtypen(@select);
            next;
        }
        if ( $act eq 'a' ) { add_messtyp($kn); next; }
        if ( $act =~ /^dt:(\S+)$/ ) {
            my ($id) = DoFn "SELECT id FROM mess_typ WHERE id = " . qquote($1);
            unless ( defined $id ) {
                $act = $1 . ( @select ? ' ' . join( ' ', @select ) : '' );
                ($id) = DoFn "SELECT id FROM mess_typ WHERE name = " . qquote($act);
            }

            if ($id) {

                # untersuchen ob messstellen abhängig sind
                my ($ms) = DoFn <<_;
SELECT count(*)
  FROM mess_stelle JOIN ipkunde ON mess_stelle.snmp_host = ipkunde.id
    JOIN mess_typ ON mess_stelle.typ = mess_typ.id
 WHERE typ = $id
   AND ( mess_stelle.ende IS NULL OR mess_stelle.ende > UNIX_TIMESTAMP(NOW()) )
_
                if ($ms) {
                    problem "Es sind $ms Messstellen mit diesem Messtyp verknüpft!";
                    next;
                }
                delete_messtyp($id, $kn);
            }
            next;
        }
        if ( $act =~ /^\d+$/ ) {
            if ( DoFn "SELECT 1 FROM mess_typ WHERE id = $act" ) {
                edit_messtyp $act, $kn; 
            }
            else {
                print "Mess-Typ #$act nicht gefunden.\n";
            }
            next;
        }
        if ( $act =~ /^\S+$/ ) {
            $act .= ' ' . join( ' ', @select )
              if (@select);
            if ( my ($id) = DoFn "SELECT id FROM mess_typ WHERE name = " . qquote($act) ) {
                edit_messtyp $id, $kn;
            }
            else {
                print "Mess-Typ $act nicht gefunden.\n";
            }
            next;
        }

        print "Aktion '$act' kenne ich nicht. Liste mit '?'.\n";
        next;
      fehler: report_fehler(4);
    }
    undef;
}

1;
