<?php

namespace RinnovoBooking\Core;

use RinnovoBooking\Core\IPatenteService;
use RinnovoBooking\Core\RinnovoBooking;

class RinnovoBookingShortcode {

    private $dataBase = null;
    public function __construct() {
        // Registrazione degli shortcode
        add_shortcode('rinnovo_booking_orario', [$this, 'handle_orario_shortcode']);
        add_shortcode('rinnovo_booking_backend', [$this, 'rinnovo_booking_login']);
        add_shortcode('rinnovo_booking_disponibilita', [$this, 'rinnovo_booking_disponibilita']);
    }

    /**
     * Gestione del shortcode per visualizzare gli orari di apertura e chiusura
     * @param array $atts
     * @return string
     */
    public function handle_orario_shortcode($atts) {
        ob_start();

        extract(
            shortcode_atts(array(
                'sede' => '',
                'gruppo' => '',
            ), $atts, 'handle_orario_shortcode')
        );

        // Se la licenza non è valida, restituisci un messaggio di errore o vuoto
        if (!rinnovo_booking_verify_license()) {
            return '<p>' . 'La licenza del plugin non è valida o è scaduta. Si prega di aggiornare la licenza.' . '</p>';
        }
        
        $servizi = rinnovo_booking_verify_services();
        if (in_array('ipatente', $servizi) || in_array('ipatentebutton', $servizi)) { 
            $iPatenteService = new iPatenteService();
            $iPanteArray = $iPatenteService->getGenerateCalendar($sede, $gruppo);
    
            $disponibilita = $iPanteArray['disponibilita'];
            $occupati = $iPanteArray['occupati'];
            $apertura = $iPanteArray['apertura'];
            $chiusura = $iPanteArray['chiusura'];
        } else {
            // Passa la sede alla funzione per ottenere le disponibilità
            $disponibilita = rinnovo_booking_get_availability($sede);
            $apertura = rinnovo_booking_get_apertura($sede);
        } 
        
        // Ordina l'array $apertura per day_of_week
        if ($apertura) {
            usort($apertura, function($a, $b) {
                return strtotime($a['day_of_week']) - strtotime($b['day_of_week']);
            });
        }

        $atts = shortcode_atts([
            'sede' => $sede,
            'gruppo' => $gruppo,
            'availability' => $disponibilita,
            'apertura' => $apertura,
        ], $atts);


        foreach ($atts['availability'] as $value) {
            echo "<div>{$value['day_of_week']} dalle " . date('H:i', strtotime($value['start_time'])) . " alle " . date('H:i', strtotime($value['end_time']))."</div>";
        }

        if($atts['apertura'] != null) {
            echo "<h4 class='rb-orari-title'>Apertura Speciale</h4>";
            foreach ($atts['apertura'] as $value) {
                echo "<div>".date('d-m-Y', strtotime($value['day_of_week']))." dalle " . date('H:i', strtotime($value['start_time'])) . " alle " . date('H:i', strtotime($value['end_time']))."</div>";
            }   
        }

        return ob_get_clean();
    }

    
    /**
     * Gestione dello shortcode per il backend
     * @return bool|string
     */
    function rinnovo_booking_login() {
        // Debug temporaneo
        error_log('RinnovoBookingShortcode::rinnovo_booking_login - Inizio esecuzione');
        
        if (!rinnovo_booking_verify_license()) {
            error_log('RinnovoBookingShortcode::rinnovo_booking_login - Licenza non valida');
            return '<p>' . 'La licenza del plugin non è valida o è scaduta. Si prega di aggiornare la licenza.' . '</p>';
        } else {
            $servizi = rinnovo_booking_verify_services();
            error_log('RinnovoBookingShortcode::rinnovo_booking_login - Servizi disponibili: ' . print_r($servizi, true));
            
            // Inserisce fotofirma se il servizio è attivo
            if (in_array('backend', $servizi)) {
                try {
                    $rinnovoBooking = new RinnovoBooking();
                    error_log('RinnovoBookingShortcode::rinnovo_booking_login - Classe RinnovoBooking istanziata con successo');
                    return $rinnovoBooking->login();
                } catch (\Exception $e) {
                    error_log('RinnovoBookingShortcode::rinnovo_booking_login - Errore: ' . $e->getMessage());
                    return '<p>Si è verificato un errore durante l\'inizializzazione del backend. Errore: ' . esc_html($e->getMessage()) . '</p>';
                }
            } else {
                error_log('RinnovoBookingShortcode::rinnovo_booking_login - Servizio backend non attivo');
                return '<p>' . 'Servizio non attivo. Si prega di contattare l\'assistenza.' . '</p>';
            }
        }
    }


    /**
     * Gestione del shortcode per la sola visualizzazione della disponibilità
     * @return string
     */
    function rinnovo_booking_disponibilita($atts) {
        ob_start(); // attivazione buffer di scrittura. Consente il posizionamento del plugin nella pagina.

        extract(
            shortcode_atts(array(
                'sede' => '',
                'gruppo' => '',
            ), $atts, 'rinnovo_booking_disponibilita')
        );

        // Se la licenza non è valida, restituisci un messaggio di errore o vuoto
        if (!rinnovo_booking_verify_license()) {
            return '<p>' . 'La licenza del plugin non è valida o è scaduta. Si prega di aggiornare la licenza.' . '</p>';
        }

        // verifica se il servizio ipatente è attivo
        $servizi = rinnovo_booking_verify_services();
        if (in_array('ipatente', $servizi) || in_array('ipatentebutton', $servizi)) { 
            $iPatenteService = new iPatenteService();
            $iPanteArray = $iPatenteService->getGenerateCalendar($sede, $gruppo);

            $disponibilita = $iPanteArray['disponibilita'];
            $occupati = $iPanteArray['occupati'];
            $apertura = $iPanteArray['apertura'];
            $chiusura = $iPanteArray['chiusura'];
        } else {
            // Passa la sede alla funzione per ottenere le disponibilità
            $disponibilita = rinnovo_booking_get_availability($sede);
            $occupati = rinnovo_booking_get_busy();
            $apertura = rinnovo_booking_get_apertura($sede);
            $chiusura = rinnovo_booking_get_chiusura($sede);
        }   


        wp_localize_script('rinnovo_booking-scripts', 'cbpData', array(
            'availability' => $disponibilita, // Modificato
            'busy' => $occupati,
            'sede' => $sede,
            'gruppo' => $gruppo,
            'apertura' => $apertura,
            'chiusura' => $chiusura
        ));

        $miaPagina = plugin_dir_path(__DIR__) . 'html/calendario_view.php';

        $template = file_get_contents($miaPagina);      
        $template = str_replace("__SEDE__", esc_html($sede), $template);
        $template = str_replace("__GRUPPO__", esc_html($gruppo), $template);

        echo $template;
        
        return ob_get_clean();
    }

}
