#!/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 DBI;
use Time::Local;
$PATHconf = '/etc/astguiclient.conf';
open( conf, "$PATHconf" ) || die "can't open $PATHconf: $!\n";
@conf = <conf>;
close(conf);
$i = 0;

foreach (@conf) {
    $line = $conf[$i];
    $line =~ s/ |>|\n|\r|\t|\#.*|;.*//gi;
    if ( ( $line =~ /^PATHhome/ ) && ( $CLIhome < 1 ) ) {
        $PATHhome = $line;
        $PATHhome =~ s/.*=//gi;
    }
    if ( ( $line =~ /^PATHlogs/ ) && ( $CLIlogs < 1 ) ) {
        $PATHlogs = $line;
        $PATHlogs =~ s/.*=//gi;
    }
    if ( ( $line =~ /^PATHagi/ ) && ( $CLIagi < 1 ) ) {
        $PATHagi = $line;
        $PATHagi =~ s/.*=//gi;
    }
    if ( ( $line =~ /^PATHweb/ ) && ( $CLIweb < 1 ) ) {
        $PATHweb = $line;
        $PATHweb =~ s/.*=//gi;
    }
    if ( ( $line =~ /^PATHsounds/ ) && ( $CLIsounds < 1 ) ) {
        $PATHsounds = $line;
        $PATHsounds =~ s/.*=//gi;
    }
    if ( ( $line =~ /^PATHmonitor/ ) && ( $CLImonitor < 1 ) ) {
        $PATHmonitor = $line;
        $PATHmonitor =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARserver_ip/ ) && ( $CLIserver_ip < 1 ) ) {
        $VARserver_ip = $line;
        $VARserver_ip =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARDB_server/ ) && ( $CLIDB_server < 1 ) ) {
        $VARDB_server = $line;
        $VARDB_server =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARDB_database/ ) && ( $CLIDB_database < 1 ) ) {
        $VARDB_database = $line;
        $VARDB_database =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARDB_user/ ) && ( $CLIDB_user < 1 ) ) {
        $VARDB_user = $line;
        $VARDB_user =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARDB_pass/ ) && ( $CLIDB_pass < 1 ) ) {
        $VARDB_pass = $line;
        $VARDB_pass =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARDB_port/ ) && ( $CLIDB_port < 1 ) ) {
        $VARDB_port = $line;
        $VARDB_port =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARREPORT_host/ ) && ( $CLIREPORT_host < 1 ) ) {
        $VARREPORT_host = $line;
        $VARREPORT_host =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARREPORT_user/ ) && ( $CLIREPORT_user < 1 ) ) {
        $VARREPORT_user = $line;
        $VARREPORT_user =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARREPORT_pass/ ) && ( $CLIREPORT_pass < 1 ) ) {
        $VARREPORT_pass = $line;
        $VARREPORT_pass =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARREPORT_port/ ) && ( $CLIREPORT_port < 1 ) ) {
        $VARREPORT_port = $line;
        $VARREPORT_port =~ s/.*=//gi;
    }
    if ( ( $line =~ /^VARREPORT_dir/ ) && ( $CLIREPORT_dir < 1 ) ) {
        $VARREPORT_dir = $line;
        $VARREPORT_dir =~ s/.*=//gi;
    }
    $i++;
}
$dbh = DBI->connect( "DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port",
    "$VARDB_user", "$VARDB_pass" )
  or die "Couldn't connect to database: " . DBI->errstr;
$dbhB = DBI->connect( "DBI:mysql:$VARDB_database:$VARDB_server:$VARDB_port",
    "$VARDB_user", "$VARDB_pass" )
  or die "Couldn't connect to database: " . DBI->errstr;
$secX = time();
( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
  localtime(time);
$year = ( $year + 1900 );
$mon++;
$rowdate = "$mon/$mday/$year";
if ( $mon < 10 )  { $mon  = "0$mon"; }
if ( $mday < 10 ) { $mday = "0$mday"; }
if ( $min < 10 )  { $min  = "0$min"; }
if ( $hour < 10 ) { $hour = "0$hour"; }
if ( $sec < 10 )  { $sec  = "0$sec"; }
$run_time = "$year-$mon-$mday $hour:$min:$sec";
$time     = $secX;
( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
  localtime( time - 14400 );
$year = ( $year + 1900 );
$mon++;
$rowdate = "$mon/$mday/$year";
if ( $mon < 10 )  { $mon  = "0$mon"; }
if ( $mday < 10 ) { $mday = "0$mday"; }
if ( $min < 10 )  { $min  = "0$min"; }
if ( $hour < 10 ) { $hour = "0$hour"; }
if ( $sec < 10 )  { $sec  = "0$sec"; }
$shipdate       = "$year-$mon-$mday";
$start_date     = "$year$mon$mday";
$datestamp      = "$year/$mon/$mday $hour:$min";
$four_hours_ago = "$year-$mon-$mday $hour:$min:$sec";
$FILEDATE       = "$year$mon$mday$hour$min$sec";
$time           = $secX;
( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
  localtime( time - 86400 * 30 );
$year = ( $year + 1900 );
$mon++;
if ( $mon < 10 )  { $mon  = "0$mon"; }
if ( $mday < 10 ) { $mday = "0$mday"; }
if ( $min < 10 )  { $min  = "0$min"; }
if ( $hour < 10 ) { $hour = "0$hour"; }
if ( $sec < 10 )  { $sec  = "0$sec"; }
$one_month_ago = "$year-$mon-$mday $hour:$min:$sec";

if ( length( $ARGV[0] ) > 1 ) {
    $i = 0;
    while ( $#ARGV >= $i ) {
        $args = "$args $ARGV[$i]";
        $i++;
    }
    if ( $args =~ /--help/i ) {
        print "allowed run time options:\n";
        print
"  [--month-check]             = Check the entire KHOMP log table for any missing phone patterns from the past month.\n";
        print
"  [--full-check]              = Check the entire KHOMP log table for any missing phone patterns - will only execute\n";
        print
"                                if no agents are logged in - otherwise the 4-hour window is used.\n";
        print
"  [--custom-check=yyyy-mm-dd] = Check the entire KHOMP log table for any missing phone patterns from the date defined.\n";
        print
"                                Date must be in yyyy-mm-dd format or default 4-hour window is used.\n";
        print
"                                Use caution if running while agents are dialing to prevent database locking.\n";
        print "  [-debug]                    = Verbose debug messages\n";
        print "  [-debugX]                   = Extra verbose debug messages\n";
        print "\n";
        exit;
    }
    if ( $args =~ /--month-check/i ) {
        $month_check = 1;
    }
    if ( $args =~ /--full-check/i ) {
        $full_check = 1;
    }
    if ( $args =~ /--custom-check/i ) {
        $custom_check = 1;
        @cdate_array  = split( /--custom-check=/, $args );
        $custom_date  = $cdate_array[1];
        $custom_date =~ s/ .*//;
        $custom_date =~ s/[^0-9\-]//g;
    }
    if ( $args =~ /--debug/i ) {
        $DB = 1;
    }
    if ( $args =~ /--debugX/i ) {
        $DB  = 1;
        $DBX = 1;
    }
}
$run_check = 1;
if ( $run_check > 0 ) {
    my $grepout = `/bin/ps ax | grep $0 | grep -v grep | grep -v '/bin/sh'`;
    my $grepnum = 0;
    $grepnum++ while ( $grepout =~ m/\n/g );
    if ( $grepnum > 1 ) {
        if ($DB) {
            print "I am not alone! Another $0 is running! Exiting...\n";
        }
        exit;
    }
}
$stmt =
"select * from vicidial_settings_containers where container_id='KHOMPSTATUSMAP'";
$rslt = $dbh->prepare($stmt);
$rslt->execute();
@row = $rslt->fetchrow_array();
$rslt->finish;
$container_entry = $row[4];
@container_array = split( /\n/, $container_entry );
@khomps_array    = ();
@new_khomps      = ();

for ( $i = 0 ; $i < scalar(@container_array) ; $i++ ) {
    @khomp_side = split( /\=\>/, $container_array[$i] );
    $khomp_side[0] =~ s/^\s+|\s+$//g;
    push @khomps_array, $khomp_side[0];
}
$start_date = $four_hours_ago;
$action     = "4HR CHECK";
if ( $custom_check > 0 ) {
    if ( $custom_date =~ /[0-9]{4}\-[0-9]{2}\-[0-9]{2}/ ) {
        $start_date = "$custom_date 00:00:00";
        $action     = "CUSTOM DATE CHECK";
    }
    else {
        print
"\n\nWARNING: custom date is not in valid yyyy-mm-dd format - reverting to default start time of $four_hours_ago\n\n";
    }
}
elsif ( $month_check > 0 ) {
    $start_date = $one_month_ago;
    $action     = "MONTH CHECK";
}
elsif ($full_check) {
    $lc_stmt = "select count(*) From live_channels";
    if ($DB) { print "$lc_stmt\n"; }
    $lc_rslt = $dbh->prepare($lc_stmt);
    $lc_rslt->execute();
    @lc_row        = $lc_rslt->fetchrow_array;
    $live_channels = $lc_row[0];
    $lc_rslt->finish;
    $vla_stmt = "select count(*) From vicidial_live_agents";
    if ($DB) { print "$vla_stmt\n"; }
    $vla_rslt = $dbh->prepare($vla_stmt);
    $vla_rslt->execute();
    @vla_row     = $vla_rslt->fetchrow_array;
    $live_agents = $vla_row[0];
    $vla_rslt->finish;

    if ( $live_channels == 0 && $live_agents == 0 ) {
        $start_date = "2010-01-01";
        $action     = "FULL CHECK";
    }
}
$khomp_stmt =
"select conclusion, pattern from vicidial_khomp_log where start_date>='$start_date'";
if ($DB) { print $khomp_stmt. "\n"; }
$khomp_rslt = $dbh->prepare($khomp_stmt);
$khomp_rslt->execute();
while ( @khomp_row = $khomp_rslt->fetchrow_array ) {
    if ( length( $khomp_row[0] ) > 0 ) {
        $khomp_key = "\"$khomp_row[0]\"";
        if ( length( $khomp_row[1] ) > 0 ) {
            $khomp_key .= ".\"$khomp_row[1]\"";
        }
        if ( !grep( /^$khomp_key$/, @khomps_array ) ) {
            push @new_khomps,   $khomp_key;
            push @khomps_array, $khomp_key;
        }
    }
}
$khomp_rslt->finish();
if ($DBX) {
    foreach (@khomps_array) { print "$_\n"; }
}
my $new_khomps_str = join ' => \r\n', @new_khomps;
if ( $new_khomps_str !~ /\s\=\>\s$/ ) { $new_khomps_str .= " => "; }
$container_entry .= "\r\n$new_khomps_str";
$container_entry =~ s/\\r\\n/\r\n/gi;
if ( scalar(@new_khomps) > 0 ) {
    $upd_stmt =
        "update vicidial_settings_containers set container_entry='"
      . $container_entry
      . "' where container_id='KHOMPSTATUSMAP'";
    if ($DB) { print $upd_stmt. "\n"; }
    $upd_rslt = $dbh->prepare($upd_stmt);
    $upd_rslt->execute();
    $upd_rslt->finish;
}
$dbh->disconnect;
$dbhB->disconnect;
