<?php
session_start();
/* if (!isset($_SESSION['loggedin'])) {
    exit("unauthorized");
}
 */
$manual = $_POST["manual"];

include "database.php";
include "functions.php";

$sql    = "SELECT * FROM check_parameters";
$result_parameters = mysqli_query($con, $sql);
while ($parameters = mysqli_fetch_assoc($result_parameters)) {
    if ($parameters["name"] == "consecutive_work_days") {
        $consecutive_work_days = number_format($parameters["value"]);
        $consecutive_work_days_desc = $parameters["description"];
    } else if ($parameters["name"] == "last_consecutive_day_max_time") {
        $last_consecutive_day_max_time = date("H:i:s", strtotime($parameters["value"]));
        $last_consecutive_day_max_time_desc = $parameters["description"];
    } else if ($parameters["name"] == "max_day_work_time") {
        $max_day_work_time = number_format($parameters["value"]);
        $max_day_work_time_desc = $parameters["description"];
    } else if ($parameters["name"] == "max_time_before_break") {
        $max_time_before_break = number_format($parameters["value"]);
        $max_time_before_break_desc = $parameters["description"];
    } else if ($parameters["name"] == "min_break_time") {
        $min_break_time = number_format($parameters["value"]);
        $min_break_time_desc = $parameters["description"];
    } else if ($parameters["name"] == "min_time_between_work_days") {
        $min_time_between_work_days = number_format($parameters["value"]);
        $min_time_between_work_days_desc = $parameters["description"];
    }
}

if ($manual == "true") {
    $check_start_date = date("Y-m-d", strtotime($_POST["start_date_check"]));
    $check_end_date = date('Y-m-d', strtotime($_POST["end_date_check"] . ' + 1 day'));

    $run_user_id = $_SESSION["id"];

    $sql_problems_range = "SELECT * FROM problems_date_range WHERE user_id = " . $_SESSION["id"] . "";
    $result_problems_range = mysqli_query($con, $sql_problems_range);
    if ($result_problems_range->num_rows > 0) {
        $sql_update = "UPDATE problems_date_range SET start = '$check_start_date', end = '" . $_POST["end_date_check"] . "', datetime = '" . date("Y-m-d H:i:s") . "' WHERE user_id = " . $_SESSION["id"] . "";
        $con->query($sql_update);
    } else {
        $sql = "INSERT INTO problems_date_range VALUES(NULL,'$check_start_date','" . $_POST["end_date_check"] . "'," . $_SESSION["id"] . ",'" . date("Y-m-d H:i:s") . "')";
        $con->query($sql);
    }

    $sql_delete = "DELETE FROM problems WHERE run_user_id = " . $_SESSION["id"] . "";
    $con->query($sql_delete);
} else {
    $check_end_date = date("Y-m-d");
    $check_start_date = date("Y-m-01", strtotime("-1 month"));

    $run_user_id = 0;

    $sql_problems_range = "SELECT * FROM problems_date_range WHERE user_id = 0";
    $result_problems_range = mysqli_query($con, $sql_problems_range);
    if ($result_problems_range->num_rows > 0) {
        $sql_update = "UPDATE problems_date_range SET start = '$check_start_date', end = '$check_end_date', datetime = '" . date("Y-m-d H:i:s") . "' WHERE user_id = 0";
        $con->query($sql_update);
    } else {
        $sql = "INSERT INTO problems_date_range VALUES(NULL,'$check_start_date','$check_end_date',0,'" . date("Y-m-d H:i:s") . "')";
        $con->query($sql);
    }

    $sql_delete = "DELETE FROM problems WHERE run_user_id = 0";
    $con->query($sql_delete);
}

$day_minutes = 480;
$entry_time = "";
$exit_time = "";

$startDate = new \DateTime($check_start_date);
$endDate = new \DateTime($check_end_date);

$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod($startDate, $interval, $endDate);

//Ciclo gli utenti attivi
$sql    = "SELECT * FROM users WHERE enable = 1 AND attendance = 1";
$result_users = mysqli_query($con, $sql);
while ($users = mysqli_fetch_assoc($result_users)) {

    //Dichiaro/pulisco le variabili
    $consecutive_days = 0;
    $user_id = $users["id"];

    //Ciclo i giorni del periodo
    foreach ($period as $dates) {

        //Dichiaro/pulisco le variabili
        $date = $dates->format('Y-m-d');
        $worked_minutes = 0;

        $index = 0;
        $entry_count = 0;
        $last_stamp_type = "";

        //Determino il tipo di giorno
        $dt1 = strtotime($date);
        $dt2 = date("l", $dt1);
        $dt3 = strtolower($dt2);
        if ($dt3 == "saturday") {
            $day_type = "Festivo";
        } else if ($dt3 == "sunday") {
            $day_type = "Festivo";
        } else {
            $day_type = "Lavorativo";
        }

        //Ciclo le timbrature dell'utente nel giorno
        $sql = "SELECT * FROM stamps WHERE date = '$date' AND user_id = " . $user_id . " ORDER BY time ASC";
        $result_stamps = mysqli_query($con, $sql);
        if ($result_stamps->num_rows > 0) {
            $consecutive_days++;

            while ($stamp_row = mysqli_fetch_assoc($result_stamps)) {
                //Imposto le variabili
                $stamp_id = $stamp_row["id"];
                $stamp_type = $stamp_row["type"];
                $stamp_time = $stamp_row["time"];
                $stamp_date = $stamp_row["date"];
                $last_stamp_type = $stamp_type;

                //Modifico l'orario con la gestione a 15 minuti
                if ($stamp_type == "Entrata") {
                    $entry_time = FormatEntryTimeBy15Minutes($stamp_time);
                    $entry_count++;
                } else {
                    $exit_time = FormatExitTimeBy15Minutes($stamp_time);
                }

                if (($index == 0) && ($stamp_type == "Uscita")) {
                    //Se la prima timbratura del giorno è un'uscita
                    $minutes = CalcMinutesBetweenTimes("00:00:00", $exit_time);
                    $worked_minutes += $minutes;

                    //Controllo il tempo massimo ti un turno lavorativo
                    $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days'));
                    $minutes = CalcMinutesBetweenTimes($yesterday . " " . $entry_time, $stamp_date . " " . $exit_time);
                    if ($minutes > $max_time_before_break) {
                        $description = "Lavoro nel turno: " . timeFromMinutes($minutes) . " ore";
                        $suggestion = "" . $max_time_before_break_desc . ": " . timeFromMinutes($max_time_before_break) . " ore";

                        InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                    }
                } else if ($stamp_type == "Entrata") {
                    //Se la timbratura è entrata
                    //Se è la prima entrata della giornata
                    if (($entry_count == 1) && ($exit_time != "")) {
                        //Controllo il tempo minimo tra un turno e un altro
                        $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days'));
                        $minutes = CalcMinutesBetweenTimes($stamp_date . " " . $stamp_time, $yesterday . " " . $exit_time);

                        if ($minutes < $min_time_between_work_days) {
                            $description = "Il tempo di riposo dal turno precedente è " . timeFromMinutes($minutes) . " ore";
                            $suggestion = "" . $min_time_between_work_days_desc . ": " . timeFromMinutes($min_time_between_work_days) . " ore";

                            InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                        }
                    } else {
                        //Controllo il tempo minimo di pausa
                        $minutes = CalcMinutesBetweenTimes($stamp_time, $exit_time);

                        if ($minutes < $min_break_time) {
                            $description = "Pausa tra i turni: " . timeFromMinutes($minutes) . " ore";
                            $suggestion = "" . $min_break_time_desc . ": " . timeFromMinutes($min_break_time) . " ore";

                            InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                        }
                    }
                } else if ($stamp_type == "Uscita") {
                    //Se la timbratura è uscita
                    $minutes = CalcMinutesBetweenTimes($entry_time, $exit_time);
                    $worked_minutes += $minutes;

                    //Controllo il tempo massimo ti un turno lavorativo
                    if ($minutes > $max_time_before_break) {
                        $description = "Lavoro nel turno: " . timeFromMinutes($minutes) . " ore";
                        $suggestion = "" . $max_time_before_break_desc . ": " . timeFromMinutes($max_time_before_break) . "";

                        InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                    }
                }

                $index++;
            }
        } else {
            $consecutive_days = 0;
            $entry_time = "";
            $exit_time = "";
        }

        //Se l'ultima timbratura della giornata è entrata
        if ($last_stamp_type == "Entrata") {
            $minutes = CalcMinutesBetweenTimes($entry_time, "24:00:00");
            $worked_minutes += $minutes;

            //Se è la prima entrata della giornata
            if ($entry_count == 1) {
                //Controllo il tempo minimo tra un turno e un altro
                $yesterday = date('Y-m-d', strtotime($stamp_date . ' - 1 days'));
                $minutes = CalcMinutesBetweenTimes($stamp_date . " " . $stamp_time, $yesterday . " " . $exit_time);

                if ($minutes < $min_time_between_work_days) {
                    $description = "Il tempo di riposo dal turno precedente è " . timeFromMinutes($minutes) . " ore";
                    $suggestion = "" . $min_time_between_work_days_desc . ": " . timeFromMinutes($min_time_between_work_days) . " ore";

                    InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                }
            } else {
                //Controllo il tempo minimo di pausa
                $minutes = CalcMinutesBetweenTimes($stamp_time, $exit_time);

                if ($minutes < $min_break_time) {
                    $description = "Pausa tra i turni: " . timeFromMinutes($minutes) . " ore";
                    $suggestion = "" . $min_break_time_desc . ": " . timeFromMinutes($min_break_time) . " ore";

                    InsertProblem($user_id, "Timbratura", $stamp_id, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                }
            }
        }

        //Controllo il massimo di ore di lavoro in una giornata
        if ($worked_minutes > $max_day_work_time) {
            $description = "Totale ore lavorate nel giorno: " . timeFromMinutes($worked_minutes) . "";
            $suggestion = "" . $max_day_work_time_desc . ": " . timeFromMinutes($max_day_work_time) . " ore";

            InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
        }

        //Controllo se sono stati fatti 12 giorni lavorativi consecutivi e la timbratura d'uscita del 12° giorno è dopo le 13:00 oppure se sono stati fatti più di 12 giorni di lavoro consecutivi
        if ($consecutive_days == $consecutive_work_days && $stamp_time > $last_consecutive_day_max_time) {
            $description = "Giorni di lavoro consecutivi: $consecutive_days giorni - Ora fine turno: " . timeFromMinutes($stamp_time) . "";
            $suggestion = "" . $consecutive_work_days_desc . ": " . $consecutive_work_days . " giorni - " . $last_consecutive_day_max_time_desc . ": " . timeFromMinutes($last_consecutive_day_max_time) . " ore";

            InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'timeGridWeek', $run_user_id);
        } else if ($consecutive_days > $consecutive_work_days) {
            $description = "Giorni di lavoro consecutivi: $consecutive_days giorni";
            $suggestion = "" . $consecutive_work_days_desc . ": " . $consecutive_work_days . " giorni";

            InsertProblem($user_id, "Timbratura", 0, $description, $suggestion, $date, 'timeGridWeek', $run_user_id);
        }

        //Controlli sui permessi
        $permissions_day_minutes = 0;
        $sql_permissions    = "SELECT * FROM permissions WHERE user_id = $user_id AND '$date' BETWEEN start_date AND end_date AND status_id = 2";
        $result_permissions = mysqli_query($con, $sql_permissions);
        while ($permission = mysqli_fetch_assoc($result_permissions)) {
            if ($day_type == "Festivo") {
                if (($permission["start_date"] == $date) or ($permission["end_date"] == $date)) {
                    //Controllo permessi in giorni festivi
                    $description = "Non ci possono essere permessi in un giorno festivo";
                    $suggestion = "Rimuovere i permessi dalla giornata";

                    InsertProblem($user_id, "Permesso", 0, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
                }
            } else {

                $permission_time = 0;

                if ($permission["full_day"] == 1) {
                    //Se è permission intera aggiungo 8 ore
                    $permissions_day_minutes += $day_minutes;
                } else {
                    if ($permission["start_date"] == $date && $permission["end_date"] != $date) {
                        //Se la data inizio permesso è uguale alla data del ciclo e la fine è dopo faccio la differenza tra ora inizio e 23:59:59
                        $timeObject1 = date_create('24:00:00');
                        $timeObject2 = date_create($permission["start_time"]);
                        $interval = date_diff($timeObject1, $timeObject2);
                        $permission_time = $interval->days * 24 * 60;
                        $permission_time += $interval->h * 60;
                        $permission_time += $interval->i;

                        $remaining_minutes = $day_minutes - $worked_minutes;
                        if ($remaining_minutes > 0) {
                            if ($remaining_minutes > $permission_time) {
                                $permissions_day_minutes += $permission_time;
                            } else {
                                $permissions_day_minutes += $remaining_minutes;
                            }
                        } else {
                            $permissions_day_minutes += $permission_time;
                        }
                    } else if ($permission["end_date"] == $date && $permission["start_date"] != $date) {
                        //Se la data fine permesso è uguale alla data del ciclo e l'inizio è prima faccio la differenza tra ora fine e 00:00:00
                        $timeObject1 = date_create($permission["end_time"]);
                        $timeObject2 = date_create('00:00:00');
                        $interval = date_diff($timeObject1, $timeObject2);
                        $permission_time = $interval->days * 24 * 60;
                        $permission_time += $interval->h * 60;
                        $permission_time += $interval->i;

                        $remaining_minutes = $day_minutes - $worked_minutes;
                        if ($remaining_minutes > 0) {
                            if ($remaining_minutes > $permission_time) {
                                $permissions_day_minutes += $permission_time;
                            } else {
                                $permissions_day_minutes += $remaining_minutes;
                            }
                        } else {
                            $permissions_day_minutes += $permission_time;
                        }
                    } else if ($permission["end_date"] == $date && $permission["start_date"] == $date) {
                        //Se la data inizio e fine permesso sono la data del ciclo faccio la differenza tra inizio e fine permesso
                        $timeObject1 = date_create($permission["end_time"]);
                        $timeObject2 = date_create($permission["start_time"]);
                        $interval = date_diff($timeObject1, $timeObject2);
                        $permission_time = $interval->days * 24 * 60;
                        $permission_time += $interval->h * 60;
                        $permission_time += $interval->i;

                        $permissions_day_minutes += $permission_time;
                    } else {
                        //Se la data del ciclo è compresa tra la data inizio e fine permesso
                        $permissions_day_minutes += $day_minutes;
                    }
                }
            }
        }

        if ($day_type == "Lavorativo") {
            //Controllo se le ore lavorate + le ore di permesso sono minori di 8
            $total_day_minutes = $worked_minutes + $permissions_day_minutes;
            if ($total_day_minutes < $day_minutes) {
                if ($total_day_minutes == 0) {
                    $description = "Ore totali timbrature e permessi: 00:00";
                } else {
                    $description = "Ore totali timbrature e permessi: " . timeFromMinutes($total_day_minutes) . "";
                }

                $suggestion = "In un giorno lavorativo di devono essere 8:00 ore tra timbrature e permessi";

                InsertProblem($user_id, "Tutto", 0, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
            }

            if (($permissions_day_minutes > 0) && ($worked_minutes >= $day_minutes)) {
                $description = "Non si possono richiedere permessi se si sono lavorate almeno 08:00 ore";
                $suggestion = "Diminuire orario di lavoro o rimuovere i permessi dalla giornata";

                InsertProblem($user_id, "Tutto", 0, $description, $suggestion, $date, 'timeGridDay', $run_user_id);
            }
        }
    }
}

echo "ok";

$con->close();
