<?php
/**
 * Widget Base Astratto
 *
 * Classe base astratta per tutti i widget Elementor di AnnunciFunebri.
 * Fornisce funzionalità comuni come accesso ai dati, controlli di visibilità,
 * e metodi helper condivisi.
 *
 * @package AnnunciFunebri
 * @since 4.7.6
 */

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

use Elementor\Widget_Base;
use Elementor\Controls_Manager;
use Elementor\Group_Control_Typography;
use Elementor\Group_Control_Border;
use Elementor\Group_Control_Box_Shadow;
use Elementor\Group_Control_Background;

abstract class ANNFU_Widget_Base extends Widget_Base {

    /**
     * Ottiene la categoria del widget
     *
     * @return array
     */
    public function get_categories() {
        return array('annfu-necrologi');
    }

    /**
     * Ottiene i dati del necrologio corrente
     *
     * @return array|null
     */
    protected function ottieni_dati_annuncio() {
        return ANNFU_Fornitore_Dati::ottieni_annuncio();
    }

    /**
     * Ottiene un campo specifico del necrologio
     *
     * @param string $percorso Percorso del campo (supporta notazione dot)
     * @param mixed $default Valore di default
     * @return mixed
     */
    protected function ottieni_campo($percorso, $default = '') {
        return ANNFU_Fornitore_Dati::ottieni_campo($percorso, $default);
    }

    /**
     * Verifica se siamo in modalità editing Elementor
     *
     * @return bool
     */
    protected function e_modalita_editor() {
        return \Elementor\Plugin::$instance->editor->is_edit_mode();
    }

    /**
     * Render del placeholder per l'editor quando i dati non sono disponibili
     *
     * @param string $icona_classe Classe icona Font Awesome
     * @param string $titolo Titolo del widget
     * @param string $descrizione Descrizione opzionale
     * @return void
     */
    protected function render_placeholder_editor($icona_classe, $titolo, $descrizione = '') {
        ?>
        <div class="annfu-editor-placeholder">
            <div class="annfu-placeholder-icon">
                <i class="<?php echo esc_attr($icona_classe); ?>"></i>
            </div>
            <div class="annfu-placeholder-title">
                <?php echo esc_html($titolo); ?>
            </div>
            <?php if ($descrizione): ?>
                <div class="annfu-placeholder-desc">
                    <?php echo esc_html($descrizione); ?>
                </div>
            <?php endif; ?>
        </div>
        <style>
        .annfu-editor-placeholder {
            text-align: center;
            padding: 40px 20px;
            background: #f9f9f9;
            border: 2px dashed #ddd;
            border-radius: 5px;
        }
        .annfu-placeholder-icon i {
            font-size: 48px;
            color: #999;
            margin-bottom: 15px;
        }
        .annfu-placeholder-title {
            font-size: 16px;
            font-weight: 600;
            color: #333;
            margin-bottom: 8px;
        }
        .annfu-placeholder-desc {
            font-size: 13px;
            color: #666;
        }
        </style>
        <?php
    }

    /**
     * Aggiunge controlli comuni per la visibilità condizionale
     *
     * @return void
     */
    protected function aggiungi_controlli_visibilita() {
        $this->start_controls_section(
            'sezione_visibilita',
            array(
                'label' => __('Visibilità', 'annuncifunebri-onoranza'),
                'tab' => Controls_Manager::TAB_ADVANCED,
            )
        );

        $this->add_control(
            'condizione_visibilita',
            array(
                'label' => __('Mostra widget', 'annuncifunebri-onoranza'),
                'type' => Controls_Manager::SELECT,
                'options' => array(
                    'sempre' => __('Sempre', 'annuncifunebri-onoranza'),
                    'solo_se_dati' => __('Solo se ha dati', 'annuncifunebri-onoranza'),
                    'solo_se_foto' => __('Solo se ha foto', 'annuncifunebri-onoranza'),
                    'solo_se_funerale' => __('Solo se ha funerale', 'annuncifunebri-onoranza'),
                    'solo_se_streaming' => __('Solo se ha streaming', 'annuncifunebri-onoranza'),
                    'solo_tipo_morte' => __('Solo se tipo annuncio: Morte', 'annuncifunebri-onoranza'),
                    'solo_tipo_ringraziamento' => __('Solo se tipo annuncio: Ringraziamento', 'annuncifunebri-onoranza'),
                    'solo_tipo_anniversario' => __('Solo se tipo annuncio: Anniversario', 'annuncifunebri-onoranza'),
                ),
                'default' => 'sempre',
            )
        );

        $this->end_controls_section();
    }

    /**
     * Verifica se il widget deve essere visibile in base alle condizioni
     *
     * @param array $impostazioni Impostazioni del widget
     * @return bool True se il widget deve essere visibile
     */
    protected function verifica_visibilita($impostazioni) {
        $condizione = isset($impostazioni['condizione_visibilita']) ? $impostazioni['condizione_visibilita'] : 'sempre';

        switch ($condizione) {
            case 'sempre':
                return true;

            case 'solo_se_dati':
                return $this->ha_dati_widget();

            case 'solo_se_foto':
                return ANNFU_Fornitore_Dati::ha_foto();

            case 'solo_se_funerale':
                return ANNFU_Fornitore_Dati::ha_funerale();

            case 'solo_se_streaming':
                return ANNFU_Fornitore_Dati::ha_streaming();

            case 'solo_tipo_morte':
                return ANNFU_Fornitore_Dati::e_tipo_annuncio('morte');

            case 'solo_tipo_ringraziamento':
                return ANNFU_Fornitore_Dati::e_tipo_annuncio('ringraziamento');

            case 'solo_tipo_anniversario':
                return ANNFU_Fornitore_Dati::e_tipo_annuncio('anniversario');

            default:
                return true;
        }
    }

    /**
     * Aggiunge controlli comuni di tipografia
     *
     * @param string $nome_controllo Nome del controllo
     * @param string $etichetta Etichetta
     * @param string $selettore Selettore CSS
     * @return void
     */
    protected function aggiungi_controllo_tipografia($nome_controllo, $etichetta, $selettore) {
        $this->add_group_control(
            Group_Control_Typography::get_type(),
            array(
                'name' => $nome_controllo,
                'label' => $etichetta,
                'selector' => $selettore,
            )
        );
    }

    /**
     * Aggiunge controllo colore
     *
     * @param string $nome_controllo Nome del controllo
     * @param string $etichetta Etichetta
     * @param string $selettore Selettore CSS
     * @param string $proprieta Proprietà CSS (default: color)
     * @return void
     */
    protected function aggiungi_controllo_colore($nome_controllo, $etichetta, $selettore, $proprieta = 'color') {
        $this->add_control(
            $nome_controllo,
            array(
                'label' => $etichetta,
                'type' => Controls_Manager::COLOR,
                'selectors' => array(
                    $selettore => $proprieta . ': {{VALUE}};',
                ),
            )
        );
    }

    /**
     * Aggiunge controlli comuni di spaziatura (padding/margin)
     *
     * @param string $tipo 'padding' o 'margin'
     * @param string $selettore Selettore CSS
     * @return void
     */
    protected function aggiungi_controlli_spaziatura($tipo = 'padding', $selettore = '{{WRAPPER}}') {
        // Genera un nome univoco basato sul selettore per evitare conflitti
        $suffisso = preg_replace('/[^a-z0-9_]/', '_', strtolower($selettore));
        $suffisso = preg_replace('/_+/', '_', $suffisso); // Rimuove underscore multipli
        $suffisso = trim($suffisso, '_'); // Rimuove underscore iniziali/finali
        $nome_controllo = $tipo . '_' . $suffisso;
        $etichetta = $tipo === 'padding' ? __('Padding', 'annuncifunebri-onoranza') : __('Margine', 'annuncifunebri-onoranza');

        $this->add_responsive_control(
            $nome_controllo,
            array(
                'label' => $etichetta,
                'type' => Controls_Manager::DIMENSIONS,
                'size_units' => array('px', 'em', '%'),
                'selectors' => array(
                    $selettore => $tipo . ': {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                ),
            )
        );
    }

    /**
     * Aggiunge controlli comuni per bordi
     *
     * @param string $selettore Selettore CSS
     * @return void
     */
    protected function aggiungi_controlli_bordo($selettore = '{{WRAPPER}}') {
        $this->add_group_control(
            Group_Control_Border::get_type(),
            array(
                'name' => 'bordo_widget',
                'selector' => $selettore,
            )
        );

        $this->add_responsive_control(
            'raggio_bordo',
            array(
                'label' => __('Raggio Bordo', 'annuncifunebri-onoranza'),
                'type' => Controls_Manager::DIMENSIONS,
                'size_units' => array('px', '%'),
                'selectors' => array(
                    $selettore => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                ),
            )
        );
    }

    /**
     * Aggiunge controlli comuni per ombre
     *
     * @param string $selettore Selettore CSS
     * @return void
     */
    protected function aggiungi_controlli_ombra($selettore = '{{WRAPPER}}') {
        $this->add_group_control(
            Group_Control_Box_Shadow::get_type(),
            array(
                'name' => 'ombra_widget',
                'selector' => $selettore,
            )
        );
    }

    /**
     * Aggiunge controlli comuni per allineamento testo
     *
     * @param string $selettore Selettore CSS
     * @return void
     */
    protected function aggiungi_controllo_allineamento($selettore = '{{WRAPPER}}') {
        $this->add_responsive_control(
            'allineamento_testo',
            array(
                'label' => __('Allineamento', 'annuncifunebri-onoranza'),
                'type' => Controls_Manager::CHOOSE,
                'options' => array(
                    'left' => array(
                        'title' => __('Sinistra', 'annuncifunebri-onoranza'),
                        'icon' => 'eicon-text-align-left',
                    ),
                    'center' => array(
                        'title' => __('Centro', 'annuncifunebri-onoranza'),
                        'icon' => 'eicon-text-align-center',
                    ),
                    'right' => array(
                        'title' => __('Destra', 'annuncifunebri-onoranza'),
                        'icon' => 'eicon-text-align-right',
                    ),
                    'justify' => array(
                        'title' => __('Giustificato', 'annuncifunebri-onoranza'),
                        'icon' => 'eicon-text-align-justify',
                    ),
                ),
                'default' => 'left',
                'selectors' => array(
                    $selettore => 'text-align: {{VALUE}};',
                ),
            )
        );
    }

    /**
     * Sanitizza l'HTML del contenuto
     *
     * @param string $contenuto Contenuto da sanitizzare
     * @return string Contenuto sanitizzato
     */
    protected function sanitizza_html($contenuto) {
        return wp_kses_post($contenuto ?? '');
    }

    /**
     * Metodo astratto - Verifica se il widget ha dati da mostrare
     * Deve essere implementato dalle classi figlie
     *
     * @return bool
     */
    abstract protected function ha_dati_widget();

    /**
     * Ottiene le impostazioni del widget per il display
     *
     * @return array
     */
    protected function ottieni_impostazioni() {
        return $this->get_settings_for_display();
    }
}
