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

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

$id = $_POST["id"];

//Pulisco le tabelle del database
$sql_delete = "DELETE FROM attendance_users WHERE attendance_id = $id";
$con->query($sql_delete);

$sql_delete = "DELETE FROM attendance_rows WHERE attendance_id = $id";
$con->query($sql_delete);

$sql_delete = "DELETE FROM attendance_justifications_temp WHERE attendance_id = $id";
$con->query($sql_delete);

//Prendo i dati del cartellino
$sql_attendance = "SELECT * FROM attendance WHERE id = $id";
$result_attendance = mysqli_query($con, $sql_attendance);
$attendance = mysqli_fetch_assoc($result_attendance);

//Imposto le date
$start_date_db = '' . $attendance["year"] . '-' . $attendance["month"] . '-01';
$end_date_db = '' . $attendance["year"] . '-' . ($attendance["month"] + 1) . '-01';

$start_date = date($start_date_db);
$end_date = date($end_date_db);

$night_start = "22:00:00";
$night_start_time = date("H:i:s", strtotime($night_start));
$night_end = "06:00:00";
$night_end_time = date("H:i:s", strtotime($night_end));
$day_start = "06:00:00";
$day_start_time = date("H:i:s", strtotime($day_start));
$day_end = "22:00:00";
$day_end_time = date("H:i:s", strtotime($day_end));

$day_minutes = 480;

$startDate = new \DateTime($start_date);
$endDate = new \DateTime($end_date);

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

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

    //Dichiaro/pulisco le variabili
    $total_theorical_minutes = 0;

    $total_day_worked_minutes = 0;
    $total_night_worked_minutes = 0;
    $total_holiday_worked_minutes = 0;
    $total_holiday_night_worked_minutes = 0;

    $total_day_overtime_minutes = 0;
    $total_night_overtime_minutes = 0;
    $total_holiday_overtime_minutes = 0;
    $total_holiday_night_overtime_minutes = 0;

    $user_id = $users["id"];

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

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

        $entry_time_1 = "";
        $entry_time_2 = "";
        $entry_time_3 = "";
        $entry_time_4 = "";
        $exit_time_1 = "";
        $exit_time_2 = "";
        $exit_time_3 = "";
        $exit_time_4 = "";

        $theorical_minutes    = 0;

        $day_worked_minutes = 0;
        $night_worked_minutes = 0;
        $holiday_worked_minutes = 0;
        $holiday_night_worked_minutes = 0;

        $day_overtime_minutes = 0;
        $night_overtime_minutes = 0;
        $holiday_overtime_minutes = 0;
        $holiday_night_overtime_minutes = 0;

        $justification_id_1 = 0;
        $justification_id_2 = 0;
        $justification_id_3 = 0;
        $justification_id_4 = 0;
        $justification_id_5 = 0;
        $justification_id_6 = 0;
        $justification_minutes_1 = 0;
        $justification_minutes_2 = 0;
        $justification_minutes_3 = 0;
        $justification_minutes_4 = 0;
        $justification_minutes_5 = 0;
        $justification_minutes_6 = 0;

        $day_type = "";

        $entry_time = "";
        $exit_time = "";

        $index = 0;
        $last_stamp_type = "";

        $dt1 = strtotime($date);
        $dt2 = date("l", $dt1);
        $dt3 = strtolower($dt2);
        if ($dt3 == "saturday") {
            $day_type = "SA";
            $theorical_minutes = 0;
        } else if ($dt3 == "sunday") {
            $day_type = "DO";
            $theorical_minutes = 0;
        } else {
            $day_type = "GL";
            $theorical_minutes = 480;
            $total_theorical_minutes += 480;
        }

        //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);
        while ($stamp_row = mysqli_fetch_assoc($result_stamps)) {
            //Imposto le variabili
            $stamp_type = $stamp_row["type"];
            $stamp_time = $stamp_row["time"];
            $last_stamp_type = $stamp_type;

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

            if (($index == 0) && ($stamp_type == "Uscita")) {
                //Se la prima timbratura del giorno è un'uscita

                //Imposto le variabili
                $entry_time_1 = "00:00:00";
                $exit_time_1 = $exit_time;
                $index++;

                //Controllo fasce orarie
                if ($exit_time <= $night_end_time) {
                    //Se l'orario di uscita è minore o uguale della fine dell'orario notturno

                    $minutes = CalcMinutesBetweenTimes("00:00:00", $exit_time);
                    if ($day_type == "GL") {
                        $night_worked_minutes += $minutes;
                    } else {
                        $holiday_night_worked_minutes += $minutes;
                    }
                } else {
                    //Se l'orario di uscita è maggiore della fine dell'orario notturno

                    $minutes = CalcMinutesBetweenTimes("00:00:00", $night_end_time);
                    if ($day_type == "GL") {
                        $night_worked_minutes += $minutes;
                    } else {
                        $holiday_night_worked_minutes += $minutes;
                    }

                    $minutes = CalcMinutesBetweenTimes($day_start_time, $exit_time);
                    if ($day_type == "GL") {
                        $day_worked_minutes += $minutes;
                    } else {
                        $holiday_worked_minutes += $minutes;
                    }
                }
            } else if ($stamp_type == "Entrata") {
                //Se la timbratura è entrata

                //Imposto le variabili
                if ($entry_time_1 == "") {
                    $entry_time_1 = $stamp_time;
                } else if ($entry_time_2 == "") {
                    $entry_time_2 = $stamp_time;
                } else if ($entry_time_3 == "") {
                    $entry_time_3 = $stamp_time;
                } else if ($entry_time_4 == "") {
                    $entry_time_4 = $stamp_time;
                }
                $index++;
            } else if ($stamp_type == "Uscita") {
                //Se la timbratura è uscita

                //Imposto le variabili
                if ($exit_time_1 == "") {
                    $exit_time_1 = $stamp_time;
                } else if ($exit_time_2 == "") {
                    $exit_time_2 = $stamp_time;
                } else if ($exit_time_3 == "") {
                    $exit_time_3 = $stamp_time;
                } else if ($exit_time_4 == "") {
                    $exit_time_4 = $stamp_time;
                }
                $index++;

                //Controllo fasce orarie
                if (($entry_time >= "00:00:00") && ($entry_time <= $night_end_time)) {
                    //Se l'orario di entrata è mattino notturno
                    if ($exit_time <= $night_end_time) {
                        //Se l'orario di entrata è mattino notturno e l'orario di uscita è mattino notturno

                        $minutes = CalcMinutesBetweenTimes($entry_time, $exit_time);
                        if ($day_type == "GL") {
                            $night_worked_minutes += $minutes;
                        } else {
                            $holiday_night_worked_minutes += $minutes;
                        }
                    } else {
                        //Se l'orario di entrata è mattino notturno e l'orario di uscita è diurno

                        $minutes = CalcMinutesBetweenTimes($entry_time, $night_end_time);
                        if ($day_type == "GL") {
                            $night_worked_minutes += $minutes;
                        } else {
                            $holiday_night_worked_minutes += $minutes;
                        }

                        $minutes = CalcMinutesBetweenTimes($day_start_time, $exit_time);
                        if ($day_type == "GL") {
                            $day_worked_minutes += $minutes;
                        } else {
                            $holiday_worked_minutes += $minutes;
                        }
                    }
                } else if (($entry_time >= $day_start_time) && ($entry_time < $night_start_time)) {
                    //Se l'orario di entrata è diurno
                    if ($exit_time < $night_start_time) {
                        //Se l'orario di entrata è diurno e l'orario di uscita è diurno

                        $minutes = CalcMinutesBetweenTimes($entry_time, $exit_time);
                        if ($day_type == "GL") {
                            $day_worked_minutes += $minutes;
                        } else {
                            $holiday_worked_minutes += $minutes;
                        }
                    } else {
                        //Se l'orario di entrata è diurno e l'orario di uscita è serale notturno

                        $minutes = CalcMinutesBetweenTimes($entry_time, $day_end_time);
                        if ($day_type == "GL") {
                            $day_worked_minutes += $minutes;
                        } else {
                            $holiday_worked_minutes += $minutes;
                        }

                        $minutes = CalcMinutesBetweenTimes($night_start_time, $exit_time);
                        if ($day_type == "GL") {
                            $night_worked_minutes += $minutes;
                        } else {
                            $holiday_night_worked_minutes += $minutes;
                        }
                    }
                }
            }
        }

        if ($last_stamp_type == "Entrata") {
            //Se l'ultima timbratura della giornata è entrata

            if ($entry_time < $night_start_time) {
                //Se l'ultima timbratura della giornata è entrata e l'orario è diurno

                $minutes = CalcMinutesBetweenTimes($entry_time, $day_end_time);
                if ($day_type == "GL") {
                    $day_worked_minutes += $minutes;
                } else {
                    $holiday_worked_minutes += $minutes;
                }

                $minutes = CalcMinutesBetweenTimes($night_start_time, "24:00:00");
                if ($day_type == "GL") {
                    $night_worked_minutes += $minutes;
                } else {
                    $holiday_night_worked_minutes += $minutes;
                }
            } else {
                //Se l'ultima timbratura della giornata è entrata e l'orario è notturno

                $minutes = CalcMinutesBetweenTimes($night_start_time, "24:00:00");
                if ($day_type == "GL") {
                    $night_worked_minutes += $minutes;
                } else {
                    $holiday_night_worked_minutes += $minutes;
                }
            }
        }

        //CALCOLO STRAORDINARI
        //Se è un giorno lavorativo
        if ($day_type == "GL") {
            //Se la somma dei minuti lavorati è maggiore dei minuti previsti per il giorno
            if (($day_worked_minutes + $night_worked_minutes) > $day_minutes) {
                //Se i minuti lavorati di giorno sono maggiori dei minuti lavorati di notte
                if ($day_worked_minutes > $night_worked_minutes) {
                    $day_overtime_minutes = ($day_worked_minutes + $night_worked_minutes) - $day_minutes;
                    $night_overtime_minutes = 0;
                } else {
                    //Se i minuti lavorati di notte sono maggiori dei minuti lavorati di giorno
                    $night_overtime_minutes = ($day_worked_minutes + $night_worked_minutes) - $day_minutes;
                    $day_overtime_minutes = 0;
                }
            }
        } else {
            //Se è un giorno festivo
            //Se la somma dei minuti lavorati è maggiore dei minuti previsti per il giorno
            if (($holiday_worked_minutes + $holiday_night_worked_minutes) > $day_minutes) {
                //Se i minuti lavorati di giorno sono maggiori dei minuti lavorati di notte
                if ($holiday_worked_minutes > $holiday_night_worked_minutes) {
                    $holiday_overtime_minutes = ($holiday_worked_minutes + $holiday_night_worked_minutes) - $day_minutes;
                    $holiday_night_overtime_minutes = 0;
                } else {
                    //Se i minuti lavorati di notte sono maggiori dei minuti lavorati di giorno
                    $holiday_night_overtime_minutes = ($holiday_worked_minutes + $holiday_night_worked_minutes) - $day_minutes;
                    $holiday_overtime_minutes = 0;
                }
            }
        }

        //Inserisco nella tabella temporanea i giustificativi
        if ($day_overtime_minutes > 0) {
            $sql_insert = "INSERT INTO attendance_justifications_temp VALUES(NULL, $id,$user_id,24, $day_overtime_minutes,'$date')";
            $con->query($sql_insert);
        }
        if ($night_overtime_minutes > 0) {
            $sql_insert = "INSERT INTO attendance_justifications_temp VALUES(NULL, $id,$user_id,26, $night_overtime_minutes,'$date')";
            $con->query($sql_insert);
        }
        if ($holiday_overtime_minutes > 0) {
            $sql_insert = "INSERT INTO attendance_justifications_temp VALUES(NULL, $id,$user_id,25, $holiday_overtime_minutes,'$date')";
            $con->query($sql_insert);
        }
        if ($holiday_night_overtime_minutes > 0) {
            $sql_insert = "INSERT INTO attendance_justifications_temp VALUES(NULL, $id,$user_id,28, $holiday_night_overtime_minutes,'$date')";
            $con->query($sql_insert);
        }

        //Controllo i permessi
        if ($day_type == "GL") {
            //Se è un giorno lavorativo ciclo i permessi del giorno

            $sql = "SELECT * FROM permissions WHERE '$date' BETWEEN start_date AND end_date AND user_id = " . $user_id . " AND status_id = 2";
            $result_permissions = mysqli_query($con, $sql);
            while ($permission_row = mysqli_fetch_assoc($result_permissions)) {

                //Dichiaro le variabili
                $permission_justification_id = $permission_row["justification_id"];
                $permission_full_day = $permission_row["full_day"];
                $permission_start_date = $permission_row["start_date"];
                $permission_start_time = $permission_row["start_time"];
                $permission_end_date = $permission_row["end_date"];
                $permission_end_time = $permission_row["end_time"];
                $justification_min = 0;
                $minutes = 0;

                if ($day_type == "GL") {
                    if ($permission_full_day == 1) {
                        //Se il permesso ha giornata intera

                        //Conto 8 ore
                        $justification_min = 480;
                    } else {
                        //Se non è giornata intera
                        if ($permission_start_date == $date && $permission_end_date != $date) {
                            //Se la data inizio permesso è uguale alla data del ciclo e la fine è dopo

                            //Calcolo la differenza tra ora inizio e 23:59:59
                            $minutes = CalcMinutesBetweenTimes($permission_start_time, "24:00:00");
                            $justification_min = $minutes;
                        } else if ($permission_end_date == $date && $permission_start_date != $date) {
                            //Se la data fine permesso è uguale alla data del ciclo e l'inizio è prima 

                            //Calcolo la differenza tra ora fine e 00:00:00
                            $minutes = CalcMinutesBetweenTimes("00:00:00", $permission_end_time);
                            $justification_min = $minutes;
                        } else if ($permission_end_date == $date && $permission_start_date == $date) {
                            //Se la data inizio e fine permesso sono la data del ciclo

                            //Calcolo la differenza tra inizio e fine permesso
                            $minutes = CalcMinutesBetweenTimes($permission_start_time, $permission_end_time);
                            $justification_min = $minutes;
                        } else {
                            //Se la data del ciclo è compresa tra la data inizio e fine permesso

                            //Conto 8 ore
                            $justification_min = 480;
                        }
                    }

                    //Inserisco nella tabella temporanea il permesso con i minuti per ogni giorno
                    $sql_insert = "INSERT INTO attendance_justifications_temp VALUES(NULL, $id,$user_id,$permission_justification_id, $justification_min,'$date')";
                    $con->query($sql_insert);
                }
            }
        }

        //Calcolo totale minuti di permessi nella giornata
        $sql = "SELECT SUM(minutes) AS justification_minutes, justification_id FROM attendance_justifications_temp WHERE date = '$date' AND user_id = $user_id AND attendance_id = $id GROUP BY justification_id";
        $result_justifications_temp = mysqli_query($con, $sql);
        while ($justifications_temp = mysqli_fetch_assoc($result_justifications_temp)) {
            if ($justification_id_1 == 0) {
                $justification_id_1 = $justifications_temp["justification_id"];
                $justification_minutes_1 = $justifications_temp["justification_minutes"];
            } else if ($justification_id_2 == 0) {
                $justification_id_2 = $justifications_temp["justification_id"];
                $justification_minutes_2 = $justifications_temp["justification_minutes"];
            } else if ($justification_id_3 == 0) {
                $justification_id_3 = $justifications_temp["justification_id"];
                $justification_minutes_3 = $justifications_temp["justification_minutes"];
            } else if ($justification_id_4 == 0) {
                $justification_id_4 = $justifications_temp["justification_id"];
                $justification_minutes_4 = $justifications_temp["justification_minutes"];
            } else if ($justification_id_5 == 0) {
                $justification_id_5 = $justifications_temp["justification_id"];
                $justification_minutes_5 = $justifications_temp["justification_minutes"];
            } else if ($justification_id_6 == 0) {
                $justification_id_6 = $justifications_temp["justification_id"];
                $justification_minutes_6 = $justifications_temp["justification_minutes"];
            }
        }

        $total_minutes = $day_worked_minutes + $holiday_worked_minutes + $night_worked_minutes + $holiday_night_worked_minutes;
        if ($total_minutes > $day_minutes) {
            $worked_minutes = $day_minutes;
        } else {
            $worked_minutes = $total_minutes;
        }

        //Inserisco riga della giornata su DB
        $sql_insert = "INSERT INTO attendance_rows VALUES(NULL, $id, $user_id, '" . date("Y-m-d", strtotime($date)) . "', '$entry_time_1','$exit_time_1','$entry_time_2','$exit_time_2','$entry_time_3','$exit_time_3','$entry_time_4','$exit_time_4',$theorical_minutes,$worked_minutes,$justification_id_1,$justification_minutes_1,$justification_id_2,$justification_minutes_2,$justification_id_3,$justification_minutes_3,$justification_id_4,$justification_minutes_4,$justification_id_5,$justification_minutes_5,$justification_id_6,$justification_minutes_6,'$day_type')";
        $con->query($sql_insert);

        //Incremento i giustificativi totali
        $total_day_worked_minutes += $day_worked_minutes;
        $total_night_worked_minutes += $night_worked_minutes;
        $total_holiday_worked_minutes += $holiday_worked_minutes;
        $total_holiday_night_worked_minutes += $holiday_night_worked_minutes;

        $total_day_overtime_minutes += $day_overtime_minutes;
        $total_night_overtime_minutes += $night_overtime_minutes;
        $total_holiday_overtime_minutes += $holiday_overtime_minutes;
        $total_holiday_night_overtime_minutes += $holiday_night_overtime_minutes;
    }

    $progressive = 1;

    if ($total_day_worked_minutes > 0) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, 20, $total_day_worked_minutes)";
        $con->query($sql_insert);
        $progressive++;
    }

    if ($total_night_worked_minutes > 0) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, 15, $total_night_worked_minutes)";
        $con->query($sql_insert);
        $progressive++;
    }

    if ($total_holiday_worked_minutes > 0) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, 13, $total_holiday_worked_minutes)";
        $con->query($sql_insert);
        $progressive++;
    }

    if ($total_holiday_night_worked_minutes > 0) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, 14, $total_holiday_night_worked_minutes)";
        $con->query($sql_insert);
        $progressive++;
    }

    if ($total_theorical_minutes > 0) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, 27, $total_theorical_minutes)";
        $con->query($sql_insert);
        $progressive++;
    }

    $sql = "SELECT SUM(minutes) AS justification_minutes, justification_id FROM attendance_justifications_temp WHERE user_id = $user_id AND attendance_id = $id GROUP BY justification_id";
    $result_justifications_temp = mysqli_query($con, $sql);
    while ($justifications_temp = mysqli_fetch_assoc($result_justifications_temp)) {
        //Inserisco riga totale ore diurne lavorate
        $sql_insert = "INSERT INTO attendance_users VALUES(NULL, $id, $user_id, $progressive, " . $justifications_temp["justification_id"] . ", " . $justifications_temp["justification_minutes"] . ")";
        $con->query($sql_insert);
        $progressive++;
    }
}

$sql_delete = "DELETE FROM attendance_justifications_temp WHERE attendance_id = $id";
$con->query($sql_delete);

$sql_update = "UPDATE attendance SET status = 'Pronto' WHERE id = $id";
$con->query($sql_update);

echo "ok";

$con->close();
