<?php

namespace RinnovoBooking\Core;

use DateTime;

class RinnovoBookingService {


    /**
     * Summary of scriviLog
     * @param mixed $operatore
     * @param mixed $testo
     * @return void
     */
    public function scriviLog($operatore = 'sistema', $testo = ''){
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_log';
        $oggi = current_time('mysql');
        $wpdb->insert(
            $table_name,
            array(
                'data_ora' => $oggi,
                'operatore' => $operatore,
                'operazione' => $testo
            ),
            array('%s', '%s', '%s')
        );
    }


    /**
     * Summary of rinnovo_booking_CURLBearer
     * @param mixed $URL
     * @param mixed $KEY
     * @param mixed $FIELD
     * @return mixed
     */
    public function rinnovo_booking_CURLBearer($URL, $KEY, $FIELD) {    
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $URL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",    
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS => $FIELD,
            CURLOPT_HTTPHEADER => array(
                "Authorization: Bearer " . $KEY
            ),
        ));
    
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
    
        if ($err) {
            return "cURL Error #:" . $err;
        } else {
            return $response;
        }    
    }


    /**
     * Summary of rinnovo_booking_CURLBearer_GET
     * @param mixed $URL
     * @param mixed $KEY
     * @return mixed
     */
    public function rinnovo_booking_CURLBearer_GET($URL, $KEY) {    
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $URL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "Authorization: Bearer " . $KEY
            ),
        ));
    
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
    
        if ($err) {
            return "cURL Error #:" . $err;
        } else {
            return $response;
        }    
    }


    /**
     * Summary of registerOnDatabase
     * @param mixed $data
     * @return bool
     */
    public function registerOnDatabase($data, $origine='web') {

        try {
            global $wpdb;
            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_bookings';
            $data_inserimento = current_time('mysql');
            
            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'idsede' => sanitize_text_field($data['sede']),
                    'date' => DateTime::createFromFormat('d/m/Y', sanitize_text_field($data['PrenotaData']))->format('Y-m-d'),
                    'time' => sanitize_text_field($data['PrenotaOra']),
                    'available' => 1,
                    'tot' => 1,
                    'cognome' => sanitize_text_field($data['cognome']),
                    'nome' => sanitize_text_field($data['nome']),
                    'email' => sanitize_email($data['email']),
                    'telefono' => sanitize_text_field($data['telefono']),
                    'npatente' => sanitize_text_field($data['npatente']),
                    'tipo_visita' => sanitize_text_field($data['tipo_visita']),
                    'origine' => $origine,
                    'created_at' => $data_inserimento,
                )
            );
            
           $last_id = $wpdb->get_var("SELECT LAST_INSERT_ID()");

            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_indirizzi';
            $wpdb->insert(
                $table_name,
                array(
                    'id_booking' => $last_id,
                    'dove' => sanitize_text_field($data['destinazione_patente']),
                    'indirizzo_residenza' => sanitize_text_field($data['indirizzo']),
                    'indirizzo_destinazione' => sanitize_text_field($data['indirizzo_ricezione']),
                )
            );       

            $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_booking_origins';
            $risultato = $wpdb->insert(
                $table_name,
                array(
                    'id_booking' => $last_id,
                    'id_sede_origine' => sanitize_text_field($data['sede_provenienza'])
                ),
                array('%d', '%s')
            );
            
            $this->scriviLog('web', 'Prenotazione caricata con ID: ' . $last_id . '-' .print_r($data, true));
            return true;
        } catch (Exception $e) {
            $this->scriviLog('web', 'Errore caricamento prenotazione: '.print_r($data, true));
            return false;
        }
    }


    /**
     * Vedi le opzioni del sistema
     * @return array
     */
    function vediOpzioniSistema($idsede) {
        global $wpdb;
        $table_name = $wpdb->prefix.RINNOVOBOOKINGPREFIX.'_sedi';
        $rb_opzioni = $wpdb->get_results("SELECT `opzioni` FROM $table_name WHERE `idsede`= '$idsede'");
        $rb_opzioni = json_decode($rb_opzioni['0']->opzioni);

        $options = [];
        if(isset($rb_opzioni->emailcliente)) {
            $options[] = 'emailcliente';
        }
        if(isset($rb_opzioni->emailautoscuola)) {
            $options[] = 'emailautoscuola';
        }
        if(isset($rb_opzioni->obbligofotofirmata)) {
            $options[] = 'obbligofotofirmata';
        }
        if(isset($rb_opzioni->qrcode)) {
            $options[] = 'qrcode';
        }
        if(isset($rb_opzioni->emailbutton_risposta)) {
            $options[] = 'emailbutton_risposta';
        }
        if(isset($rb_opzioni->consegnadocumento)) {
            $options[] = 'consegnadocumento';
        }
        return $options;
    }

    
    /**
     * Genera un QR code per una prenotazione
     * @param string $place Luogo della prenotazione
     * @param string $date Data della prenotazione
     * @param string $time Orario della prenotazione
     * @param string $service Tipo di servizio
     * @param string $name Nome del cliente
     * @return string|false Percorso del QR code generato o false in caso di errore
     */
    public function generateQRCode($place, $date, $time, $service, $name) {
        // Verifica che la libreria phpqrcode sia disponibile
        if (!function_exists('QRcode::png')) {
            require_once(plugin_dir_path(__FILE__) . '../vendor/phpqrcode/qrlib.php');
        }

        // Crea l'array con i dati della prenotazione
        $bookingData = array(
            'Booking' => array(
                'place' => $place,
                'date' => $date,
                'time' => $time,
                'service' => $service,
                'name' => $name
            )
        );

        // Converti l'array in JSON
        $jsonData = json_encode($bookingData);

        // Crea il nome del file QR code
        $qrFileName = 'booking_' . time() . '.png';
        $qrFilePath = plugin_dir_path(__FILE__) . '../qrcodes/' . $qrFileName;

        // Assicurati che la directory esista
        if (!file_exists(plugin_dir_path(__FILE__) . '../qrcodes/')) {
            mkdir(plugin_dir_path(__FILE__) . '../qrcodes/', 0777, true);
        }

        // Genera il QR code
        try {
            QRcode::png($jsonData, $qrFilePath, QR_ECLEVEL_L, 10);
            return $qrFilePath;
        } catch (Exception $e) {
            $this->scriviLog('sistema', 'Errore nella generazione del QR code: ' . $e->getMessage());
            return false;
        }
    }

    /**
     * Summary of saveIPatenteApi
     * @param mixed $data
     * @return void
     */
    public function saveIPatenteApi($data, $sede='0', $funzione='0', $ipOrigine='0') {
        global $wpdb;
        $data_ora = current_time('mysql');
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_iPatente_Api';
        $wpdb->insert(
            $table_name,
            array(
                'sede' => $sede,
                'ip_origine' => $ipOrigine,
                'risultato' => $data,
                'funzione' => $funzione,
                'created_at' => $data_ora
            )
        );
    }
}

