<?php
/**
 * Fornitore Dati per Widget Elementor
 *
 * Centralizza l'accesso ai dati del necrologio per tutti i widget Elementor.
 * Fornisce metodi helper per accedere ai campi del necrologio tramite notazione dot.
 *
 * @package AnnunciFunebri
 * @since 4.7.6
 */

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

class ANNFU_Fornitore_Dati {

    /**
     * Dati del necrologio corrente
     * @var array|null
     */
    private static $annuncio_corrente = null;

    /**
     * Testi default cached
     * @var array|null
     */
    private static $testi_default = null;

    /**
     * Imposta i dati del necrologio corrente
     *
     * @param array $dati_annuncio Dati del necrologio dall'API
     * @return void
     */
    public static function imposta_annuncio($dati_annuncio) {
        self::$annuncio_corrente = $dati_annuncio;
    }

    /**
     * Ottiene tutti i dati del necrologio corrente
     *
     * @return array|null Dati del necrologio o null se non impostati
     */
    public static function ottieni_annuncio() {
        return self::$annuncio_corrente;
    }

    /**
     * Ottiene un campo specifico del necrologio
     *
     * Supporta la notazione dot per accedere a campi annidati:
     * - 'nome' -> $annuncio['nome']
     * - 'onoranzaFunebre.ragioneSociale' -> $annuncio['onoranzaFunebre']['ragioneSociale']
     *
     * @param string $percorso Percorso del campo (supporta notazione dot)
     * @param mixed $default Valore di default se il campo non esiste
     * @return mixed Valore del campo o default
     */
    public static function ottieni_campo($percorso, $default = '') {
        if (!self::$annuncio_corrente) {
            return $default;
        }

        $chiavi = explode('.', $percorso);
        $valore = self::$annuncio_corrente;

        foreach ($chiavi as $chiave) {
            if (is_array($valore) && isset($valore[$chiave])) {
                $valore = $valore[$chiave];
            } else {
                return $default;
            }
        }

        return $valore;
    }

    /**
     * Verifica se un campo esiste e non è vuoto
     *
     * @param string $percorso Percorso del campo
     * @return bool True se il campo esiste e non è vuoto
     */
    public static function ha_campo($percorso) {
        $valore = self::ottieni_campo($percorso, null);
        return $valore !== null && $valore !== '';
    }

    /**
     * Verifica se il necrologio ha una foto
     *
     * @return bool
     */
    public static function ha_foto() {
        return !empty(self::ottieni_campo('foto'));
    }

    /**
     * Verifica se il necrologio ha dati del funerale
     *
     * @return bool
     */
    public static function ha_funerale() {
        return !empty(self::ottieni_campo('dataFunerale'));
    }

    /**
     * Verifica se il necrologio ha dati del rosario
     *
     * @return bool
     */
    public static function ha_rosario() {
        return !empty(self::ottieni_campo('dataRosario'));
    }

    /**
     * Verifica se il necrologio ha streaming attivo
     *
     * @return bool
     */
    public static function ha_streaming() {
        $streaming = self::ottieni_campo('streaming', []);
        return is_array($streaming) && count($streaming) > 0;
    }

    /**
     * Verifica se lo streaming è in corso
     *
     * @return bool
     */
    public static function streaming_in_corso() {
        return self::ottieni_campo('streaming.in_corso', false) === true;
    }

    /**
     * Verifica se il necrologio ha un'epigrafe
     *
     * @return bool
     */
    public static function ha_epigrafe() {
        $epigrafe = self::ottieni_campo('fileEpigrafe');
        $mostra_epigrafe = self::ottieni_campo('onoranzaFunebre.showEpigrafe', false);
        return !empty($epigrafe) && filter_var($epigrafe, FILTER_VALIDATE_URL) && $mostra_epigrafe;
    }

    /**
     * Ottiene la lista dei cordogli approvati
     *
     * @return array Array di cordogli
     */
    public static function ottieni_cordogli() {
        return self::ottieni_campo('cordogli', []);
    }

    /**
     * Ottiene la lista delle partecipazioni
     *
     * @return array Array di partecipazioni
     */
    public static function ottieni_partecipazioni() {
        return self::ottieni_campo('partecipazioni', []);
    }

    /**
     * Ottiene la lista dei fiori disponibili
     *
     * @return array Array di composizioni floreali
     */
    public static function ottieni_fiori() {
        return self::ottieni_campo('fiori', []);
    }

    /**
     * Ottiene la lista delle opere di bene
     *
     * @return array Array di enti benefici
     */
    public static function ottieni_opere_bene() {
        return self::ottieni_campo('opereBene', []);
    }

    /**
     * Verifica se i cordogli sono abilitati e visibili
     *
     * @return bool
     */
    public static function cordogli_visibili() {
        $nascondi = self::ottieni_campo('nascondiCordogli', false);
        return !$nascondi;
    }

    /**
     * Verifica se il tipo di annuncio corrisponde
     *
     * @param string $tipo Tipo annuncio: 'morte', 'ringraziamento', 'anniversario', 'trigesimo'
     * @return bool
     */
    public static function e_tipo_annuncio($tipo) {
        $tipo_corrente = self::ottieni_campo('tipoAnnuncio', 'morte');
        return strtolower($tipo_corrente) === strtolower($tipo);
    }

    /**
     * Ottiene l'ID dell'onoranza funebre
     *
     * @return int|null
     */
    public static function ottieni_id_onoranza() {
        return self::ottieni_campo('onoranzaFunebre.id');
    }

    /**
     * Imposta i testi default (cache)
     *
     * @param array $testi Array di testi default
     * @return void
     */
    public static function imposta_testi_default($testi) {
        self::$testi_default = $testi;
    }

    /**
     * Ottiene i testi default
     *
     * @return array|null
     */
    public static function ottieni_testi_default() {
        return self::$testi_default;
    }

    /**
     * Reset dei dati (utile per test o cambio annuncio)
     *
     * @return void
     */
    public static function reset() {
        self::$annuncio_corrente = null;
        self::$testi_default = null;
    }
}
