<?php
/**
 * Widget Elementor: Meteo Cerimonie
 *
 * Mostra le previsioni meteo per il giorno delle cerimonie funebri
 *
 * @package AnnunciFunebri
 * @since 4.8.0
 */

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

class ANNFU_Widget_Meteo extends ANNFU_Widget_Base {

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

    public function get_title() {
        return __('Meteo Cerimonie', 'annuncifunebri-onoranza');
    }

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

    protected function ha_dati_widget() {
        $funerale = $this->ottieni_campo('funerale');
        return !empty($funerale['data']) || !empty($funerale['luogo']);
    }

    protected function register_controls() {
        // === TAB CONTENT ===
        $this->start_controls_section(
            'sezione_contenuto',
            [
                'label' => __('Contenuto', 'annuncifunebri-onoranza'),
                'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
            ]
        );

        $this->add_control(
            'titolo',
            [
                'label' => __('Titolo', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::TEXT,
                'default' => 'Previsioni Meteo',
                'placeholder' => 'Previsioni Meteo',
            ]
        );

        $this->add_control(
            'api_key',
            [
                'label' => __('OpenWeatherMap API Key', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::TEXT,
                'description' => __('Ottieni una chiave gratuita da openweathermap.org/api', 'annuncifunebri-onoranza'),
                'placeholder' => 'Inserisci API key',
            ]
        );

        $this->add_control(
            'mostra_temperatura',
            [
                'label' => __('Mostra Temperatura', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::SWITCHER,
                'label_on' => __('Sì', 'annuncifunebri-onoranza'),
                'label_off' => __('No', 'annuncifunebri-onoranza'),
                'return_value' => 'yes',
                'default' => 'yes',
            ]
        );

        $this->add_control(
            'mostra_umidita',
            [
                'label' => __('Mostra Umidità', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::SWITCHER,
                'label_on' => __('Sì', 'annuncifunebri-onoranza'),
                'label_off' => __('No', 'annuncifunebri-onoranza'),
                'return_value' => 'yes',
                'default' => 'yes',
            ]
        );

        $this->add_control(
            'mostra_vento',
            [
                'label' => __('Mostra Vento', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::SWITCHER,
                'label_on' => __('Sì', 'annuncifunebri-onoranza'),
                'label_off' => __('No', 'annuncifunebri-onoranza'),
                'return_value' => 'yes',
                'default' => 'yes',
            ]
        );

        $this->add_control(
            'unita_temperatura',
            [
                'label' => __('Unità Temperatura', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::SELECT,
                'default' => 'metric',
                'options' => [
                    'metric' => __('Celsius (°C)', 'annuncifunebri-onoranza'),
                    'imperial' => __('Fahrenheit (°F)', 'annuncifunebri-onoranza'),
                ],
            ]
        );

        $this->end_controls_section();

        // === TAB STYLE ===
        $this->start_controls_section(
            'sezione_stile',
            [
                'label' => __('Stile', 'annuncifunebri-onoranza'),
                'tab' => \Elementor\Controls_Manager::TAB_STYLE,
            ]
        );

        $this->add_group_control(
            \Elementor\Group_Control_Typography::get_type(),
            [
                'name' => 'tipografia_titolo',
                'label' => __('Tipografia Titolo', 'annuncifunebri-onoranza'),
                'selector' => '{{WRAPPER}} .annfu-meteo-titolo',
            ]
        );

        $this->add_control(
            'colore_titolo',
            [
                'label' => __('Colore Titolo', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::COLOR,
                'selectors' => [
                    '{{WRAPPER}} .annfu-meteo-titolo' => 'color: {{VALUE}};',
                ],
            ]
        );

        $this->add_control(
            'colore_temperatura',
            [
                'label' => __('Colore Temperatura', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::COLOR,
                'selectors' => [
                    '{{WRAPPER}} .annfu-meteo-temperatura' => 'color: {{VALUE}};',
                ],
            ]
        );

        $this->add_control(
            'colore_sfondo',
            [
                'label' => __('Colore Sfondo', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::COLOR,
                'selectors' => [
                    '{{WRAPPER}} .annfu-meteo-wrapper' => 'background-color: {{VALUE}};',
                ],
            ]
        );

        $this->add_group_control(
            \Elementor\Group_Control_Border::get_type(),
            [
                'name' => 'bordo',
                'label' => __('Bordo', 'annuncifunebri-onoranza'),
                'selector' => '{{WRAPPER}} .annfu-meteo-wrapper',
            ]
        );

        $this->add_responsive_control(
            'spaziatura',
            [
                'label' => __('Spaziatura Interna', 'annuncifunebri-onoranza'),
                'type' => \Elementor\Controls_Manager::DIMENSIONS,
                'size_units' => ['px', 'em', '%'],
                'selectors' => [
                    '{{WRAPPER}} .annfu-meteo-wrapper' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
                ],
            ]
        );

        $this->end_controls_section();
    }

    protected function render() {
        $settings = $this->get_settings_for_display();

        if (\Elementor\Plugin::$instance->editor->is_edit_mode() && !$this->ha_dati_widget()) {
            $this->render_placeholder_editor('eicon-cloud-check', __('Meteo Cerimonie', 'annuncifunebri-onoranza'), __('Previsioni meteo per il giorno del funerale', 'annuncifunebri-onoranza'));
            return;
        }

        if (!$this->ha_dati_widget()) {
            return;
        }

        $funerale = $this->ottieni_campo('funerale', []);
        $titolo = $settings['titolo'];
        $api_key = $settings['api_key'];
        $mostra_temperatura = $settings['mostra_temperatura'] === 'yes';
        $mostra_umidita = $settings['mostra_umidita'] === 'yes';
        $mostra_vento = $settings['mostra_vento'] === 'yes';
        $unita = $settings['unita_temperatura'];

        if (empty($api_key)) {
            if (\Elementor\Plugin::$instance->editor->is_edit_mode()) {
                echo '<p>' . esc_html__('Inserisci una API Key di OpenWeatherMap nelle impostazioni del widget', 'annuncifunebri-onoranza') . '</p>';
            }
            return;
        }

        $data_funerale = !empty($funerale['data']) ? $funerale['data'] : '';
        $luogo = !empty($funerale['luogo']) ? $funerale['luogo'] : '';
        $comune = $this->ottieni_campo('comune.nome', '');

        if (empty($luogo) && empty($comune)) {
            return;
        }

        $location = !empty($luogo) ? $luogo : $comune;

        ?>
        <div class="annfu-meteo-wrapper"
             x-data="annfuMeteo('<?php echo esc_attr($api_key); ?>', '<?php echo esc_js($location); ?>', '<?php echo esc_attr($data_funerale); ?>', '<?php echo esc_attr($unita); ?>')">

            <?php if (!empty($titolo)): ?>
                <h3 class="annfu-meteo-titolo"><?php echo esc_html($titolo); ?></h3>
            <?php endif; ?>

            <div x-show="loading" class="annfu-meteo-loading">
                <?php echo esc_html__('Caricamento previsioni...', 'annuncifunebri-onoranza'); ?>
            </div>

            <div x-show="error" class="annfu-meteo-error">
                <span x-text="errorMessage"></span>
            </div>

            <div x-show="!loading && !error && meteoData" class="annfu-meteo-content">
                <div class="annfu-meteo-data">
                    <span class="annfu-meteo-data-label"><?php echo esc_html__('Data cerimonia:', 'annuncifunebri-onoranza'); ?></span>
                    <span x-text="dataFormattata"></span>
                </div>

                <div class="annfu-meteo-icon">
                    <img :src="`https://openweathermap.org/img/wn/${meteoData.weather[0].icon}@2x.png`"
                         :alt="meteoData.weather[0].description">
                </div>

                <div class="annfu-meteo-descrizione">
                    <span x-text="meteoData.weather[0].description"></span>
                </div>

                <?php if ($mostra_temperatura): ?>
                    <div class="annfu-meteo-temperatura">
                        <span class="annfu-meteo-temp-value" x-text="Math.round(meteoData.main.temp)"></span>
                        <span class="annfu-meteo-temp-unit"><?php echo $unita === 'metric' ? '°C' : '°F'; ?></span>
                        <div class="annfu-meteo-temp-minmax">
                            <span><?php echo esc_html__('Min:', 'annuncifunebri-onoranza'); ?> </span>
                            <span x-text="Math.round(meteoData.main.temp_min)"></span><?php echo $unita === 'metric' ? '°C' : '°F'; ?>
                            <span> | <?php echo esc_html__('Max:', 'annuncifunebri-onoranza'); ?> </span>
                            <span x-text="Math.round(meteoData.main.temp_max)"></span><?php echo $unita === 'metric' ? '°C' : '°F'; ?>
                        </div>
                    </div>
                <?php endif; ?>

                <?php if ($mostra_umidita): ?>
                    <div class="annfu-meteo-umidita">
                        <span><?php echo esc_html__('Umidità:', 'annuncifunebri-onoranza'); ?> </span>
                        <span x-text="meteoData.main.humidity"></span>%
                    </div>
                <?php endif; ?>

                <?php if ($mostra_vento): ?>
                    <div class="annfu-meteo-vento">
                        <span><?php echo esc_html__('Vento:', 'annuncifunebri-onoranza'); ?> </span>
                        <span x-text="Math.round(meteoData.wind.speed)"></span>
                        <?php echo $unita === 'metric' ? ' m/s' : ' mph'; ?>
                    </div>
                <?php endif; ?>
            </div>
        </div>

        <script>
        document.addEventListener('alpine:init', () => {
            Alpine.data('annfuMeteo', (apiKey, location, dataFunerale, units) => ({
                loading: true,
                error: false,
                errorMessage: '',
                meteoData: null,
                dataFormattata: '',

                init() {
                    this.fetchMeteo(apiKey, location, dataFunerale, units);
                },

                fetchMeteo(apiKey, location, dataFunerale, units) {
                    if (!apiKey || !location) {
                        this.error = true;
                        this.errorMessage = 'Dati mancanti per il recupero delle previsioni';
                        this.loading = false;
                        return;
                    }

                    // Formatta la data
                    if (dataFunerale) {
                        const date = new Date(dataFunerale);
                        this.dataFormattata = date.toLocaleDateString('it-IT', {
                            weekday: 'long',
                            year: 'numeric',
                            month: 'long',
                            day: 'numeric'
                        });
                    }

                    const url = `https://api.openweathermap.org/data/2.5/weather?q=${encodeURIComponent(location)},IT&appid=${apiKey}&units=${units}&lang=it`;

                    fetch(url)
                        .then(response => {
                            if (!response.ok) {
                                throw new Error('Impossibile recuperare i dati meteo');
                            }
                            return response.json();
                        })
                        .then(data => {
                            this.meteoData = data;
                            this.loading = false;
                        })
                        .catch(err => {
                            this.error = true;
                            this.errorMessage = err.message || 'Errore nel caricamento delle previsioni';
                            this.loading = false;
                        });
                }
            }));
        });
        </script>
        <?php
    }
}
