<?php
/**
 * Widget Elementor: Tabs Annuncio (Nested)
 *
 * Sistema di tab con nested elements che gestisce automaticamente
 * la visibilità in base ai dati dell'annuncio.
 *
 * Richiede: Elementor 3.6+ con Nested Elements attivati
 *
 * @package AnnunciFunebri
 * @since 4.8.0
 */

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

// Verifica che il modulo nested elements esista
if (!class_exists('\Elementor\Modules\NestedTabs\Widgets\NestedTabs')) {
    // Fallback: se non esiste la classe NestedTabs, non registrare il widget
    return;
}

class ANNFU_Widget_Tabs_Annuncio extends \Elementor\Modules\NestedTabs\Widgets\NestedTabs {

    public function get_name() {
        return 'annfu_tabs_annuncio';
    }

    public function get_title() {
        return __('Tabs Annuncio', 'annuncifunebri-onoranza');
    }

    public function get_icon() {
        return 'eicon-tabs';
    }

    public function get_categories() {
        return ['annfu-necrologi'];
    }

    public function get_keywords() {
        return ['tabs', 'cordoglio', 'fiori', 'foto', 'donazioni', 'annuncio', 'nested'];
    }

    /**
     * Ottiene i dati del necrologio corrente
     */
    protected function ottieni_dati_annuncio() {
        if (class_exists('ANNFU_Fornitore_Dati')) {
            return ANNFU_Fornitore_Dati::ottieni_annuncio();
        }
        return null;
    }

    /**
     * Registra i controlli del widget
     */
    protected function register_controls() {
        // Chiama i controlli del parent (NestedTabs)
        parent::register_controls();

        // Aggiungi sezione informativa all'inizio
        $this->start_controls_section(
            'sezione_info_annuncio',
            [
                'label' => __('Info Visibilità Tab', 'annuncifunebri-onoranza'),
                'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
            ]
        );

        $this->add_control(
            'info_visibilita',
            [
                'type' => \Elementor\Controls_Manager::RAW_HTML,
                'raw' => '<div style="background: #e7f3ff; padding: 15px; border-radius: 5px; border-left: 4px solid #0073aa;">
                    <strong style="display: block; margin-bottom: 10px;">Visibilità Automatica dei Tab</strong>
                    <p style="margin: 0; font-size: 12px; line-height: 1.6;">
                        I tab vengono mostrati/nascosti automaticamente in base ai dati dell\'annuncio:<br><br>
                        <strong>Tab Cordogli:</strong> nascosto se <code>nascondiCordogli = true</code><br>
                        <strong>Tab Fiori:</strong> nascosto se <code>abilitatoFiori = false</code><br>
                        <strong>Tab Foto:</strong> nascosto se <code>abilitatoFotoCordogli = false</code><br>
                        <strong>Tab Donazioni:</strong> nascosto se <code>opereBene</code> è vuoto
                    </p>
                </div>',
                'content_classes' => 'elementor-panel-alert',
            ]
        );

        $this->add_control(
            'abilita_visibilita_condizionale',
            [
                'label' => __('Abilita Visibilità Condizionale', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::SWITCHER,
                'label_on' => __('Sì', 'annuncifunebri-onoranza'),
                'label_off' => __('No', 'annuncifunebri-onoranza'),
                'return_value' => 'yes',
                'default' => 'yes',
                'description' => __('Se attivo, i tab vengono mostrati/nascosti in base ai dati dell\'annuncio', 'annuncifunebri-onoranza'),
            ]
        );

        $this->end_controls_section();

        // Sezione per assegnare il tipo di ogni tab
        $this->start_controls_section(
            'sezione_tipi_tab',
            [
                'label' => __('Tipi Tab', 'annuncifunebri-onoranza'),
                'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
            ]
        );

        $this->add_control(
            'info_tipi_tab',
            [
                'type' => \Elementor\Controls_Manager::RAW_HTML,
                'raw' => '<p style="font-size: 12px; color: #666;">Assegna un tipo a ogni tab per controllarne la visibilità automatica. I tab senza tipo assegnato saranno sempre visibili.</p>',
            ]
        );

        // Controlli per ogni tab (fino a 10 tab supportati)
        for ($i = 1; $i <= 10; $i++) {
            $this->add_control(
                'tipo_tab_' . $i,
                [
                    'label'   => esc_html(
                        sprintf(
                        /* translators: %d: Il numero progressivo della scheda (tab) */
                            __( 'Tipo Tab %d', 'annuncifunebri-onoranza' ),
                            $i
                        )
                    ),                    'type'    => \Elementor\Controls_Manager::SELECT,
                    'options' => [
                        ''          => esc_html__( 'Nessuno (sempre visibile)', 'annuncifunebri-onoranza' ),
                        'cordogli'  => esc_html__( 'Cordogli', 'annuncifunebri-onoranza' ),
                        'fiori'     => esc_html__( 'Fiori', 'annuncifunebri-onoranza' ),
                        'foto'      => esc_html__( 'Foto Cordogli', 'annuncifunebri-onoranza' ),
                        'donazioni' => esc_html__( 'Donazioni / Opere di Bene', 'annuncifunebri-onoranza' ),
                    ],
                    'default' => $this->get_default_tipo_tab($i),
                ]
            );
        }
        $this->end_controls_section();
    }

    /**
     * Restituisce il tipo di tab di default in base alla posizione
     */
    private function get_default_tipo_tab($position) {
        $defaults = [
            1 => 'cordogli',
            2 => 'fiori',
            3 => 'foto',
            4 => 'donazioni',
        ];
        return isset($defaults[$position]) ? $defaults[$position] : '';
    }

    /**
     * Verifica se un tab deve essere visibile in base ai dati dell'annuncio
     */
    private function is_tab_visible($tipo_tab, $annuncio) {
        if (empty($tipo_tab)) {
            return true; // Nessun tipo = sempre visibile
        }

        switch ($tipo_tab) {
            case 'cordogli':
                // Nascosto se nascondiCordogli è true
                return empty($annuncio['nascondiCordogli']) || $annuncio['nascondiCordogli'] != 1;

            case 'fiori':
                // Nascosto se abilitatoFiori è false/0
                return !empty($annuncio['abilitatoFiori']) && $annuncio['abilitatoFiori'] == 1;

            case 'foto':
                // Nascosto se abilitatoFotoCordogli è false/0
                return !empty($annuncio['abilitatoFotoCordogli']) && $annuncio['abilitatoFotoCordogli'] == 1;

            case 'donazioni':
                // Nascosto se opereBene è vuoto
                return !empty($annuncio['opereBene']) && is_array($annuncio['opereBene']) && count($annuncio['opereBene']) > 0;

            default:
                return true;
        }
    }

    /**
     * Render del widget
     */
    protected function render() {
        $settings = $this->get_settings_for_display();

        // Se siamo in modalità editor, mostra sempre tutti i tab
        if (\Elementor\Plugin::$instance->editor->is_edit_mode()) {
            parent::render();
            return;
        }

        // Se la visibilità condizionale non è attiva, usa il render standard
        if ($settings['abilita_visibilita_condizionale'] !== 'yes') {
            parent::render();
            return;
        }

        // Ottieni i dati dell'annuncio
        $dati = $this->ottieni_dati_annuncio();

        if (empty($dati)) {
            parent::render();
            return;
        }

        // Prepara i dati dell'annuncio
        if (array_key_exists('metaData', $dati) && array_key_exists('data', $dati)) {
            $annuncio = $dati['data'];
        } else {
            $annuncio = $dati;
        }

        // Ottieni i tab dal repeater
        $tabs = isset($settings['tabs']) ? $settings['tabs'] : [];

        if (empty($tabs)) {
            parent::render();
            return;
        }

        // Filtra i tab in base alla visibilità
        $tabs_visibili = [];
        $tabs_nascosti_indices = [];

        foreach ($tabs as $index => $tab) {
            $tipo_tab = isset($settings['tipo_tab_' . ($index + 1)]) ? $settings['tipo_tab_' . ($index + 1)] : '';

            if ($this->is_tab_visible($tipo_tab, $annuncio)) {
                $tabs_visibili[] = $tab;
            } else {
                $tabs_nascosti_indices[] = $index;
            }
        }

        // Se non ci sono tab visibili, non renderizzare nulla
        if (empty($tabs_visibili)) {
            return;
        }

        // Se tutti i tab sono visibili, usa il render standard
        if (empty($tabs_nascosti_indices)) {
            parent::render();
            return;
        }

        // Render personalizzato con tab filtrati
        $this->render_filtered_tabs($settings, $tabs, $tabs_nascosti_indices);
    }

    /**
     * Render dei tab filtrati (nasconde quelli non visibili via CSS/JS)
     */
    private function render_filtered_tabs($settings, $tabs, $tabs_nascosti_indices) {
        $widget_id = $this->get_id();

        // Genera CSS per nascondere i tab
        echo '<style>';
        foreach ($tabs_nascosti_indices as $index) {
            $tab_number = $index + 1;
            echo "#elementor-element-{$widget_id} .e-n-tabs-heading .e-n-tab-title:nth-child({$tab_number}),"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
            echo "#elementor-element-{$widget_id} .e-n-tabs-content .e-con:nth-child({$tab_number}) { display: none !important; }"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        }
        echo '</style>';

        // Render normale del parent
        parent::render();

        // Se il primo tab è nascosto, attiva il primo visibile
        if (in_array(0, $tabs_nascosti_indices)) {
            $first_visible = 0;
            for ($i = 0; $i < count($tabs); $i++) {
                if (!in_array($i, $tabs_nascosti_indices)) {
                    $first_visible = $i;
                    break;
                }
            }

            if ($first_visible > 0) {
                echo '<script>
                (function() {
                    document.addEventListener("DOMContentLoaded", function() {
                        var widget = document.getElementById("elementor-element-' . esc_js($widget_id) . '");
                        if (!widget) return;

                        var tabs = widget.querySelectorAll(".e-n-tab-title");
                        var contents = widget.querySelectorAll(".e-n-tabs-content > .e-con");

                        // Rimuovi active da tutti
                        tabs.forEach(function(t) { t.classList.remove("e-active"); t.setAttribute("aria-selected", "false"); });
                        contents.forEach(function(c) { c.classList.remove("e-active"); c.style.display = "none"; });

                        // Attiva il primo visibile
                        var visibleIndex = ' . esc_js( $first_visible ) . ';
                        if (tabs[visibleIndex]) {
                            tabs[visibleIndex].classList.add("e-active");
                            tabs[visibleIndex].setAttribute("aria-selected", "true");
                        }
                        if (contents[visibleIndex]) {
                            contents[visibleIndex].classList.add("e-active");
                            contents[visibleIndex].style.display = "";
                        }
                    });
                })();
                </script>';
            }
        }
    }

    /**
     * Verifica se Nested Elements è attivo
     */
    public static function is_nested_elements_active() {
        // Verifica se l'esperimento Nested Elements è attivo
        if (class_exists('\Elementor\Plugin')) {
            $experiments = \Elementor\Plugin::$instance->experiments;
            if ($experiments) {
                return $experiments->is_feature_active('nested-elements');
            }
        }
        return false;
    }

    /**
     * Mostra avviso se Nested Elements non è attivo
     */
    public function render_plain_content() {
        if (!self::is_nested_elements_active()) {
            echo '<div style="background: #fff3cd; border: 1px solid #ffc107; padding: 20px; border-radius: 5px; text-align: center;">';
            echo '<h4 style="margin: 0 0 10px 0; color: #856404;">Nested Elements Richiesti</h4>';
            echo '<p style="margin: 0; color: #856404;">Per utilizzare il widget "Tabs Annuncio" è necessario attivare i Nested Elements.</p>';
            echo '<p style="margin: 10px 0 0 0;"><strong>Come attivare:</strong> Elementor → Impostazioni → Funzionalità → Nested Elements → Attiva</p>';
            echo '</div>';
            return;
        }

        parent::render_plain_content();
    }
}
