#!/usr/bin/perl
#/* ========================================
# * ███╗   ███╗██████╗ ██╗ █████╗ ██╗
# * ████╗ ████║██╔══██╗██║██╔══██╗██║
# * ██╔████╔██║██║  ██║██║███████║██║
# * ██║╚██╔╝██║██║  ██║██║██╔══██║██║
# * ██║ ╚═╝ ██║██████╔╝██║██║  ██║███████╗
# * ╚═╝     ╚═╝╚═════╝ ╚═╝╚═╝  ╚═╝╚══════╝
# * ========================================
# * mDial - Omni-Channel Contact Centre Suite.
# * Initially Written by Martin McCarthy.
# * Contributions welcome.
# * Active: 2020 - 2023.
# *
# * This software is licensed under AGPLv2.
# * You can find more information here;
# * https://www.gnu.org/licenses/agpl-3.0.en.html
# * A copy of the license is also shipped with this build.
# *
# * Important note: this software is provided to you free of charge.
# * If you paid for this software, you were ripped off.
# *
# * This project is a fork of the awesome FOSS project, ViCiDial.
# * ViCiDial is copyrighted by Matt Florell and the ViCiDial Group
# * under the AGPLv2 license.
# *
# * You can find out more about ViCiDial;
# * Web: https://www.vicidial.com/
# * Email: Matt Florell <vicidial@gmail.com>
# * IRC: Libera.Chat - ##vicidial
# *
# * Bug reports, feature requests and patches welcome!
# * ======================================== */
use 5.008;
use strict;
use warnings;
use MIME::QuotedPrint;
use MIME::Base64;
use Mail::Sendmail;
use DBI;
my $DB           = 0;     # 1 for debugging
my $email_list   = "";    # people to send the report to
my $email_sender = "";    # person the email is from

if ( ( $ARGV[0] ) && ( length( $ARGV[0] ) > 1 ) ) {
    my $i    = 0;
    my $args = "";
    while ( $#ARGV >= $i ) {
        $args = "$args $ARGV[$i]";
        $i++;
    }
    if ( $args =~ /--help/i ) {
        print "allowed run time options:\n";
        print
"  [--email-list=test\@test.com:test2\@test.com] = send email results to these addresses\n";
        print
"  [--email-sender=vicidial\@localhost] = sender for the email results\n";
        print "  [--debug] = debugging messages\n";
        print "\n";
        exit;
    }
    else {
        if ( $args =~ /--debug/i ) {
            $DB = 1;
            print "\n----- DEBUG MODE -----\n\n";
        }
        if ( $args =~ /--email-list=/i ) {
            my @data_in = split( /--email-list=/, $args );
            $email_list = $data_in[1];
            $email_list =~ s/ .*//gi;
            $email_list =~ s/:/,/gi;
            print "\n----- EMAIL NOTIFICATION: $email_list -----\n\n";
        }
        if ( $args =~ /--email-sender=/i ) {
            my @data_in = split( /--email-sender=/, $args );
            $email_sender = $data_in[1];
            $email_sender =~ s/ .*//gi;
            $email_sender =~ s/:/,/gi;
            print "\n----- EMAIL NOTIFICATION SENDER: $email_sender -----\n\n";
        }
        else {
            $email_sender = 'vicidial@localhost';
        }
    }
}
my $current_time = time();
my $csec         = 0;
my $cmin         = 0;
my $chour        = 0;
my $cmday        = 0;
my $cmon         = 0;
my $cyear        = 0;
my $cwday        = 0;
my $cyday        = 0;
my $cisdst       = 0;
( $csec, $cmin, $chour, $cmday, $cmon, $cyear, $cwday, $cyday, $cisdst ) =
  localtime($current_time);
$cyear = ( $cyear + 1900 );
$cmon++;
if ( $cmon < 10 )  { $cmon  = "0$cmon"; }
if ( $cmday < 10 ) { $cmday = "0$cmday"; }
if ( $chour < 10 ) { $chour = "0$chour"; }
if ( $cmin < 10 )  { $cmin  = "0$cmin"; }
if ( $csec < 10 )  { $csec  = "0$csec"; }
my $week_ago_time = $current_time - 604800;
my $wsec          = 0;
my $wmin          = 0;
my $whour         = 0;
my $wmday         = 0;
my $wmon          = 0;
my $wyear         = 0;
my $wwday         = 0;
my $wyday         = 0;
my $wisdst        = 0;
( $wsec, $wmin, $whour, $wmday, $wmon, $wyear, $wwday, $wyday, $wisdst ) =
  localtime($week_ago_time);
$wyear = ( $wyear + 1900 );
$wmon++;
if ( $wmon < 10 )  { $wmon  = "0$wmon"; }
if ( $wmday < 10 ) { $wmday = "0$wmday"; }
if ( $whour < 10 ) { $whour = "0$whour"; }
if ( $wmin < 10 )  { $wmin  = "0$wmin"; }
if ( $wsec < 10 )  { $wsec  = "0$wsec"; }
my $current_time_stamp  = "$cyear-$cmon-$cmday $chour:$cmin:$csec";
my $week_ago_time_stamp = "$wyear-$wmon-$wmday $whour:$wmin:$wsec";
print
  "running report for date range $week_ago_time_stamp to $current_time_stamp\n";
my $config_file = '/etc/astguiclient.conf';
open( CONFIG, "$config_file" ) || die "can't open $config_file: $!\n";
my @conf = <CONFIG>;
close(CONFIG);
my $i              = 0;
my $PATHhome       = "";
my $PATHlogs       = "";
my $PATHagi        = "";
my $PATHweb        = "";
my $PATHsounds     = "";
my $PATHmonitor    = "";
my $VARserver_ip   = "";
my $VARDB_server   = "";
my $VARDB_database = "";
my $VARDB_user     = "";
my $VARDB_pass     = "";
my $VARDB_port     = "";
my $VARREPORT_host = "";
my $VARREPORT_user = "";
my $VARREPORT_pass = "";
my $VARREPORT_port = "";
my $VARREPORT_dir  = "";

foreach (@conf) {
    my $line = $conf[$i];
    $line =~ s/ |>|\n|\r|\t|\#.*|;.*//gi;
    if ( $line =~ /^PATHhome/ ) { $PATHhome = $line; $PATHhome =~ s/.*=//gi; }
    if ( $line =~ /^PATHlogs/ ) { $PATHlogs = $line; $PATHlogs =~ s/.*=//gi; }
    if ( $line =~ /^PATHagi/ )  { $PATHagi  = $line; $PATHagi  =~ s/.*=//gi; }
    if ( $line =~ /^PATHweb/ )  { $PATHweb  = $line; $PATHweb  =~ s/.*=//gi; }
    if ( $line =~ /^PATHsounds/ ) {
        $PATHsounds = $line;
        $PATHsounds =~ s/.*=//gi;
    }
    if ( $line =~ /^PATHmonitor/ ) {
        $PATHmonitor = $line;
        $PATHmonitor =~ s/.*=//gi;
    }
    if ( $line =~ /^VARserver_ip/ ) {
        $VARserver_ip = $line;
        $VARserver_ip =~ s/.*=//gi;
    }
    if ( $line =~ /^VARDB_server/ ) {
        $VARDB_server = $line;
        $VARDB_server =~ s/.*=//gi;
    }
    if ( $line =~ /^VARDB_database/ ) {
        $VARDB_database = $line;
        $VARDB_database =~ s/.*=//gi;
    }
    if ( $line =~ /^VARDB_user/ ) {
        $VARDB_user = $line;
        $VARDB_user =~ s/.*=//gi;
    }
    if ( $line =~ /^VARDB_pass/ ) {
        $VARDB_pass = $line;
        $VARDB_pass =~ s/.*=//gi;
    }
    if ( $line =~ /^VARDB_port/ ) {
        $VARDB_port = $line;
        $VARDB_port =~ s/.*=//gi;
    }
    if ( $line =~ /^VARREPORT_host/ ) {
        $VARREPORT_host = $line;
        $VARREPORT_host =~ s/.*=//gi;
    }
    if ( $line =~ /^VARREPORT_user/ ) {
        $VARREPORT_user = $line;
        $VARREPORT_user =~ s/.*=//gi;
    }
    if ( $line =~ /^VARREPORT_pass/ ) {
        $VARREPORT_pass = $line;
        $VARREPORT_pass =~ s/.*=//gi;
    }
    if ( $line =~ /^VARREPORT_port/ ) {
        $VARREPORT_port = $line;
        $VARREPORT_port =~ s/.*=//gi;
    }
    if ( $line =~ /^VARREPORT_dir/ ) {
        $VARREPORT_dir = $line;
        $VARREPORT_dir =~ s/.*=//gi;
    }
    $i++;
}
my $csv_file_name =
  "weekly_agent_stats-$wyear$wmon$wmday-$cyear$cmon$cmday.csv";
my $csv_path = "$PATHweb/$csv_file_name";
if ( !$VARDB_port ) { $VARDB_port = '3306'; }
my $dbh = DBI->connect( "DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port",
    "$VARDB_user", "$VARDB_pass" )
  or die "Couldn't connect to database: " . DBI->errstr;
my $sys_status_stmt = "SELECT status, status_name FROM vicidial_statuses;";
my $sys_status_sth  = $dbh->prepare($sys_status_stmt)
  or die "preparing: ", $dbh->errstr;
my $camp_status_stmt =
  "SELECT status, status_name FROM vicidial_campaign_statuses;";
my $camp_status_sth = $dbh->prepare($camp_status_stmt)
  or die "preparing: ", $dbh->errstr;
my $agent_stats_stmt =
"SELECT user, lead_id, event_time, campaign_id, pause_sec, wait_sec, talk_sec, dispo_sec, status FROM vicidial_agent_log where event_time <= ? and event_time >= ?";
my $agent_stats_sth = $dbh->prepare($agent_stats_stmt)
  or die "preparing: ", $dbh->errstr;
my $vendor_stmt =
  "SELECT vendor_lead_code FROM vicidial_list WHERE lead_id = ?;";
my $vendor_sth = $dbh->prepare($vendor_stmt) or die "preparing: ", $dbh->errstr;
$sys_status_sth->execute()
  or die "executing: $sys_status_stmt ", $dbh->errstr();
my $sys_status_ref = $sys_status_sth->fetchall_hashref('status');
$camp_status_sth->execute()
  or die "executing: $camp_status_stmt ", $dbh->errstr();
my $camp_status_ref = $camp_status_sth->fetchall_hashref('status');
open( CSVFILE, ">>$csv_path" ) or die $!;
print CSVFILE
"\"user\",\"lead_id\",\"event_time\",\"campaign_id\",\"pause_sec\",\"wait_sec\",\"talk_sec\",\"dispo_sec\",\"status\",\"status_name\",\"vendor_lead_code\"\n";
$agent_stats_sth->execute( $current_time_stamp, $week_ago_time_stamp )
  or die "executing: $agent_stats_stmt ", $dbh->errstr();
my $agent_stats_rows = $agent_stats_sth->rows;
my $rec_count        = 0;

while ( $agent_stats_rows > $rec_count ) {
    my @ary         = $agent_stats_sth->fetchrow_array;
    my $user        = $ary[0];
    my $lead_id     = $ary[1];
    my $event_time  = $ary[2];
    my $campaign_id = $ary[3];
    my $pause_sec   = $ary[4];
    my $wait_sec    = $ary[5];
    my $talk_sec    = $ary[6];
    my $dispo_sec   = $ary[7];
    my $status      = $ary[8];
    my $status_name = "";

    if ($status) {
        $status_name = $sys_status_ref->{$status}->{'status_name'};
        if ( !($status_name) ) {
            $status_name = $camp_status_ref->{$status}->{'status_name'};
        }
    }
    else {
        $status = "";
    }
    my $vendor_lead_code = "";
    if ($lead_id) {
        $vendor_sth->execute($lead_id)
          or die "executing: $agent_stats_stmt ", $dbh->errstr();
        my @vend_ary = $vendor_sth->fetchrow_array();
        $vendor_lead_code = $vend_ary[0];
        if ( !($vendor_lead_code) ) {
            $vendor_lead_code = "";
        }
    }
    else {
        $lead_id = "";
    }
    print CSVFILE
"\"$user\",\"$lead_id\",\"$event_time\",\"$campaign_id\",\"$pause_sec\",\"$wait_sec\",\"$talk_sec\",\"$dispo_sec\",\"$status\",\"$status_name\",\"$vendor_lead_code\"\n";
    $rec_count++;
}
close(CSVFILE);
$sys_status_sth->finish();
$camp_status_sth->finish();
$agent_stats_sth->finish();
$vendor_sth->finish();
$dbh->disconnect();
if ( $email_list ne "" ) {
    print "Generating the email\n";
    my $mailsubject = "VICIDIAL Weekly Agent Status Report $csv_file_name";
    my %mail        = (
        To      => "$email_list",
        From    => "$email_sender",
        Subject => "$mailsubject",
    );
    my $boundary = "====" . time() . "====";
    $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";
    my $message = encode_qp(
"VICIDIAL Lead Export:\n\n Attachment: $csv_file_name\n Total Records: $agent_stats_rows\n"
    );
    my $Zfile = "$csv_path";
    open( F, $Zfile ) or die "Cannot read $Zfile: $!";
    binmode F;
    undef $/;
    my $attachment = encode_base64(<F>);
    close F;
    $boundary = '--' . $boundary;
    $mail{body} .= "$boundary\n";
    $mail{body} .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
    $mail{body} .= "Content-Transfer-Encoding: quoted-printable\n\n";
    $mail{body} .= "$message\n";
    $mail{body} .= "$boundary\n";
    $mail{body} .=
      "Content-Type: application/octet-stream; name=\"$csv_file_name\"\n";
    $mail{body} .= "Content-Transfer-Encoding: base64\n";
    $mail{body} .=
      "Content-Disposition: attachment; filename=\"$csv_file_name\"\n\n";
    $mail{body} .= "$attachment\n";
    $mail{body} .= "$boundary";
    $mail{body} .= "--\n";
    print "Sending email to: $email_list\n";
    sendmail(%mail) or die $Mail::Sendmail::error;
    print "OK. Log says:\n", $Mail::Sendmail::log, "\n";
}
