<?php

namespace RinnovoBooking\Core;

class EmailService {


    /**
     * Valida che il file sia un'immagine supportata
     * @param array $file Array del file upload
     * @return bool
     * @throws Exception
     */
    private function validateImageFile($file) {
        $allowedTypes = ['image/jpeg', 'image/jpg', 'image/gif'];
        $fileType = mime_content_type($file['tmp_name']);
        
        if (!in_array($fileType, $allowedTypes)) {
            throw new Exception("Formato file non supportato: " . $fileType . ". Sono accettati solo JPG, JPEG e GIF.");
        }
        
        return true;
    }

    /**
     * Funzione per l'invio di email da WordPress
     * @param string $to Indirizzo email del destinatario
     * @param string $subject Oggetto dell'email
     * @param string $message Contenuto dell'email
     * @return bool
     */
    public function sendClientEmail($sede, $dati, $attachments) {

        $nomeSede = $this->getSede($sede);
        $message = $this->generateCustomEmail($nomeSede, $dati);

        $subject = 'Prenotazione per ' .$dati['tipo_visita']. ' in data '.$dati['PrenotaData'].' alle ore '.$dati['PrenotaOra'];
        $headers = array('Content-Type: text/html; charset=UTF-8', 'From: ' . $nomeSede[0]->email . ' <' . $nomeSede[0]->email . '>');

        $resultEmail = wp_mail($dati['email'], $subject, $message, $headers, $attachments);

        if (is_wp_error($resultEmail)) {
            return false;
        } else {
            return true;
        }
    }


    /**
     * Funzione per l'invio di email da WordPress
     * @param int $sede
     * @param array $dati
     * @param array $attachments
     * @return bool
     */
    public function sendAdminEmail($sede, $dati, $attachments) {
        $nomeSede = $this->getSede($sede);
        $message = $this->generateCustomEmail($nomeSede, $dati);
    
        $subject = 'Prenotazione per ' . $dati['tipo_visita'] . ' in data ' . $dati['PrenotaData'] . ' alle ore ' . $dati['PrenotaOra'];
        $headers = array('Content-Type: text/html; charset=UTF-8', 'From: ' . $nomeSede[0]->email . ' <' . $nomeSede[0]->email . '>');

        $allEmails = explode(',', $nomeSede[0]->emailcontatto); // Tutti i destinatari, separati da virgola
        $to = trim(array_shift($allEmails)); // rimuove e restituisce il primo
        $bcc = implode(',', array_map('trim', $allEmails)); // I rimanenti in copia nascosta (Bcc)
     
        if (!empty($bcc)) {
            $headers[] = 'Bcc: ' . $bcc;
        }
    
        // Invia email
        $resultEmail = wp_mail($to, $subject, $message, $headers, $attachments);
    
        if (is_wp_error($resultEmail)) {
            return false;
        } else {
            return true;
        }
    }
    


    /**
     * Funzione per l'invio di email da WordPress
     * @param string $to
     * @param string $subject
     * @param string $message
     * @return bool
     */
    public function sendInfoEmail($sede, $dati, $attachments) {
        $nomeSede = $this->getSede($sede);
        $message = $this->generateInfoEmail($nomeSede, $dati);
        
        $subject = 'Prenotazione per ' .$dati['tipo_visita']. ' in data '.$dati['PrenotaData'].' alle ore '.$dati['PrenotaOra'];
        $headers = array('Content-Type: text/html; charset=UTF-8', 'From: ' . $nomeSede[0]->email . ' <' . $nomeSede[0]->email . '>');
        
        $resultEmail = wp_mail($dati['email'], $subject, $message, $headers, $attachments);
        if (is_wp_error($resultEmail)) {
            return false;
        } else {
            return true;
        }
    }
    

    /**
     * Funzione per l'invio di email da backend
     * @param string $to
     * @param string $subject
     * @param string $message
     * @return bool
     */
    public function sendConfirmationEmail($sede, $to, $subject, $message, $attachments) {
        $nomeSede = $this->getSede($sede);        
        
        // Usa l'email di risposta configurata per emailbutton
        $opzioni = json_decode($nomeSede[0]->opzioni);
        $emailRisposta = isset($opzioni->emailbutton_risposta) ? $opzioni->emailbutton_risposta : $nomeSede[0]->email;
        
        // Headers base
        $headers = array(
            'From: ' . $nomeSede[0]->email . ' <' . $nomeSede[0]->email . '>',
            'Content-Type: text/html; charset=UTF-8',
            'MIME-Version: 1.0'
        );

        // Prepara il messaggio HTML
        $message = wpautop(wp_unslash($message));

        // Invia email al destinatario principale
        $resultEmail = wp_mail($to, $subject, $message, $headers, $attachments);

        if (is_wp_error($resultEmail)) {
            return false;
        } else {
            global $dataApi;
            $hasEmailButton = in_array('emailbutton', $dataApi['servizi'] );
            
            if($hasEmailButton) {
                // Se emailbutton è attivo, usa emailbutton_risposta
                $emailRisposta = json_decode($nomeSede[0]->opzioni)->emailbutton_risposta ?? $nomeSede[0]->emailcontatto;
                $resultEmail = wp_mail($emailRisposta, $subject, $message, $headers, $attachments);
            } else {
                // Se emailbutton NON è attivo, usa emailcontatto
                $allEmails = explode(',', $nomeSede[0]->emailcontatto);
                // Gestione delle copie nascoste
                $to = trim(array_shift($allEmails));
                $bcc = implode(',', array_map('trim', $allEmails));
                
                if (!empty($bcc)) {
                    $headers[] = 'Bcc: ' . $bcc;
                    $resultEmail = wp_mail($to, $subject, $message, $headers, $attachments);
                    return !is_wp_error($resultEmail);
                }
            }
            
            return true;
        }
    }


    /**
     * Funzione per salvare l'email nella tabella _emails
     * @param int $idsede
     * @param string $email
     * @param string $oggetto
     * @param string $testo
     */
    function saveEmail($id_booking, $idsede, $email, $oggetto, $testo) {
        global $wpdb;
        $nomeSede = $this->getSede($idsede); 
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_emails';
        $wpdb->insert($table_name, array('id_booking' => $id_booking, 'sede' => $nomeSede[0]->nome, 'email' => $email, 'oggetto' => $oggetto, 'testo' => $testo));
    }


    /**
     * Funzione per generare il QR code
     * @param int $idEmailS
     * @return array
     */
    public function allegaQrCode($idEmail) {
        global $wpdb;        
        $idEmail = sanitize_text_field($_GET['idemail']);
        $table_name = $wpdb->prefix.RINNOVOBOOKINGPREFIX.'_bookings';    
        $table_name2 = $wpdb->prefix.RINNOVOBOOKINGPREFIX.'_sedi';

        $resultsBooking = $wpdb->get_results("SELECT * FROM $table_name WHERE `id` = '$idEmail'");
        $idSede = $resultsBooking[0]->idsede;
        $resultsSede = $wpdb->get_results("SELECT * FROM $table_name2 WHERE `idsede` = '$idSede'");

        $json = '<CAF>{"Booking":{"place":"'.$resultsSede[0]->nome.'","date":"'.date('d/m/Y', strtotime($resultsBooking[0]->date)).'","time":"'.date('H:i', strtotime($resultsBooking[0]->time)).'","service":"'.$resultsBooking[0]->tipo_visita.'","name":"'.$resultsBooking[0]->cognome . ' ' . $resultsBooking[0]->nome.'"}}</CAF>';

    
        // Genera il QR code come stringa binaria PNG
        $qrBinaryString = RinnovoBookingQr::getImgHtml($json, 300, [
            'alt' => 'QR prenotazione',
            'class' => 'qr-code'
        ]);


        // Crea un file temporaneo con estensione .png
        $tempFilePath = tempnam(sys_get_temp_dir(), 'qrcode_') . '.png';
        file_put_contents($tempFilePath, $qrBinaryString);

        $attachments = [];
        if (file_exists($tempFilePath)) {
            $attachments[] = $tempFilePath;
        }
        
        return $attachments;
    }



       /**
     * Funzione per generare il corpo dell'email
     * @param int $sede
     * @param array $data
     * @return string
     */
    private function generateCustomEmail($nomeSede, $data) {

        $allEmails = explode(',', $nomeSede[0]->emailcontatto); // Tutti i destinatari, separati da virgola
        $to = trim(array_shift($allEmails)); // rimuove e restituisce il primo

        $miaPagina = dirname(__DIR__) . '/email/customEmail.php';
        $template = file_get_contents($miaPagina);
        $template = str_replace("__COGNOME__", $data['cognome'], $template); // Aggiorna variabile
        $template = str_replace("__NOME__", $data['nome'], $template);
        $template = str_replace("__DATA__", esc_html($data['PrenotaData']), $template);
        $template = str_replace("__ORA__", esc_html($data['PrenotaOra']), $template);
        $template = str_replace("__TELEFONO__", $data['telefono'], $template);
        $template = str_replace("__EMAIL__", $data['email'], $template);
        $template = str_replace("__CFPATENTE__", $data['npatente'], $template);
        $template = str_replace("__AUTOSCUOLA__", $nomeSede[0]->nome, $template);
        $template = str_replace("__INDIRIZZO__", $nomeSede[0]->indirizzo, $template);
        $template = str_replace("__TELSEDE__", $nomeSede[0]->telefono, $template);
        $template = str_replace("__EMAILSEDE__", $to, $template);        
        return $template;
    }


    /**
     * Funzione per generare il corpo dell'email
     * @param int $sede
     * @param array $data
     * @return string
     */
    private function generateInfoEmail($nomeSede, $data) {
        $allEmails = explode(',', $nomeSede[0]->emailcontatto); // Tutti i destinatari, separati da virgola
        $to = trim(array_shift($allEmails)); // rimuove e restituisce il primo

        $miaPagina = dirname(__DIR__) . '/email/infoEmail.php';
        $template = file_get_contents($miaPagina);
        $template = str_replace("__COGNOME__", $data['cognome'], $template); // Aggiorna variabile
        $template = str_replace("__NOME__", $data['nome'], $template);
        $template = str_replace("__DATA__", esc_html($data['PrenotaData']), $template);
        $template = str_replace("__ORA__", esc_html($data['PrenotaOra']), $template);
        $template = str_replace("__TELEFONO__", $data['telefono'], $template);
        $template = str_replace("__EMAIL__", $data['email'], $template);
        $template = str_replace("__CFPATENTE__", $data['npatente'], $template);
        $template = str_replace("__AUTOSCUOLA__", $nomeSede[0]->nome, $template);
        $template = str_replace("__INDIRIZZO__", $nomeSede[0]->indirizzo, $template);
        $template = str_replace("__TELSEDE__", $nomeSede[0]->telefono, $template);
        $template = str_replace("__EMAILSEDE__", $to, $template);        
        return $template;
    }





    /**
     * Funzione per ottenere i dati della sede
     * @param int $sede
     * @return array
     */
    private function getSede($sede) {
        global $wpdb;
        $table_name = $wpdb->prefix . RINNOVOBOOKINGPREFIX . '_sedi';
        $nomeSede = $wpdb->get_results("SELECT * FROM $table_name WHERE idsede = '$sede'");
        return $nomeSede;
    }

    public function generateAttachments($files, $firma) {
        $upload_dir = wp_upload_dir();
        $rb_dir = $upload_dir['basedir'] . '/rb';
        if (!file_exists($rb_dir)) {
            mkdir($rb_dir, 0777, true);
        }

        // Modifica temporaneamente la directory di upload per wp_upload_bits
        add_filter( 'upload_dir', function( $dirs ) use ($rb_dir) {
            $dirs['path'] = $rb_dir;
            $dirs['url'] = $rb_dir;
            return $dirs;
        });

        $attachments = [];
        // verifica esistenza della foto
        if (isset($files["foto"]["name"]) && !empty($files["foto"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["foto"]);
            
            // acquisizione e configurazione foto
            $foto = $files["foto"];
            $uploadFoto = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]), $rb_dir);

            // Creazione allegati
            $attachments['foto.jpg'] = $uploadFoto['file'];
        }

        // acquisizione e configurazione firma
        // Verifica se la variabile "firma" è impostata
        if (isset($firma) && !empty($firma)) {
            $firmaBase64 = $firma;
            $firmaBase64 = str_replace('data:image/png;base64,', '', $firmaBase64);
            $firmaData = base64_decode($firmaBase64);

            // Crea un file temporaneo per la firma
            $tempFilePath = tempnam(sys_get_temp_dir(), 'signature_') . '.jpg';
            file_put_contents($tempFilePath, $firmaData);

            // Aggiungo allegato
            $attachments['firma.jpg'] = $tempFilePath;
        }      

        // verifica esistenza del file della firma
        if (isset($files["fotoFirma"]["name"]) && !empty($files["fotoFirma"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoFirma"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoFirma"];
            $uploadFirma = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotofirma.jpg'] = $uploadFirma['file'];                   
        }        

        // verifica esistenza del file della fotoPatente
        if (isset($files["fotoPatenteFronte"]["name"]) && !empty($files["fotoPatenteFronte"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoPatenteFronte"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoPatenteFronte"];
            $uploadPatenteFronte = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoPatenteFronte.jpg'] = $uploadPatenteFronte['file'];                   
        }      
        if (isset($files["fotoPatenteRetro"]["name"]) && !empty($files["fotoPatenteRetro"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoPatenteRetro"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoPatenteRetro"];
            $uploadPatenteRetro = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoPatenteRetro.jpg'] = $uploadPatenteRetro['file'];                   
        }    

        // verifica esistenza del file della fotoDocumento
        if (isset($files["fotoDocumentoFronte"]["name"]) && !empty($files["fotoDocumentoFronte"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoDocumentoFronte"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoDocumentoFronte"];
            $uploadDocumentoFronte = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoDocumentoFronte.jpg'] = $uploadDocumentoFronte['file'];                   
        }
        if (isset($files["fotoDocumentoRetro"]["name"]) && !empty($files["fotoDocumentoRetro"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoDocumentoRetro"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoDocumentoRetro"];
            $uploadDocumentoRetro = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoDocumentoRetro.jpg'] = $uploadDocumentoRetro['file'];                   
        }      
        

        // verifica esistenza del file del permesso soggiorno
        if (isset($files["fotoPermessoSoggiornoFronte"]["name"]) && !empty($files["fotoPermessoSoggiornoFronte"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoPermessoSoggiornoFronte"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoPermessoSoggiornoFronte"];
            $uploadPermessoSoggiornoFronte = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoPermessoSoggiornoFronte.jpg'] = $uploadPermessoSoggiornoFronte['file'];                   
        }
        if (isset($files["fotoPermessoSoggiornoRetro"]["name"]) && !empty($files["fotoPermessoSoggiornoRetro"]["name"])) {
            // VALIDAZIONE FORMATO FILE
            $this->validateImageFile($files["fotoPermessoSoggiornoRetro"]);
            
            // acquisizione e configurazione foto
            $foto = $files["fotoPermessoSoggiornoRetro"];
            $uploadPermessoSoggiornoRetro = wp_upload_bits($foto["name"], null, file_get_contents($foto["tmp_name"]));

            // Aggiungo allegato
            $attachments['fotoPermessoSoggiornoRetro.jpg'] = $uploadPermessoSoggiornoRetro['file'];                   
        }

        return $attachments;
    }   


    /**
     * Funzione per inviare email di errore tecnico
     * @param string $dati
     * @return bool
     */
    public function sendTecnicoEmail($dati) {       
        $subject = 'Errore Rinnovo Booking';
        $message = $dati;
        $to = 'tecnico@thinknow.it';
        $resultEmail = wp_mail($to, $subject, $message);
        
        if (is_wp_error($resultEmail)) {
            return false;
        } else {
            return true;
        }
    }
}