<?php
namespace NewsletterBridge\Config;

/**
 * Classe per gestire la configurazione MailUp
 */
class MailupConfig {
    
    /**
     * Ottiene la configurazione MailUp
     * In multisite, dopo switch_to_blog(), legge le opzioni del sito corrente
     * Se non trova opzioni per il sito, prova a leggere le network options come fallback
     * 
     * @param int|null $site_id ID del sito per cui leggere le configurazioni (solo multisite)
     */
    public static function getConfig($site_id = null) {
        // Supporto per WordPress Network (Multisite)
        $is_multisite = function_exists('is_multisite') && is_multisite();
        
        return (object) [
            'clientId' => self::get_option_safe('MAILUP_CLIENT_ID', '', $is_multisite, $site_id),
            'clientSecret' => self::get_option_safe('MAILUP_CLIENT_SECRET', '', $is_multisite, $site_id),
            'callbackUri' => self::get_option_safe('MAILUP_CALLBACK_URI', 'http://127.0.0.1/index.php', $is_multisite, $site_id),
            'user' => self::get_option_safe('MAILUP_CLIENT_USER', '', $is_multisite, $site_id),
            'password' => self::get_option_safe('MAILUP_CLIENT_PASS', '', $is_multisite, $site_id),
            'emailTemplateID' => (int)self::get_option_safe('MAILUP_ID_MESSAGE', 0, $is_multisite, $site_id),
            'group' => (int)self::get_option_safe('MAILUP_CLIENT_GROUP', 0, $is_multisite, $site_id),
            'list' => (int)self::get_option_safe('MAILUP_CLIENT_LIST', 0, $is_multisite, $site_id),
            'groupDem' => (int)self::get_option_safe('MAILUP_CLIENT_GROUP_DEM', 0, $is_multisite, $site_id),
            'optin' => self::get_option_safe('MAILUP_OPTIN', 'false', $is_multisite, $site_id) === 'true'
        ];
    }
    
    /**
     * Helper per gestire le opzioni in ambiente multisite
     * Se viene passato un site_id, usa get_blog_option() per leggere direttamente le opzioni di quel sito
     * Altrimenti, prova prima get_option() (opzioni del sito corrente)
     * Se non trova nulla, prova get_site_option() (opzioni di rete) come fallback
     * 
     * @param string $option_name Nome dell'opzione
     * @param mixed $default Valore di default
     * @param bool $is_multisite Se siamo in multisite
     * @param int|null $site_id ID del sito per cui leggere l'opzione (solo multisite)
     */
    private static function get_option_safe($option_name, $default = false, $is_multisite = false, $site_id = null) {
        if ($is_multisite) {
            $sentinel = [];
            
            // Se è specificato un site_id, leggi direttamente le opzioni di quel sito
            if ($site_id !== null && function_exists('get_blog_option')) {
                $site_value = get_blog_option($site_id, $option_name, $sentinel);
                if ($site_value !== $sentinel) {
                    return $site_value;
                }
                
                // Se non trova nulla per il sito specificato, prova le network options
                if (function_exists('get_site_option')) {
                    $network_value = get_site_option($option_name, $sentinel);
                    if ($network_value !== $sentinel) {
                        return $network_value;
                    }
                }
                
                return $default;
            }
            
            // Altrimenti, usa il comportamento standard (sito corrente)
            $site_value = get_option($option_name, $sentinel);
            
            // Se esiste un valore per il sito corrente (diverso dal sentinella), usalo
            if ($site_value !== $sentinel) {
                return $site_value;
            }
            
            // Altrimenti, prova a leggere le network options come fallback
            if (function_exists('get_site_option')) {
                $network_value = get_site_option($option_name, $sentinel);
                if ($network_value !== $sentinel) {
                    return $network_value;
                }
            }
            
            // Se non trova nulla, restituisce il default
            return $default;
        }
        
        // Non multisite: usa semplicemente get_option
        return get_option($option_name, $default);
    }
    
    /**
     * Salva la configurazione MailUp
     * In multisite, salva sempre come site options (specifiche per sito)
     * per permettere configurazioni diverse per ogni sito
     */
    public static function saveConfig($data) {
        $fields = [
            'MAILUP_CLIENT_ID', 'MAILUP_CLIENT_SECRET', 'MAILUP_CLIENT_USER', 'MAILUP_CLIENT_PASS',
            'MAILUP_CLIENT_LIST', 'MAILUP_CLIENT_GROUP', 'MAILUP_CLIENT_GROUP_DEM',
            'MAILUP_ID_MESSAGE', 'MAILUP_CALLBACK_URI', 'MAILUP_OPTIN'
        ];
        
        // In multisite, salva sempre come site options (non network options)
        // per permettere configurazioni diverse per ogni sito
        // Solo se esplicitamente salvato dal network admin, usa network options
        $is_multisite = function_exists('is_multisite') && is_multisite();
        $is_network_admin = function_exists('is_network_admin') && is_network_admin();
        $is_network = $is_multisite && $is_network_admin;
        
        // Se siamo in multisite ma NON nel network admin, forza il salvataggio come site options
        // Questo permette a ogni sito di avere le sue configurazioni
        if ($is_multisite && !$is_network_admin) {
            $is_network = false;
        }
        
        foreach ($fields as $field) {
            if (isset($data[$field])) {
                self::update_option_safe($field, sanitize_text_field($data[$field]), $is_network);
            }
        }
    }
    
    /**
     * Helper per salvare le opzioni in ambiente multisite
     */
    private static function update_option_safe($option_name, $value, $is_network = false) {
        if ($is_network && function_exists('update_site_option')) {
            return update_site_option($option_name, $value);
        }
        return update_option($option_name, $value);
    }
}

