<?php
namespace NewsletterBridge\Config;

/**
 * Classe per gestire la configurazione Database
 */
class DatabaseConfig {
    
    /**
     * Ottiene la configurazione Database
     * 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
     */
    public static function getConfig() {
        // Supporto per WordPress Network (Multisite)
        $is_multisite = function_exists('is_multisite') && is_multisite();
        
        return (object) [
            'domain' => self::get_option_safe('db_domain', str_replace(['http://','https://','staging.','www.'], '', get_home_url()), $is_multisite),
            'dsn' => self::get_option_safe('db_dsn', 'mysql:host=10.50.50.100;dbname=newsletterblazemedia;charset=utf8mb4', $is_multisite),
            'user' => self::get_option_safe('db_user', 'f2innovation', $is_multisite),
            'password' => self::get_option_safe('db_pass', 'F21nn0V@t10n', $is_multisite),
            'optin' => self::get_option_safe('db_optin', 'false', $is_multisite) === 'true',
            'options' => [
                \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_EMULATE_PREPARES   => false,
            ]
        ];
    }
    
    /**
     * Helper per gestire le opzioni in ambiente multisite
     * Dopo switch_to_blog(), prova prima get_option() (opzioni del sito corrente)
     * Se non trova nulla, prova get_site_option() (opzioni di rete) come fallback
     */
    private static function get_option_safe($option_name, $default = false, $is_multisite = false) {
        if ($is_multisite) {
            // Usa un valore sentinella che non può essere un valore valido
            $sentinel = [];
            $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 Database
     * In multisite, salva sempre come site options (specifiche per sito)
     * per permettere configurazioni diverse per ogni sito
     */
    public static function saveConfig($data) {
        $fields = ['db_domain', 'db_dsn', 'db_user', 'db_pass', 'db_optin'];
        $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);
    }
}

