<?php
/**
 * Classe Principale Integrazione Elementor
 *
 * Coordina l'integrazione tra il plugin AnnunciFunebri ed Elementor.
 * Registra i widget, le categorie, il Custom Post Type e gestisce gli hook necessari.
 *
 * @package AnnunciFunebri
 * @since 4.7.6
 */

if (!defined('ABSPATH')) exit;

class ANNFU_Elementor
{

    /**
     * Istanza singleton
     * @var ANNFU_Elementor|null
     */
    private static $istanza = null;

    /**
     * Percorso base della directory Elementor
     * @var string
     */
    private $percorso_base;

    /**
     * URL base della directory Elementor
     * @var string
     */
    private $url_base;

    /**
     * Ottiene l'istanza singleton
     *
     * @return ANNFU_Elementor
     */
    public static function istanza()
    {
        if (is_null(self::$istanza)) {
            self::$istanza = new self();
        }
        return self::$istanza;
    }

    /**
     * Costruttore privato (singleton)
     */
    private function __construct()
    {
        $this->percorso_base = ANNFU_PLUGIN_PATH . 'includes/elementor/';
        $this->url_base = ANNFU_PLUGIN_URL . 'includes/elementor/';

        $this->inizializza_hooks();
    }

    /**
     * Inizializza gli hook WordPress ed Elementor
     *
     * @return void
     */
    private function inizializza_hooks()
    {
        // Disabilita wptexturize per evitare problemi con virgolette nei widget
        add_filter('run_wptexturize', '__return_false');

        // Hook WordPress
        add_action('init', array($this, 'registra_cpt'));
        add_action('add_meta_boxes', array($this, 'aggiungi_meta_boxes'));
        add_action('save_post', array($this, 'salva_meta_boxes'));

        // Hook Elementor - La categoria DEVE essere registrata prima dei widget
        add_action('elementor/elements/categories_registered', array($this, 'aggiungi_categorie_widget'), 1);

        // Hook Elementor - compatibile con versioni diverse
        // Elementor 3.5+ usa 'elementor/widgets/register'
        // Versioni precedenti usavano 'elementor/widgets/widgets_registered'
        add_action('elementor/widgets/register', array($this, 'registra_widgets'), 10);
        add_action('elementor/widgets/widgets_registered', array($this, 'registra_widgets_legacy'), 10);

        // Stili ed Editor
        add_action('elementor/editor/after_enqueue_styles', array($this, 'stili_editor'));
        add_action('elementor/frontend/after_enqueue_styles', array($this, 'stili_frontend'));
        add_action('elementor/editor/after_enqueue_scripts', array($this, 'script_editor'));
        add_action('elementor/frontend/after_register_scripts', array($this, 'registra_script_frontend'));

        // Colonne personalizzate lista template
        add_filter('manage_annfu_el_template_posts_columns', array($this, 'colonne_lista_template'));
        add_action('manage_annfu_el_template_posts_custom_column', array($this, 'render_colonne_lista_template'), 10, 2);
    }

    /**
     * Registra il Custom Post Type per i template
     *
     * @return void
     */
    public function registra_cpt()
    {
        ANNFU_Gestore_Template::registra_cpt_template();
    }

    /**
     * Aggiunge le meta box
     *
     * @return void
     */
    public function aggiungi_meta_boxes()
    {
        ANNFU_Gestore_Template::aggiungi_meta_box();
    }

    /**
     * Salva i dati delle meta box
     *
     * @param int $post_id ID del post
     * @return void
     */
    public function salva_meta_boxes($post_id)
    {
        ANNFU_Gestore_Template::salva_meta_box($post_id);
    }

    /**
     * Registra i widget Elementor (Elementor 3.5+)
     *
     * @param object $gestore_widgets Gestore widget Elementor
     * @return void
     */
    public function registra_widgets($gestore_widgets)
    {
        // Carica il widget base
        if (!class_exists('ANNFU_Widget_Base')) {
            require_once $this->percorso_base . 'widgets/class-annfu-widget-base.php';
        }

        // Scansiona e registra automaticamente tutti i widget
        $this->registra_widgets_automaticamente($gestore_widgets, 'register');
    }

    /**
     * Registra i widget Elementor (Elementor < 3.5 - Legacy)
     *
     * @return void
     */
    public function registra_widgets_legacy()
    {
        // Carica il widget base
        if (!class_exists('ANNFU_Widget_Base')) {
            require_once $this->percorso_base . 'widgets/class-annfu-widget-base.php';
        }

        // Per versioni legacy, usa register_widget_type
        $widgets_manager = \Elementor\Plugin::instance()->widgets_manager;

        // Scansiona e registra automaticamente tutti i widget
        $this->registra_widgets_automaticamente($widgets_manager, 'register_widget_type');
    }

    /**
     * Scansiona e registra automaticamente tutti i widget
     *
     * @param object $gestore Gestore widget Elementor
     * @param string $metodo Metodo da usare ('register' o 'register_widget_type')
     * @return void
     */
    private function registra_widgets_automaticamente($gestore, $metodo)
    {
        $percorso_widgets = $this->percorso_base . 'widgets/';

        // Cartelle da scansionare
        $cartelle = array('persona', 'testi', 'cerimonie', 'media', 'interazioni', 'extra', 'lista');

        foreach ($cartelle as $cartella) {
            $percorso_cartella = $percorso_widgets . $cartella . '/';

            // Verifica se la cartella esiste
            if (!is_dir($percorso_cartella)) {
                continue;
            }

            // Scansiona tutti i file class-widget-*.php nella cartella
            $files = glob($percorso_cartella . 'class-widget-*.php');

            if (empty($files)) {
                continue;
            }

            // Carica e registra ogni widget trovato
            foreach ($files as $file) {
                require_once $file;

                // Estrae il nome della classe dal nome del file
                // Es: class-widget-nome.php -> ANNFU_Widget_Nome
                $nome_file = basename($file, '.php');
                $nome_classe = $this->converti_nome_file_in_classe($nome_file);

                // Verifica se la classe esiste e registra il widget
                if (class_exists($nome_classe)) {
                    $gestore->$metodo(new $nome_classe());
                }
            }
        }
    }

    /**
     * Converte il nome del file in nome della classe
     *
     * @param string $nome_file Nome del file (es: class-widget-nome)
     * @return string Nome della classe (es: ANNFU_Widget_Nome)
     */
    private function converti_nome_file_in_classe($nome_file)
    {
        // Rimuove il prefisso 'class-widget-'
        $nome = str_replace('class-widget-', '', $nome_file);

        // Converte i trattini in underscore e capitalizza
        $parti = explode('-', $nome);
        $parti = array_map('ucfirst', $parti);

        return 'ANNFU_Widget_' . implode('_', $parti);
    }

    /**
     * Aggiunge la categoria widget personalizzata
     *
     * @param object $gestore_elementi Gestore elementi Elementor
     * @return void
     */
    public function aggiungi_categorie_widget($gestore_elementi)
    {
        $gestore_elementi->add_category(
            'annfu-necrologi',
            array(
                'title' => __('Annunci Funebri', 'annuncifunebri-onoranza'),
                'icon' => 'fa fa-heart',
            )
        );
    }

    /**
     * Carica gli stili per l'editor Elementor
     *
     * @return void
     */
    public function stili_editor()
    {
        $percorso_css = ANNFU_PLUGIN_URL . 'assets/elementor/css/editor.css';

        if (file_exists(ANNFU_PLUGIN_PATH . 'assets/elementor/css/editor.css')) {
            wp_enqueue_style(
                'annfu-elementor-editor',
                $percorso_css,
                array(),
                ANNFU_VERSION
            );
        }
    }

    /**
     * Carica gli stili per il frontend
     *
     * @return void
     */
    public function stili_frontend()
    {
        $percorso_css = ANNFU_PLUGIN_URL . 'assets/elementor/css/widgets.css';

        if (file_exists(ANNFU_PLUGIN_PATH . 'assets/elementor/css/widgets.css')) {
            wp_enqueue_style(
                'annfu-elementor-widgets',
                $percorso_css,
                array(),
                ANNFU_VERSION
            );
        }
    }

    /**
     * Carica gli script per l'editor Elementor
     *
     * @return void
     */
    public function script_editor()
    {
        $percorso_js = ANNFU_PLUGIN_URL . 'assets/elementor/js/editor.js';

        if (file_exists(ANNFU_PLUGIN_PATH . 'assets/elementor/js/editor.js')) {
            wp_enqueue_script(
                'annfu-elementor-editor',
                $percorso_js,
                array('jquery', 'elementor-editor'),
                ANNFU_VERSION,
                true
            );
        }
    }

    /**
     * Registra gli script per il frontend
     *
     * @return void
     */
    public function registra_script_frontend()
    {
        // Script lightbox per widget collage
        wp_register_script(
            'annfu-collage-lightbox',
            ANNFU_PLUGIN_URL . 'js/annuncifunebri-collage-lightbox.js',
            array(),
            ANNFU_VERSION,
            true
        );
    }

    /**
     * Aggiunge colonne personalizzate alla lista template
     *
     * @param array $colonne Colonne esistenti
     * @return array Colonne modificate
     */
    public function colonne_lista_template($colonne)
    {
        return ANNFU_Gestore_Template::aggiungi_colonne_lista($colonne);
    }

    /**
     * Render delle colonne personalizzate
     *
     * @param string $colonna Nome della colonna
     * @param int $post_id ID del post
     * @return void
     */
    public function render_colonne_lista_template($colonna, $post_id)
    {
        ANNFU_Gestore_Template::render_colonne_lista($colonna, $post_id);
    }

    /**
     * Verifica se Elementor è attivo e disponibile
     *
     * @return bool
     */
    public static function elementor_attivo()
    {
        return did_action('elementor/loaded') && class_exists('\Elementor\Plugin');
    }

    /**
     * Ottiene la versione di Elementor installata
     *
     * @return string|null
     */
    public static function versione_elementor()
    {
        if (defined('ELEMENTOR_VERSION')) {
            return ELEMENTOR_VERSION;
        }
        return null;
    }
}
