use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(Do DoFn isotime DoTime);
use Fehler qw(problem);
use Loader qw(select_date log_update check_overlap);

sub set_messstelle_datum($;$) {
    my ( $idi, $kn ) = @_;

    my ( $beginn, $ende ) =
      DoFn "SELECT beginn, ende FROM mess_stelle WHERE id = $idi"
      or return problem "Mess Stelle #$idi nicht gefunden.";
    $ende = 0 if not defined $ende;
    $beginn = 0 if not defined $beginn;

    my $neu_beginn = select_date( 256, 'Startdatum', undef, qw(= jetzt) );
    unless ( defined $neu_beginn ) {
        $neu_beginn = ( $beginn ? DoTime() : $beginn );
    }
    elsif ( $neu_beginn eq '='   ) { $neu_beginn = DoTime  }

    my $neu_ende = select_date( 16 | 256 | 1024,
        'Enddatum', undef, qw(= jetzt 0 unbegrenzt) );
    unless ( defined $neu_ende   ) { $neu_ende   = $ende  }
    elsif ( $neu_ende   eq '='   ) { $neu_ende   = DoTime }

    return problem 'Das Enddatum darf nicht vor dem Startdatum liegen.'
      if defined $neu_beginn && $neu_ende && $neu_beginn > $neu_ende;

    if (defined $neu_beginn or defined $neu_ende) {
        if (my $other = check_overlap( mess_stelle => id => $idi, 'name,snmp_host', $neu_beginn, $neu_ende) ) {
            return problem <<_;
Die Daten können nicht so gesetzt werden, da sich sonst eine zeitliche
Überschneidung mit Mess Stelle #$other ergeben würde.
_
        }
    }

    my @updates;
    if ( $beginn != $neu_beginn ) {
        log_update mess_stelle => id => $idi, undef, 'beginn', undef,
            scalar isotime $beginn;
        push @updates, "beginn=$neu_beginn";
    }
    if ( $ende != $neu_ende ) {
        $neu_ende = "NULL" if $neu_ende == 0;
        log_update mess_stelle => id => $idi, undef, 'ende', undef,
            scalar isotime $ende;
        push @updates, "ende=$neu_ende";
    }
    Do 'UPDATE mess_stelle SET ' . join(', ', @updates) . " WHERE id=$idi"
      if @updates;
}
1;
