#!/usr/bin/perl

=begin -------------------------------------------------------------------------
emails list of errors (rh.action contains 'recorded error code') for previous week
patient edits too difficult to relate back to request to get original regsitrant
=cut ---------------------------------------------------------------------------

use Getopt::Std;
getopts('d:'); # days
our($opt_d); # warn $opt_d; exit;

use strict;
use warnings;

my $JUST_TESTING = 0; # email to ra.jones only

############ recipients from contacts.lib ######################################
my @recipients = qw( lynda.blythe.secure raj );
my $duration = $opt_d || 7; # over past number of days
################################################################################

use lib '/home/raj/perl5/lib/perl5';
use DateTime::Format::MySQL;
use Data::Dumper;
use DateTime;

use FindBin qw($Bin); # warn $Bin;
use lib $Bin . '/../../../lib';
use LIMS::Local::ScriptHelpers;

# get tools from LIMS::Local::ScriptHelpers:
my $tools = LIMS::Local::ScriptHelpers->new();
$tools->test_only($JUST_TESTING);

#-------------------------------------------------------------------------------
my $date    = $tools->time_now->subtract( days => $duration - 7 )->dmy; # warn $date; exit;
my $subject = "HILIS errors week ending $date";
#-------------------------------------------------------------------------------

my $sql_lib  = $tools->sql_lib();
my $config   = $tools->config();
my $dbix     = $tools->dbix();

my (@rows, @seen);

=begin # not using for hilis4:
my $query = $sql_lib->retr('error_log');
my @terms = qw(LName FName PatNo NHSNo DoB Specimen Source Clinician BlockRef
    Private Urgent Store Treatment Research Monitor );
my $regexp = join '|', @terms;
$query =~ s/%REGEXP%/$regexp/; # warn $query; exit;

my $result = $dbix->query($query, $duration);
while (my $ref = $result->hash) { # warn Dumper $vars; next;
    { # get some vals:
        _get_registration_user($ref);
        _get_error_action($ref);
        _get_labno($ref);
    }
    my @fields = qw(time modifier action error_action labno register_user);
    push @rows, [ @{$ref}{@fields} ];

    push @seen, $ref->{err_history_id}; # don't want this entry again
} # warn Dumper \@err_code_ids;
=cut

{ # get error codes entries in history log:
    my $sql = $sql_lib->retr('request_history_error_codes');
    my $result = $dbix->query($sql, $duration);
    while ( my $ref = $result->hash ) {
        # skip error code entries already collected:
#        next if grep $ref->{request_history_id} == $_, @seen; # not using

        {  # get some vals:
            _get_registration_user($ref);
            _get_labno($ref);
        }
        my @fields = qw(time modifier action labno register_user);
        push @rows, [ @{$ref}{@fields} ];
    }
}

=begin # too difficult to relate patient_edit back to request for registrant
{ # patient edits:
    my $sql = $sql_lib->retr('error_log_patient_edits');
    # see M::History::_parse_patient_history_for_changes for details
}
=cut

my $msg = join "\n", map { join ' | ', @$_ } sort by_time @rows;
# print $msg; exit;

my %mail = (
	config  => $config,
	message => $msg,
	subject => $subject,
); # warn Dumper \%mail;

$tools->send_mail(\%mail, \@recipients);

sub _get_registration_user {
    my $ref = shift;

    my $sql = q!select UCASE(username) from request_history rh join users u on
        rh.user_id = u.id where rh.request_id = ? and rh.action = 'registered'!;
    $dbix->query($sql, $ref->{request_id})->into($ref->{register_user});
}

sub _get_error_action {
    my $ref = shift;

    my ($error_action) = $ref->{err_code_action} =~ /recorded (error code .*)/;
    $ref->{error_action} = $error_action;
}

sub _get_labno {
    my $ref = shift;

    $ref->{labno} = sprintf 'H%s/%s',
        $ref->{request_number}, $ref->{year} - 2000;
}

sub by_time {
    my $dtA = DateTime::Format::MySQL->parse_datetime($a->[0]);
    my $dtB = DateTime::Format::MySQL->parse_datetime($b->[0]);

    return DateTime->compare( $dtA, $dtB );
}
