<?php

namespace RinnovoBooking\Core;

use RinnovoBooking\Core\RinnovoBookingService;
use RinnovoBooking\Core\IPatenteService;
use RinnovoBooking\Core\Notification;
use RinnovoBooking\Core\EmailService;
use RinnovoBooking\Core\RinnovoBookingShortcode;
use error;

class RinnovoBooking {

    /**
     * visualizza la pagina di errore 401
     * @return void
     */
    private function accesso_negato() {
        $miaPagina = plugin_dir_path(__DIR__) . 'html/errore401.php';
        if (file_exists($miaPagina)) {
            echo file_get_contents($miaPagina);
        } else {
            echo '<h1>401 - Accesso non autorizzato</h1>';
        }
    }


    /**
     * aggiorna coockie e transient
     * @return void
     */
    private function refresh_user_session() {
        if (empty($_COOKIE['rinnovo_booking_token'])) {
            return; // niente token, niente refresh
        }
    
        $token = sanitize_text_field($_COOKIE['rinnovo_booking_token']);
        $transient_key = 'rinnovo_booking_user_' . $token;
    
        $user_data = get_transient($transient_key);
        if (!is_array($user_data) || empty($user_data['user_logged_in'])) {
            return; // dati mancanti o utente non loggato
        }
    
        // Aggiorna last_activity al timestamp attuale
        $user_data['last_activity'] = time();
    
        // Riscrivi il transient con durata 12 ore da adesso
        set_transient($transient_key, $user_data, 12 * HOUR_IN_SECONDS);
    
        // Aggiorna il cookie con durata 12 ore da adesso (rolling cookie)
        setcookie(
            'rinnovo_booking_token',
            $token,
            [
                'expires'  => time() + 12 * HOUR_IN_SECONDS,
                'path'     => '/',
                'secure'   => isset($_SERVER['HTTPS']),
                'httponly' => true,
                'samesite' => 'Lax',
            ]
        );
    }
    

    /**
     * aggiorna i dati dell'utente
     * @param string $key
     * @param mixed $value
     * @return void
     */
    private function set_user_data($key, $value) {
        if (!isset($_COOKIE['rinnovo_booking_token'])) {
            return;
        }
    
        $token = sanitize_text_field($_COOKIE['rinnovo_booking_token']);
        $transient_key = 'rinnovo_booking_user_' . $token;
    
        $data = get_transient($transient_key);
        if (!is_array($data)) {
            $data = [];
        }
    
        $data[$key] = $value;
        set_transient($transient_key, $data, 12 * HOUR_IN_SECONDS); // durata 12 ore
    }
    

    /**
     * legge i dati dell'utente
     * @param string $key
     * @return mixed
     */
    private function get_user_data($key) {
        if (!isset($_COOKIE['rinnovo_booking_token'])) {
            return null;
        }
    
        $token = sanitize_text_field($_COOKIE['rinnovo_booking_token']);
        $transient_key = 'rinnovo_booking_user_' . $token;
    
        $data = get_transient($transient_key);
        return is_array($data) && isset($data[$key]) ? $data[$key] : null;
    }
    
       
    /**
     * Gestione delle richieste 
     * @return bool|string
     */
    public function login() {
        ob_start();
        try {
            $this->verifica_accesso();

            //gestione delle impostazioni
            if (isset($_GET['tipo']) && $_GET['tipo'] == 'impostazioni') {
                return $this->handle_impostazioni();
            }

            //gestione delle email
            if (isset($_GET['tipo']) && $_GET['tipo'] == 'email') {
                if(isset($_GET['azione']) && $_GET['azione'] == 'vedi') {
                    return $this->handle_email();
                } else {
                    $risultatoEmail = $this->handle_send_email();

                    if (!$risultatoEmail) {
                        $this->set_user_data('notification_type', 'error');
                        $this->set_user_data('notification_title', 'Errore!');
                        $this->set_user_data('notification_message', 'Errore durante l\'invio dell\'email.');
                    } else {
                        $this->set_user_data('notification_type', 'success');
                        $this->set_user_data('notification_title', 'Successo!');
                        $this->set_user_data('notification_message', 'Email inviata con successo.');
                    }

                    $url_redirect = add_query_arg('idsede', $_GET['idsede'], home_url(RINNOVOBOOKINGPANEL));
                    wp_redirect($url_redirect);
                    exit();
                }
            }

            // Gestione della ricerca e dei filtri
            if ($_SERVER['REQUEST_METHOD'] == 'GET' && (isset($_GET['parola']) || isset($_GET['dataRicerca']) || isset($_GET['stato'])) && isset($_GET['idsede'])) {
                $query_args = array();
                $query_args['idsede'] = $_GET['idsede'];

                // Ricerca per cognome
                if (isset($_GET['parola']) && !empty($_GET['parola'])) {
                    $query_args['cognome'] = sanitize_text_field($_GET['parola']);
                }
                
                // Ricerca per data
                if (isset($_GET['dataRicerca']) && !empty($_GET['dataRicerca'])) {
                    $query_args['data'] = sanitize_text_field($_GET['dataRicerca']);
                }
                
                // Ricerca per stato
                if (isset($_GET['stato']) && !empty($_GET['stato'])) {
                    $stati_validi = array('active', 'closed', 'payment', 'sold');
                    if (in_array($_GET['stato'], $stati_validi)) {
                        $query_args['stato'] = $_GET['stato'];
                    }
                }
                
                if (isset($_GET['dataRicerca'])) {
                    $data = date('d-m-Y', strtotime($_GET['dataRicerca']));
                } elseif (isset($_GET['stato'])) {
                    $data = $_GET['stato'];
                } elseif (isset($_GET['parola'])) {
                    $data = $_GET['parola'];
                } else {
                    $data = 'Tutti i filtri';
                }

              
                $risultati = $this->cerca_prenotazioni($query_args);
                $this->visualizza_risultati_ricerca($risultati, $query_args['idsede'], $data);
                return ob_get_clean();
            }

            //gestione della modifica/cancellazione della prenotazione
            if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['idmodifica'])) {
                if ($this->get_user_data('user_logged_in') === true) {
                    return $this->handle_modifica_prenotazione();
                } else {
                    wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                    exit();
                }
            } elseif ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['idcancella'])) {
                if ($this->get_user_data('user_logged_in') === true) {
                    $risultato = $this->cancella_prenotazione($_GET['idcancella']);
                    if ($risultato) {                        
                        $url_redirect = add_query_arg('idsede', $_GET['idsede'], home_url(RINNOVOBOOKINGPANEL));
                        wp_redirect($url_redirect);
                        exit();
                    } else {
                        echo "Si è verificato un errore durante la cancellazione della prenotazione.";
                    }
                    return ob_get_clean();
                } else {
                    wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                    exit();
                }
            }

            // gestione della funzione ipatente
            if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['idipatente'])) {
                $risultatoRegistrazione = $this->handle_ipatente();

                // Salva il messaggio di notifica nella sessione
                if (!$risultatoRegistrazione) {
                    $this->set_user_data('notification_type', 'error');
                    $this->set_user_data('notification_title', 'Errore!');
                    $this->set_user_data('notification_message', 'Errore durante la registrazione sulla piattaforma iPatente.');
                } else {
                    $this->set_user_data('notification_type', 'success');
                    $this->set_user_data('notification_title', 'Successo!');
                    $this->set_user_data('notification_message', 'Registrazione sulla piattaforma iPatente avvenuta con successo.');
                }
                               
                $url_redirect = add_query_arg('idsede', $_GET['sede'], home_url(RINNOVOBOOKINGPANEL));
                wp_redirect($url_redirect);
                exit();
            }

            // Gestione della modifica della prenotazione
            if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['modifica_prenotazione'])) {
                if ($this->get_user_data('user_logged_in') === true) {
                    $risultato = $this->aggiorna_prenotazione($_POST);
                    
                    if ($risultato === true) {
                        // Reindirizzamento alla pagina delle prenotazioni dopo la modifica
                        $url_redirect = add_query_arg('idsede', $_GET['idsede'], home_url(RINNOVOBOOKINGPANEL));
                        wp_redirect($url_redirect);
                        exit();
                    } else {
                        // Gestione dell'errore
                        echo "Si è verificato un errore durante l'aggiornamento della prenotazione: " . $risultato;
                    }
                } else {
                    wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                    exit();
                }
            }

            // Gestione della nuova prenotazione
            if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['nuova_prenotazione'])) {
                if ($this->get_user_data('user_logged_in') === true) {
                    $risultato = $this->nuova_prenotazione($_POST);
                    
                    if ($risultato === true) {
                        // Reindirizzamento alla pagina delle prenotazioni
                        $url_redirect = add_query_arg('idsede', $_GET['idsede'], home_url( RINNOVOBOOKINGPANEL));
                        wp_redirect($url_redirect);
                        exit();
                    } else {
                        // Gestione dell'errore
                        echo "Si è verificato un errore durante l'inserimento della prenotazione: " . $risultato;
                    }
                } else {
                    wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                    exit();
                }
            } else if (isset($_GET['tipo']) && $_GET['tipo'] == 'nuovaprenotazione') {
                return $this->handle_nuova_prenotazione();
            } else if (isset($_GET['tipo']) && $_GET['tipo'] == 'nuovaprenotazionebis') {
                return $this->handle_nuova_prenotazione_bis();
            }

            // Gestione del login/logout scelta sedi
            if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['tipo']) && $_GET['tipo'] == 'logout') {
                // Rimuovi i dati dell'utente 
                if (isset($_COOKIE['rinnovo_booking_token'])) {
                    $token = $_COOKIE['rinnovo_booking_token'];
            
                    // Rimuovi il transient
                    delete_transient('rinnovo_booking_user_' . $token);
            
                    // Cancella il cookie
                    setcookie('rinnovo_booking_token', '', time() - 3600, "/");
                }
                wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                exit();
            } elseif ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['idsede'])) {
                if ($this->get_user_data('user_logged_in') === true) {
                    return $this->handle_get_prenotazioni();
                } else {
                    wp_redirect(home_url(RINNOVOBOOKINGPANEL));
                    exit();
                }
            } elseif ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['accedi'])) {
                return $this->handle_login();
            } else {
                return $this->handle_default();
            }


        } catch (error $e) {
            echo "Errore: " . $e->getMessage() . "\n";
        }
        return ob_get_clean();
    }


    /**
     * verifica l'accesso alla sede selezionata (solo operatore)
     * @return void
     */
    private function verifica_accesso() {
        if (empty($user_data) || $user_data['user_logged_in'] !== true) {
            $this->handle_default();
        } else { 
            if ($user_idsede == 0) {
                return;
            } else {
                if (isset($_GET['idsede'])) {
                    if ($_GET['idsede'] != $user_idsede) {
                        $this->accesso_negato();
                        exit;
                    }
                } else {
                    $url_redirect = add_query_arg('idsede', $user_idsede, home_url(RINNOVOBOOKINGPANEL));
                    wp_redirect($url_redirect);
                    exit();
                }
            }
        }
    }
    
    
    
    
    /**
     * visualizza la pagina di login o la pagina delle sedi
     * @return bool|string
     */
    private function handle_default() {
        if ($this->get_user_data('user_logged_in') === true) {
            $miaPagina = dirname(__DIR__) . '/backend/sedi.php';
            include $miaPagina;
        } else {
            $miaPagina = dirname(__DIR__) . '/backend/login.php';
            include $miaPagina;
        }
        return ob_get_clean();
    }


    /**
     * visualizza le prenotazioni della sede selezionata    
     * @return bool|string
     */
    private function handle_get_prenotazioni() {
        $id_sede = $_GET['idsede'];
        $data_corrente = date('Y-m-d');

        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
        $query = $wpdb->prepare("SELECT * FROM $table_name WHERE idsede = '$id_sede' AND date = '$data_corrente' ORDER BY date, time ASC");
        $risultati = $wpdb->get_results($query);

        if (!$risultati) {
            $query = $wpdb->prepare("SELECT * FROM $table_name WHERE idsede = '$id_sede' AND date >= '$data_corrente' ORDER BY date, time ASC LIMIT 20");
            $risultati = $wpdb->get_results($query);

            // Se ci sono risultati, aggiorna la data corrente con la prima data disponibile
            if (!empty($risultati)) {
                $data_corrente = $risultati[0]->date;
            }
        }

        $this->visualizza_risultati_ricerca($risultati, $id_sede, $data_corrente);
        return ob_get_clean();
    }

    /**
     * gestione del login
     * @return bool|string
     */
    private function handle_login() {
        $email = $_POST['email'];
        $password = $_POST['password'];
        
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_utenti';
        
        $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE email = %s", $email));
        
        if ($user && wp_check_password($password, $user->password, $user->id)) {
            return $this->login_success($user);
        } else {
            return $this->login_failure();
        }
    }

    
    /**
     * gestione del loginRiuscito
     * @param object $user
     * @return bool|string
     */
    private function login_success($user) {
        
            // Genera un token sicuro casuale
            $token = bin2hex(random_bytes(32));
    
            // Prepara i dati utente da salvare nel transient
            $user_data = [
                'user_logged_in' => true,
                'user_email'    => $user->email,
                'user_id'       => $user->id,
                'user_name'     => $user->nome,
                'user_surname'  => $user->cognome,
                'user_idsede'   => $user->idsede,
                'last_activity' => time(),
            ];
    
            // Salva i dati in un transient valido per 12 ore
            set_transient('rinnovo_booking_user_' . $token, $user_data, 12 * HOUR_IN_SECONDS);
    
            // Imposta il cookie con flag HttpOnly e SameSite per maggior sicurezza
            setcookie(
                'rinnovo_booking_token',
                $token,
                [
                    'expires'  => time() + 12 * HOUR_IN_SECONDS,
                    'path'     => '/',
                    'secure'   => isset($_SERVER['HTTPS']), // cookie solo su HTTPS
                    'httponly' => true, // impedisce accesso via JS
                    'samesite' => 'Lax', // protezione CSRF di base
                ]
            );
    
            // Carica template sedi e sostituisce placeholder
            $miaPagina = dirname(__DIR__) . '/backend/sedi.php';
            if (!file_exists($miaPagina)) {
                echo '<p>Template sedi non trovato</p>';
            }
    
            include $miaPagina;
    
       
    }


    /**
     * gestione del loginFallito
     * @return bool|string
     */
    private function login_failure() {
        $miaPagina = dirname(__DIR__) . '/backend/login.php';
        $template = file_get_contents($miaPagina);
        $errore_login = "Credenziali non valide. Riprova.";
        $template = str_replace("__ERRORE_LOGIN__", $errore_login, $template);
        
        echo $template;
        return ob_get_clean();
    }


    /**
     * genera i pulsanti delle sedi  
     * @return string
     */
    private function generate_sedi_buttons() {
        global $wpdb;
        $sediButton = '';
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_sedi';
        $sedi = $wpdb->get_results("SELECT * FROM $table_name");
        
        if ($sedi) {
            $sediButton .= '<div class="sedi-container">';
            foreach ($sedi as $sede) {
                $sediButton .= '
                    <div>                        
                        <div>
                            <a href="' . RINNOVOBOOKINGURL . '/?idsede=' . $sede->idsede . '"  class="sede-card">
                                <h4>' . esc_html($sede->nome) . '</h4>
                            </a>
                        </div>
                    </div>
                ';
            }
            $sediButton .= '</div>';
        } else {
            $sediButton .= '<p>Nessuna sede disponibile al momento.</p>';
        }
        return $sediButton;
    }


    /**
     * inserisce una prenotazione
     * @param array $dati
     * @return bool
     */
    private function nuova_prenotazione($dati) {

        $RinnovoBookingService = new RinnovoBookingService();
        
        // se prenotazione bis
        if (isset($dati['PrenotaData']) && !empty($dati['PrenotaData'])) {
            $RinnovoBookingService->registerOnDatabase($dati,'be');
        } else {
            global $wpdb;
            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
            // Usa la sede selezionata nel form per la prenotazione
            $id_sede = $_GET['idsede'];
            $cognome = sanitize_text_field($dati['cognome']);
            $nome = sanitize_text_field($dati['nome']);
            $email = sanitize_email($dati['email']);    
            $telefono = sanitize_text_field($dati['telefono']);
            $npatente = sanitize_text_field($dati['npatente']); 
            $tipo_visita = sanitize_text_field($dati['tipo_visita']);
            $data = sanitize_text_field($dati['data']);
            $ora = sanitize_text_field($dati['ora']);
            $sede_origine = sanitize_text_field($dati['sede_provenienza']);

            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'idsede' => $id_sede,
                    'cognome' => $cognome,      
                    'nome' => $nome,
                    'email' => $email,
                    'telefono' => $telefono,
                    'npatente' => $npatente,
                    'tipo_visita' => $tipo_visita,
                    'date' => $data,
                    'time' => $ora,
                    'origine' => 'be',
                ),
                array('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')
            );
            
            $last_id = $wpdb->get_var("SELECT LAST_INSERT_ID()");

            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'id_booking' => $last_id,
                    'indirizzo_destinazione' => $dati['indirizzo_destinazione'] ?? '',
                    'dove' => $dati['dove'] ?? '',
                    'indirizzo_residenza' => $dati['indirizzo'] ?? ''
                ),
                array('%d', '%s', '%s', '%s')
            );

            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_booking_origins';
            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'id_booking' => $last_id,
                    'id_sede_origine' => $sede_origine
                ),
                array('%d', '%s')
            );
        }

        $user_surname = $this->get_user_data('user_surname') ?? '';
        $user_name = $this->get_user_data('user_name') ?? '';
        $user_fullname = trim($user_surname . ' ' . $user_name);
        $RinnovoBookingService->scrivilog($user_fullname, 'Inserita prenotazione: ' . print_r($dati, true));

        return $risultato !== false;
    }
        

    /**
     * visualizza la pagina di modifica/cancella una prenotazione
     * @return bool|string
     */
    private function handle_modifica_prenotazione() {
        $id_prenotazione = $_GET['idmodifica'];
        $id_sede = $_GET['idsede'];

        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
        $query = $wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $id_prenotazione);
        $prenotazione = $wpdb->get_row($query);

        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
        $query = $wpdb->prepare("SELECT * FROM $table_name WHERE id_booking = %d", $id_prenotazione);
        $indirizzo = $wpdb->get_row($query);    

        $miaPagina = dirname(__DIR__) . '/backend/modifica_prenotazione.php';
        
        include $miaPagina;
        return ob_get_clean();
    }


    /**
     * aggiorna una prenotazione
     * @param array $dati
     * @return bool
     */
    private function aggiorna_prenotazione($dati) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
        
        $id_prenotazione = intval($dati['id_prenotazione']);
        $cognome = sanitize_text_field($dati['cognome']);
        $nome = sanitize_text_field($dati['nome']);
        $email = sanitize_email($dati['email']);    
        $telefono = sanitize_text_field($dati['telefono']);
        $data = sanitize_text_field($dati['data']);
        $ora = sanitize_text_field($dati['ora']);
        $tipo_visita = sanitize_text_field($dati['tipo_visita']);
        $stato = sanitize_text_field($dati['stato']);
        $note = sanitize_textarea_field($dati['note']);
        
        $risultato = $wpdb->update(
            $table_name,
            array(
                'cognome' => $cognome,      
                'nome' => $nome,
                'email' => $email,
                'telefono' => $telefono,
                'date' => $data,
                'time' => $ora,
                'tipo_visita' => $tipo_visita,
                'stato' => $stato,
                'note' => $note
            ),
            array('id' => $id_prenotazione),
            array('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'),
            array('%d')
        );


        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
        
        // Verifica se esiste già un record per questa prenotazione
        $existing_record = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $table_name WHERE id_booking = %d",
            $id_prenotazione
        ));

        if ($existing_record) {
            // Se esiste, aggiorna il record
            $risultato = $wpdb->update(
                $table_name,
                array(
                    'indirizzo_destinazione' => $dati['indirizzo_destinazione'] ?? '',
                    'dove' => $dati['dove'] ?? '',
                    'indirizzo_residenza' => $dati['indirizzo_residenza'] ?? ''
                ),
                array('id_booking' => $id_prenotazione),
                array('%s', '%s', '%s'),
                array('%d')
            );
        } else {
            // Se non esiste, crea un nuovo record
            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'id_booking' => $id_prenotazione,
                    'indirizzo_destinazione' => $dati['indirizzo_destinazione'] ?? '',
                    'dove' => $dati['dove'] ?? '',
                    'indirizzo_residenza' => $dati['indirizzo_residenza'] ?? ''
                ),
                array('%d', '%s', '%s', '%s')
            );
        }


        // Gestione della sede di provenienza nella tabella booking_origins
        $table_origins = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_booking_origins';
        
        // Verifica se esiste già un record per questa prenotazione
        $existing_origin = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $table_origins WHERE id_booking = %d",
            $id_prenotazione
        ));

        // Recupera l'origine della prenotazione per controllare se può essere modificata
        $table_bookings = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
        $prenotazione_origine = $wpdb->get_var($wpdb->prepare(
            "SELECT origine FROM $table_bookings WHERE id = %d",
            $id_prenotazione
        ));

        // Determina il valore della sede di origine
        if ($prenotazione_origine == 'web') {
            // Se la prenotazione è dal web, sede_origine deve rimanere sempre NULL
            $sede_origine_value = null;
        } else {
            // Se è dal backend, usa il valore fornito (null se vuoto, altrimenti il valore)
            $sede_origine_value = (isset($dati['sede_provenienza']) && !empty($dati['sede_provenienza'])) 
                                 ? sanitize_text_field($dati['sede_provenienza']) 
                                 : null;
        }

        if ($existing_origin) {
            // Se esiste, aggiorna il record
            $wpdb->update(
                $table_origins,
                array('id_sede_origine' => $sede_origine_value),
                array('id_booking' => $id_prenotazione),
                array('%s'),
                array('%d')
            );
        } else {
            // Se non esiste, crea un nuovo record
            $wpdb->insert(
                $table_origins,
                array(
                    'id_booking' => $id_prenotazione,
                    'id_sede_origine' => $sede_origine_value
                ),
                array('%d', '%s')
            );
        }
        

        $RinnovoBookingService = new RinnovoBookingService();
        $user_surname = $this->get_user_data('user_surname') ?? '';
        $user_name = $this->get_user_data('user_name') ?? '';
        $user_fullname = trim($user_surname . ' ' . $user_name);
        $RinnovoBookingService->scrivilog($user_fullname, 'Aggiornata prenotazione: '. print_r($dati, true));
        
        return $risultato !== false;    
    }
    

    /**
     * cancella una prenotazione
     * @param int $id_prenotazione
     * @return bool
     */
    private function cancella_prenotazione($id_prenotazione) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';      
        $datiBooking = $wpdb->get_row("SELECT * FROM $table_name WHERE id = $id_prenotazione");
        
        // Prima cancella i record correlati per mantenere l'integrità referenziale        
        // Cancella dalla tabella indirizzi
        $table_indirizzi = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
        $wpdb->delete($table_indirizzi, array('id_booking' => $id_prenotazione), array('%d'));
        
        // Cancella dalla tabella booking_origins
        $table_origins = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_booking_origins';
        $wpdb->delete($table_origins, array('id_booking' => $id_prenotazione), array('%d'));
        
        // Infine cancella la prenotazione principale
        $risultato = $wpdb->delete($table_name, array('id' => $id_prenotazione), array('%d'));       
        
        $RinnovoBookingService = new RinnovoBookingService();
        $user_surname = $this->get_user_data('user_surname') ?? '';
        $user_name = $this->get_user_data('user_name') ?? '';
        $user_fullname = trim($user_surname . ' ' . $user_name);
        $RinnovoBookingService->scrivilog($user_fullname, 'Cancellata prenotazione: '. $datiBooking->cognome . ' ' . $datiBooking->nome . ' - ' . $datiBooking->email . ' - ' . $datiBooking->telefono . ' - ' . $datiBooking->date . ' - ' . $datiBooking->time);
        return $risultato !== false;
    }


    /**
     * cerca le prenotazioni
     * @param array $query_args
     * @return array
     */
    private function cerca_prenotazioni($query_args) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';   
        $limit = '';
        
        // Controlla se ci sono filtri specifici
        $has_cognome = isset($query_args['cognome']) && !empty($query_args['cognome']);
        $has_data = isset($query_args['data']) && !empty($query_args['data']);
        $has_stato = isset($query_args['stato']) && !empty($query_args['stato']);
        
        // Se NON ci sono filtri specifici, applica LIMIT 1
        if (!$has_cognome && !$has_data && !$has_stato) {
            $where_conditions = "idsede = '".$query_args['idsede']."'";
            $limit = "LIMIT 20";
        } else {
            // Costruisci le condizioni in base ai filtri presenti
            $where_conditions = "idsede = '".$query_args['idsede']."'";
            
            if ($has_cognome) {
                $where_conditions .= " AND cognome LIKE '%".$query_args['cognome']."%'";
            }
            if ($has_data) {
                $where_conditions .= " AND date = '".$query_args['data']."'";
            }
            if ($has_stato) {
                $where_conditions .= " AND stato = '".$query_args['stato']."'";
            }
        }
        
        $query = $wpdb->prepare("SELECT * FROM $table_name WHERE $where_conditions ORDER BY date, time ASC $limit");
        return $wpdb->get_results($query);
    }


    /**
     * visualizza i risultati della ricerca
     * @param array $risultati
     * @param int $id_sede
     * @param string $data
     * @return void
     */
    private function visualizza_risultati_ricerca($risultati, $id_sede, $data) {

        $RinnovoBookingShortcode = new RinnovoBookingShortcode();
        $orari = $RinnovoBookingShortcode->handle_orario_shortcode(array('sede' => $id_sede, 'gruppo' => ''));

        $miaPagina = dirname(__DIR__) . '/backend/prenotazioni.php';
        include $miaPagina;
        
        // Gestione notifiche
        if (!empty($this->get_user_data['notification_type']) && !empty($this->get_user_data['notification_message'])) {
            Notification::display_notification(
                $this->get_user_data['notification_message'],
                $this->get_user_data['notification_type'],
                $this->get_user_data['notification_title'] ?? ''
            );

            // Pulisci la notifica dopo averla mostrata
            $this->set_user_data([
                'notification_type' => null,
                'notification_message' => null,
                'notification_title' => null
            ]);
        }
    }


    /**
     * Summary of genera_tabella_prenotazioni
     * @param mixed $risultati
     * @param mixed $id_sede
     * @return string
     */
    private function genera_tabella_prenotazioni($risultati, $id_sede) {
        global $wpdb;
        $html = '';
        $n = 1;
        foreach ($risultati as $riga) {
            $origine = $riga->origine;
            $origine_img = $origine == 'web' ? '../backend/images/globe.svg' : '../backend/images/computer.svg';

            //query estrazione destinazione
            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
            $query = $wpdb->prepare(
                "SELECT * FROM $table_name 
                WHERE id_booking = %d", 
                $riga->id
            );
            $indirizzo = $wpdb->get_row($query);
            $tipo_invio_icon = $indirizzo->dove == 'casa' ? '../backend/images/casa.svg' : '../backend/images/autoscuola.svg';

            // Query per estrarre la sede di provenienza
            $table_origins = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_booking_origins';
            $table_sedi = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_sedi';
            $sede_provenienza = $wpdb->get_var($wpdb->prepare(
                "SELECT s.nome 
                 FROM $table_origins bo 
                 JOIN $table_sedi s ON bo.id_sede_origine = s.idsede 
                 WHERE bo.id_booking = %d", 
                $riga->id
            ));
            
            // Se non c'è sede di provenienza o è dal web, mostra vuoto
            $provenienza_display = $sede_provenienza ? esc_html($sede_provenienza) : '';

            $tipo_visita_icon = '';
                switch($riga->tipo_visita) {
                    case 'rinnovo':
                        $tipo_visita_icon = '../backend/images/rinnovo.svg';
                        break;
                    case 'conseguimento':
                        $tipo_visita_icon = '../backend/images/conseguimento.svg';
                        break;
                    case 'porto_d_armi':
                        $tipo_visita_icon = '../backend/images/armi.svg';
                        break;
                    case 'estensione':
                        $tipo_visita_icon = '../backend/images/estensione.svg';
                        break;
                    case 'duplicato_documento':
                        $tipo_visita_icon = '../backend/images/duplicato.svg';
                        break;
                    case 'rinnovo_patente_nautica':
                        $tipo_visita_icon = '../backend/images/nautica.svg';
                        break;
                    default:
                        $tipo_visita_icon = '../backend/images/default.svg';
                };

            $html .= '<tr>
                <td>
                    <img src="' . plugins_url($origine_img, __FILE__) . '" title="' . $origine . '" style="width: 24px; height: 24px;">
                </td>
                <td>' . esc_html($n++) . '</td>
                <td class="rb-capitalize">' . esc_html($riga->cognome) . ' ' . esc_html($riga->nome) . '</td>
                <td class="">' . esc_html(date('d-m-Y', strtotime($riga->date))) . ' ' . esc_html($riga->time) . '</td>
                <td class="">
                <img src="' . plugins_url('../backend/images/email.svg', __FILE__) . '" title="Email" style="width: 16; height: 16; margin-right: 4px;">' . esc_html($riga->email) 
                . '<br>' . 
                '<img src="' . plugins_url('../backend/images/telefono.svg', __FILE__) . '" title="Telefono" style="width: 16; height: 16; margin-right: 4px;">' . esc_html($riga->telefono) . '</td>
                <td>' . esc_html($provenienza_display) . '</td>
                <td class="" style="text-align: center;">
                    <img src="' . plugins_url($tipo_visita_icon, __FILE__) . '" title="' . $riga->tipo_visita . '" style="width: 24px; height: 24px;">
                </td>
                <td class="" style="text-align: center;">
                    <img src="' . plugins_url($tipo_invio_icon, __FILE__) . '" title="' . $indirizzo->dove . '" style="width: 24px; height: 24px;">
                </td>
                <td class="" style="text-align: center;">'.
                    (($riga->stato == 'active') ? '<span class="badge badge-sold">Aperto</span>' :
                    (($riga->stato == 'closed') ? '<span class="badge badge-success">Chiuso</span>' :
                    (($riga->stato == 'payment') ? '<span class="badge badge-payment">In Pagamento</span>' :
                    (($riga->stato == 'sold') ? '<span class="badge badge-denied">Pagato</span>' :
                    esc_html($riga->stato)))))
                .'</td>
                <td class="rb-nowrap">
                    <a href="?idsede=' . esc_html($id_sede) . '&idmodifica=' . esc_html($riga->id) . '" title="Modifica">
                        <img src="' . plugins_url('../backend/images/modifica.svg', __FILE__) . '" title="Modifica" style="width: 24px; height: 24px;">
                    </a>
                    <a href="?idsede='.esc_html($id_sede).'&idcancella='.esc_html($riga->id).'" onclick="return confirm(\'Sei sicuro di voler cancellare la prenotazione?\')" title="Cancella">
                        <img src="' . plugins_url('../backend/images/cestino.svg', __FILE__) . '" title="Cancella" style="width: 24px; height: 24px;">
                    </a>
            ';

            $servizi = rinnovo_booking_verify_services();
            if (in_array('ipatentebutton', $servizi)) {
                $html .= '
                <a href="?sede='.esc_html($id_sede).'&idipatente='.esc_html($riga->id).'" onclick="return confirm(\'Sei sicuro di voler inviare ad ipatente?\')" title="Ipatente" name="ipatentebutton">
                    <img src="' . plugins_url('../backend/images/ipatente.svg', __FILE__) . '" title="Ipatente" style="width: 24px; height: 24px;">
                </a>';
            }             

            $servizi = rinnovo_booking_verify_services();
            if (in_array('emailbutton', $servizi)) {

                $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_emails';
                $query = $wpdb->prepare("SELECT * FROM $table_name WHERE id_booking = '$riga->id'");
                $checkEmail = $wpdb->get_results($query);

                if(count($checkEmail) == 0) {
                    $html .= '
                    <a href="?idsede='.esc_html($id_sede).'&tipo=email&idemail='.esc_html($riga->id).'&azione=vedi" onclick="return confirm(\'Sei sicuro di voler inviare ad email?\')" title="Email" name="emailbutton">
                        <img src="' . plugins_url('../backend/images/email.svg', __FILE__) . '" title="Email" style="width: 24px; height: 24px;">
                    </a>';
                } else {
                    $html .= '
                    <a href="?idsede='.esc_html($id_sede).'&tipo=email&idemail='.esc_html($riga->id).'&azione=vedi" onclick="return confirm(\'Sei sicuro di voler inviare ad email?\')" title="Email" name="emailbutton">
                        <img src="' . plugins_url('../backend/images/emailopen.svg', __FILE__) . '" title="Email" style="width: 24px; height: 24px;">
                    </a>';
                }
                
            }   

            $html .= '
                </td>
            </tr>';
        }
        return $html;
    }


    /**
     * estrae il nome della sede
     * @param int $id_sede
     * @return string
     */
    private function estrai_nome_sede($id_sede) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_sedi';
        $query = "SELECT nome FROM $table_name WHERE idsede = '$id_sede'";
        $nome_sede = $wpdb->get_var($query);
        return $nome_sede;
    }


    /**
     * crea il calendario del back end
     * @param int $id_sede
     * @return array
     */
    private function crea_calendario($id_sede) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . "_bookings";
        $risultati = $wpdb->get_results("SELECT date AS giorni FROM $table_name WHERE idsede = '$id_sede' GROUP BY date ORDER BY date ASC");            
        return $risultati;
    }


    /**
     * converte il mese in italiano
     * @param string $mese
     * @return string
     */
    private function meseItaliano($mese) {
        // Se viene passata una data completa, estraiamo le parti
        if (strpos($mese, ' ') !== false) {
            $parti = explode(' ', $mese);
            $giorno = $parti[0];
            $mese = $parti[1];
            $anno = $parti[2];
        }

        $mesi = [
            'January' => 'Gennaio',
            'February' => 'Febbraio', 
            'March' => 'Marzo',
            'April' => 'Aprile',
            'May' => 'Maggio',
            'June' => 'Giugno',
            'July' => 'Luglio',
            'August' => 'Agosto',
            'September' => 'Settembre',
            'October' => 'Ottobre',
            'November' => 'Novembre',
            'December' => 'Dicembre'
        ];
        
        // Se abbiamo una data completa, restituiamo la data con il mese tradotto
        if (isset($giorno) && isset($anno)) {
            return $giorno . ' ' . ($mesi[$mese] ?? $mese) . ' ' . $anno;
        }
        
        // Altrimenti restituiamo solo il mese tradotto
        return $mesi[$mese] ?? $mese;
    }


    /**
     * gestione delle pagine
     * @return bool|string
     */
    private function handle_impostazioni() {
        $miaPagina = dirname(__DIR__) . '/backend/impostazioni.php';

        include $miaPagina;
        return ob_get_clean();
    }

    /**
     * gestione della pagina email
     * @return bool|string
     */
    private function handle_email() {
        $miaPagina = dirname(__DIR__) . '/backend/formEmail.php';
        include_once $miaPagina;
        return ob_get_clean();
    }


    /**
     * invia l'email
     * @return bool
     */
    private function handle_send_email() {
        $id_booking = sanitize_text_field($_GET['idemail']);
        $idSede = sanitize_text_field($_GET['idsede']);
        $email = $_POST['emailto'];
        $oggetto = sanitize_text_field($_POST['oggetto']);
        $testo = wp_unslash($_POST['editor']);

        $attachments = [];
        $EmailService = new EmailService();

        $RinnovoBookingService = new RinnovoBookingService();
        $opzioniSistema = $RinnovoBookingService->vediOpzioniSistema($idSede);

        if(in_array('qrcode', $opzioniSistema)) {  
            $attachments = $EmailService->allegaQrCode($_GET['idemail']);
        }

        $risultatoInvioEmail = $EmailService->sendConfirmationEmail($idSede, $email, $oggetto, $testo, $attachments);
        $EmailService->saveEmail($id_booking, $idSede, $email, $oggetto, $testo);
        
        // Pulisci i file temporanei dopo l'invio
        if (!empty($attachments)) {
            foreach ($attachments as $attachment) {
                if (file_exists($attachment)) {
                    unlink($attachment);
                }
            }
        }

        if (!$risultatoInvioEmail) {
            return false;
        } else {
            return true;
        }
    }


    /**
     * gestione della pagina nuova prenotazione
     * @return bool|string
     */
    private function handle_nuova_prenotazione() {
        $miaPagina = dirname(__DIR__) . '/backend/nuova_prenotazione.php';
        include $miaPagina;
        return ob_get_clean();
    }

    /**
     * gestione della pagina nuova prenotazione bis
     * @return bool|string
     */
    private function handle_nuova_prenotazione_bis() {
        $miaPagina = dirname(__DIR__) . '/backend/nuova_prenotazione_bis.php';
        include $miaPagina;
        return ob_get_clean();    
    }
    
    /**
     * verifica se il servizio ipatente è attivo
     * @return bool|string
     */
    private function verify_ipatente() {
        if (rinnovo_booking_verify_license()) {
            // Disabilita le funzionalità del plugin o mostra un avviso
            $servizi = rinnovo_booking_verify_services();
            if (!in_array('ipatente', $servizi) && !in_array('ipatentebutton', $servizi)) {
                $miaPagina = dirname(__DIR__) . '/backend/ipatente_error.php';
                include_once $miaPagina;   
            }
        }
        return ob_get_clean();
    }

    /**
     * gestione della pagina ipatente
     * @return bool|string
     */
    private function handle_ipatente() {
        global $wpdb;

        // estrae i dati della prenotazione
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
        $risultati = $wpdb->get_results("SELECT * FROM $table_name WHERE id = '$_GET[idipatente]'");

        // formatta le date
        $risultati[0]->PrenotaData = date('d/m/Y', strtotime($risultati[0]->date));
        unset($risultati[0]->date);
        $risultati[0]->PrenotaOra = date('H:i', strtotime($risultati[0]->time));
        unset($risultati[0]->time);
        $risultati[0]->sede = $risultati[0]->idsede;
        unset($risultati[0]->idsede);

        // estrae il gruppo della sede
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_sedi';
        $sedi = $wpdb->get_results("SELECT `gruppo` FROM $table_name WHERE idsede  = '$_GET[sede]'");
        $risultati[0]->gruppo = $sedi[0]->gruppo;

        // registrazione sulla piattaforma ipatente
        $ipatenteService = new iPatenteService();
        $risultatoRegistrazione = $ipatenteService->registerOnIPatente((array)$risultati[0]);

        if (!$risultatoRegistrazione) {
            return false;
        } else {
            return true;
        }

    }

    private function handle_menu($idSede) {
        $nome_sede = $this->estrai_nome_sede($idSede);
        
        $html = '
            <div class="uk-text-left uk-margin-small-left">
                <span style="font-weight: bold; color: #ccc; font-size: 22px;">Area Privata</span><br>
                <span style="font-weight: bold; font-size: 32px;">'.$nome_sede.'</span>
            </div>       
            <div align="right">';

        if(isset($_GET['tipo']) && $_GET['tipo'] == 'nuovaprenotazionebis') {
            $html .= '<label class="action-button-label uk-text-bold">NuovaPrenotazione</label>';
        } else {
            $html .= '<a href="'.RINNOVOBOOKINGURL.'/?idsede='.$idSede.'&tipo=nuovaprenotazionebis" class="action-button uk-text-bold ">Nuova Prenotazione</a>';
        }

        if(isset($_GET['tipo']) && $_GET['tipo'] == 'nuovaprenotazione') {
            $html .= '<label class="action-button-label uk-text-bold"> Extra</label>';
        } else {
            $html .= '<a href="'.RINNOVOBOOKINGURL.'/?idsede='.$idSede.'&tipo=nuovaprenotazione" class="action-button uk-text-bold ">Extra</a>';
        }

        $html .= '<a href="' . RINNOVOBOOKINGURL . '/?idsede=' . $idSede . '" class="action-button uk-text-bold">Prenotazioni</a>';


        $user_surname = $this->get_user_data('user_surname') ?? '';
        $user_name = $this->get_user_data('user_name') ?? '';
        $user_fullname = trim($user_surname . ' ' . $user_name);

        // Aggiunta menu dropdown
        $html .= '<div class="rb-dropdown-container uk-margin-small-right uk-margin-bottom uk-margin-large-left">
                    <button class="rb-dropdown-button" type="button" style="white-space: nowrap; width: 100%;">
                        '.$user_fullname.'
                        <span uk-icon="icon: triangle-down"></span>
                    </button>
                    <div class="rb-dropdown">
                        <ul class="rb-dropdown-nav">
                            <li>
                                <a href="'.RINNOVOBOOKINGURL.'/?tipo=impostazioni&idsede='.$idSede.'">
                                    Impostazioni
                                </a>
                            </li>
                            <li>
                                <a href="'.RINNOVOBOOKINGURL.'/">
                                    Cambia sede
                                </a>
                            </li>
                            <li class="rb-divider"></li>
                            <li>
                                <a href="'.RINNOVOBOOKINGURL.'/?tipo=logout">
                                    Logout
                                </a>
                            </li>
                        </ul>
                    </div>
                </div>';

        $html .= '</div>
                    </div>';

        // Script per dropdown
        $html .= '
            <script>
                document.querySelector(".dropdown button").addEventListener("click", function() {
                    const dropdownContent = this.nextElementSibling;
                    dropdownContent.style.display = dropdownContent.style.display === "block" ? "none" : "block";
                });
                document.addEventListener("click", function(e) {
                    const dropdowns = document.querySelectorAll(".dropdown-content");
                    dropdowns.forEach(dropdown => {
                        if (!e.target.closest(".dropdown")) {
                            dropdown.style.display = "none";
                        }
                    });
                });
            </script>';

        return $html;
    }

}
