<?php

namespace Blazemedia\DriveKIntegrator\Render;

class DriveKListinoWidget
{
    private $atts;

    /**
     * Costruttore che inizializza il widget e aggiunge il filtro al content
     *
     * @param array $atts
     */
    public function __construct($atts = [])
    {
        $this->atts = $atts;
        
        // Aggiungi il widget solo se siamo nel contesto giusto
        add_action('wp_head', [$this, 'checkAndAddWidget']);
    }

    /**
     * Controlla se siamo nel contesto giusto e aggiunge il widget
     */
    public function checkAndAddWidget()
    {
        $queried_object = get_queried_object();
        
        // Verifica che siamo su una pagina di term con parent
        if ($queried_object instanceof \WP_Term && $queried_object->parent) {
            // Per le pagine di taxonomy, aggiungiamo il widget tramite un hook diverso
            add_action('wp_footer', [$this, 'displayWidget']);
            // Oppure se vogliamo aggiungerlo al content dei post in quella taxonomy
            add_filter('the_content', [$this, 'appendToContent']);
        }
    }

    /**
     * Mostra il widget direttamente (per test)
     */
    public function displayWidget()
    {
        echo $this->render();
    }

    /**
     * Restituisce il markup fornito per lo shortcode, usando gli attributi se presenti.
     *
     * @param array $atts
     * @return string
     */
    public function render($atts = [])
    {
        // Inizializza le variabili con valori di default
        $makeUrlCode = '';
        $selectedModelId = '';
        $domain = preg_replace('/^.*?\.(.*?\..*?)$/', '$1', \home_url());
        $modalTemplate = "blazemedia_" . $domain;

        $queried_object = get_queried_object();

        // Verifica che siamo su una pagina di term e che sia del tipo giusto
        if ($queried_object instanceof \WP_Term) {
            $parent_term = get_term($queried_object->parent);
            if ($parent_term && !is_wp_error($parent_term)) {
                $makeUrlCode = $parent_term->slug;
                $selectedModelId = strtolower($queried_object->name);
            }
        }


        $makeUrlCode     = str_replace(' ', '-', $makeUrlCode);
        $selectedModelId = str_replace(' ', '-', $selectedModelId);


        // Costruisci l'endpoint per i modelli
        $models_endpoint = "https://publisher.drivek.com/wp-json/dkwp/v2/car/{$makeUrlCode}/models";
        
        // Crea una chiave univoca per il transient
        $transient_key = 'drivek_model_' . $makeUrlCode . '_' . $selectedModelId;
        
        // Controlla se esiste già il transient
        $model_exists = get_transient($transient_key);
        
        if ($model_exists === false) {
            // Il transient non esiste, facciamo la chiamata API
            $response = wp_remote_get($models_endpoint);
            
            if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
                $response_data = json_decode(wp_remote_retrieve_body($response), true);
                
                // Verifica che la risposta contenga la proprietà 'models'
                if (isset($response_data['models']) && is_array($response_data['models'])) {
                    $models = $response_data['models'];
                    
                    // Cerca il modello nella risposta
                    $model_exists = false;
                    foreach ($models as $model) {
                        if (strtolower($model['id']) === $selectedModelId) {
                            $model_exists = true;
                            break;
                        }
                    }
                } else {
                    $model_exists = false;
                }
                
                // Salva il risultato nel transient per 12 ore
                set_transient($transient_key, $model_exists ? '1' : '0', 24 * HOUR_IN_SECONDS);
            }
        }
        
        // Se il modello non esiste, resetta selectedModelId
        if ($model_exists === '0') {
            $selectedModelId = '';
        }


        //$debug = '<div class="drivek-listino-widget">
        //    <p>Make: ' .  $makeUrlCode . '</p>
        //    <p>Model: ' . $selectedModelId . '</p>
        //    <p>Model exists: ' . $model_exists . '</p>
        //</div>';


        // Se non abbiamo i dati necessari, non mostrare il widget
        if (!empty($makeUrlCode) && !empty($selectedModelId)) {
            
            return WidgetMarkup::getMarkup($makeUrlCode, $selectedModelId, $modalTemplate);
        }
        
        return '';
    }

    /**
     * Callback per il filtro che appende il widget al content
     *
     * @param string $content
     * @return string
     */
    public function appendToContent($content)
    {
        $widget = $this->render();

        return $content . $widget;
    }

}
