<?php

namespace NewsletterBridge\Services\Newsletter;

use NewsletterBridge\Config\NewsletterConfig;
use NewsletterBridge\Config\SiteConfig;
use NewsletterBridge\Utils\Log;
use NewsletterBridge\Services\External\Mailup;

/**
 * Responsabilità: Invio newsletter
 * Single Responsibility: Solo invio newsletter
 */
class NewsletterSendingService {
    
    private Mailup $mailup;
    
    public function __construct(Mailup $mailup) {
        $this->mailup = $mailup;
    }
    
    /**
     * Invia la newsletter
     */
    public function sendNewsletter(bool $dryrun = false, string $subject = '', string $summary = '', int $site_id = null): bool {
        try {
            if ($dryrun) {
                Log::info('Modalità dryrun: newsletter non inviata');
                return true;
            }
            
            // Gestione multisite: assicurati di usare la configurazione del sito corrente
            $this->ensureCorrectSiteContext($site_id);
            
            // Imposta subject e summary
            if ($subject || $summary) {
                $this->mailup->setSubjectAndSummary($subject, $summary);
            }
            
            // Invia via MailUp (passa site_id per il contesto multisite)
            $result = $this->mailup->sendNewEmail($site_id);
            
            if (!$result) {
                Log::error('sendNewEmail ha restituito false');
                return false;
            }
            
            // Aggiorna la data dell'ultimo invio per il sito corrente
            SiteConfig::updateLastNewsletterDate();
            
            Log::info('Newsletter inviata con successo per il sito: ' . get_home_url());
            return true;
            
        } catch (\Exception $e) {
            $error_msg = 'Errore nell\'invio newsletter: ' . $e->getMessage();
            error_log($error_msg);
            Log::error($error_msg);
            return false;
        }
    }
    
    /**
     * Assicura che il contesto del sito sia corretto per multisite
     */
    private function ensureCorrectSiteContext(int $site_id = null): void {
        if (function_exists('is_multisite') && is_multisite()) {
            $current_blog_id = get_current_blog_id();
            
            // Se viene passato un site_id specifico, cambia il contesto
            if ($site_id !== null && function_exists('switch_to_blog')) {
                if ($current_blog_id != $site_id) {
                    switch_to_blog($site_id);
                    $current_blog_id = get_current_blog_id();
                    if (defined('WP_CLI') && WP_CLI) {
                        \WP_CLI::log('Cambiato contesto a Site ID: ' . $site_id);
                    }
                }
            } else if (defined('WP_CLI') && WP_CLI) {
                // In WP-CLI, verifichiamo se siamo nel contesto di rete
                if (is_network_admin()) {
                    // Se siamo nel contesto di rete, passiamo al sito principale
                    $main_site_id = get_main_site_id();
                    if ($main_site_id && $main_site_id !== $current_blog_id) {
                        switch_to_blog($main_site_id);
                        $current_blog_id = get_current_blog_id();
                    }
                }
            }
            
        }
    }
}
