#!/usr/bin/perl -w

use strict;
use utf8;
use warnings;

BEGIN {
    unshift @INC, ( $ENV{POPHOME} || '@POPHOME@' ) . '/lib'
      unless $ENV{KUNDE_NO_PERLPATH};
}

use Dbase::Getopt qw(:DEFAULT);
use Dbase::Help qw(DoFn DoSelect unixtime);
use Dbase::Object::Person;
use noris::CSV;
use noris::Ticket::API qw(get_pooled_connection);
use Umlaut qw(textmodus);

use constant SPALTEN => (
    qw/ Monitoring? Pauschale? /,
    'Arbeitszeit (Sekunden inkl. Faktor)',
    qw/
      Extraminuten
      Datum
      Beginn
      Dauer
      Kunde
      Team
      Mitarbeiter
      Nr
      Zeiterfassungs-ID
      Text
      Ticket
      Typ
      Titel
      Incident-Ticket
      Incident-Typ
      Incident-Titel
      /
);

{
    my $user;

    sub get_subeinsatz {
        my $line;
        {
            defined( $line = <> ) or return;

            redo if $line !~ /\S/;

            if ( $line =~ /^\*\*\* (\S+)$/ ) {
                $user = Dbase::Object::Person->new( user => $1 );
                redo;
            }
        }

        ( my $team = $user->abteilung ) =~ s/^Technik, Team //;
        my %subeinsatz = ( Mitarbeiter => $user->user, Team => $team );
        @subeinsatz{
            'Nr',
            'Zeiterfassungs-ID',
            qw/
              Kunde
              Ticket
              Datum
              Datum_JJJJ
              Datum_MM
              Datum_TT
              Beginn
              Beginn_HH
              Beginn_MM
              Dauer
              Dauer_HH
              Dauer_MM
              Text
              Extraminuten
              /
          }
          = $line =~
/^\s*([1-9][0-9]*)? (\d+) (\S+) +(\d+) ((\d+)-(\d\d)-(\d\d)) ((\d\d):(\d\d)) ((\d\d):(\d\d)) (.*?)(?: \(+([1-9][05])\))?$/
          or die "Unbekanntes Datenformat in Zeile $.:\n$line";

        my $resultset = get_pooled_connection()->select_tickets(
            query      => { ticket_number => $subeinsatz{Ticket} },
            attributes => [qw/queue type title/]
        );

        die "Ticket #$subeinsatz{Tickets}: "
          . $resultset->count
          . " Datensaetze\n"
          if $resultset->count != 1;

        $resultset->foreach_row(
            sub {
                @subeinsatz{qw/ Queue Typ Titel /} = @_;
            }
        );

        # ermittle, ob es ein Monitoring-Einsatz war:
        $resultset = $resultset->follow_tickets(
            attributes => [qw/queue type title/],
            follow_by  => [
                qw/main sub split_target split_source/

                  # merge_parent merge_child normal
            ]
        );

        while ( defined( my $record = $resultset->next ) ) {
            my ( $queue, $type, $title ) = @$record;
            next if $queue !~ /\bincident\b/;
            @subeinsatz{ 'Monitoring?', map "Incident-$_",
                qw/ Ticket Typ Titel / } =
              ( $title =~ /^Nagios\b/, $_, $type, $title );
            last;
        }

        \%subeinsatz;
    }
}

sub beginn_timestamp($) {
    my $subeinsatz = shift;
    &unixtime( @{$subeinsatz}
          {qw/ Datum_JJJJ Datum_MM Datum_TT Beginn_HH Beginn_MM /} );
}

{
    my $hotline_faktor =
      DoFn('SELECT Faktor FROM stunden_art WHERE name="Hotline"')
      or die;
    $hotline_faktor /= 100;

    my $subeinsatz;

    sub get_einsatz {
        my @subeinsaetze;
        while ( defined( $subeinsatz ||= get_subeinsatz() ) ) {
            last if @subeinsaetze && defined $subeinsatz->{Nr};
            push @subeinsaetze, $subeinsatz;
            undef $subeinsatz;
        }
        return unless @subeinsaetze;

        my $sekunden =
          beginn_timestamp( $subeinsaetze[-1] ) +
          $subeinsaetze[-1]{Dauer_HH} * 3600 +
          $subeinsaetze[-1]{Dauer_MM} * 60 -
          beginn_timestamp( $subeinsaetze[0] );

        @{ $subeinsaetze[0] }{ 'Pauschale?',
            'Arbeitszeit (Sekunden inkl. Faktor)' } =
          ( 1, $sekunden > 1800 ? ( $sekunden - 1800 ) * $hotline_faktor : 0 );

        @subeinsaetze;
    }
}

@ARGV = GetOptions();

my $csv = noris::CSV->new;
textmodus( \*STDIN );
textmodus( \*STDOUT );
$| = 1;

print $csv->as_decoded_string(SPALTEN);
while ( my @subeinsaetze = get_einsatz() ) {
    print $csv->as_decoded_string( map defined() && $_, @{$_}{ (SPALTEN) } )
      for @subeinsaetze;
}

__END__

=head1 NAME

hotline-statistik

=head1 SYNOPSE

    hotline-einsaetze -beginn '6 months ago' -abteilung-like '%' |
    hotline-statistik >Datei.csv

=head1 BESCHREIBUNG

Das Programm erwartet als Eingabe eine Ausgabe des Tools hotline-einsaetze,
analysiert diese, ergänzt Daten aus dem Ticketsystem und gibt das Ergebnis
als CSV-Daten aus.

Insbesondere wird versucht zu ermitteln, ob es sich um einen durch das
Monitoring ausgelösten Fall handelte.
Dazu wird für das Ticket und für die ggf. mit ihm verbundenen Tickets
überprüft, ob es sich um ein Ticket in Queue incident handelt, und falls
ja, ein Monitoring-Fall angenommen, falls der Titel mit dem Wort "Nagios"
beginnt.

=head1 OPTIONEN

=over 4

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

