<?php

namespace NewsletterBridge\Commands;

use WP_CLI;
use WP_CLI_Command;
use NewsletterBridge\Utils\Log;
use NewsletterBridge\Services\Content\CalendarChecker;
use NewsletterBridge\Services\External\Sender;
use NewsletterBridge\Services\Feed\FeedGenerator;
use NewsletterBridge\Utils\ServiceContainer;
use NewsletterBridge\Config\SiteConfig;

/**
 * Comandi WP-CLI per il plugin Newsletter Bridge
 */
class NewsletterCommand extends WP_CLI_Command {

    /**
     * Invia la newsletter
     *
     * ## EXAMPLES
     *
     *     wp newsletter send
     *     wp newsletter send --force
     *     wp newsletter send --site-id=1
     *     wp newsletter send --force --site-id=2
     *
     * @when before_wp_load
     */
    public function send($args, $assoc_args) {
        // Imposta memoria illimitata
        ini_set('memory_limit', '-1');
        
        // Imposta timezone
        define('TIMEZONE', 'Europe/Rome');
        date_default_timezone_set(TIMEZONE);

        $force = isset($assoc_args['force']) && $assoc_args['force'];
        $site_id = isset($assoc_args['site-id']) ? (int) $assoc_args['site-id'] : null;

        // Se siamo in multisite ma non abbiamo site_id, usa il sito corrente
        if ($site_id === null && function_exists('is_multisite') && is_multisite()) {
            $site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
            WP_CLI::log('Multisite rilevato - Usando Site ID corrente: ' . $site_id);
        }

        WP_CLI::log('Inizializzazione invio newsletter...');

        try {
            $calendar = new CalendarChecker(get_newsletter_config());
            
            if (!$force) {
                $isSendable = $calendar->checkDate();
                
                if ($isSendable !== 'ok') {
                    $error_message = "Non è il momento di inviare la newsletter: " . $isSendable;
                    WP_CLI::error($error_message);
                    Log::error($error_message);
                    self::sendErrorNotification('Calendar Check Failed', $error_message, new \Exception($error_message));
                    return;
                }
            } else {
                WP_CLI::log('Modalità FORCE attivata - invio forzato');
            }

            // Resetta i post utilizzati per iniziare una nuova newsletter
            $container = new ServiceContainer();
            $container->configureDefaultServices();
            $feedGenerator = $container->get('feed_generator');
            $feedGenerator->resetUsedPosts();
            
            WP_CLI::log('Generazione contenuto newsletter...');
            
            try {
                $sender = new Sender(get_newsletter_config(), false, $site_id, $force);
                
                WP_CLI::success('Newsletter inviata con successo!');
                Log::info('Newsletter inviata con successo via WP-CLI');
                
            } catch (\NewsletterBridge\Lib\MailUpException $e) {
                $error_message = 'Errore MailUp durante invio: ' . $e->getStatusCode() . ' - ' . $e->getMessage();
                WP_CLI::error($error_message);
                Log::error($error_message);
                self::sendErrorNotification('MailUp Send Error', $error_message, $e);
                return;
            } catch (\Exception $e) {
                $error_message = 'Errore durante invio newsletter: ' . $e->getMessage();
                WP_CLI::error($error_message);
                Log::error($error_message);
                self::sendErrorNotification('Newsletter Send Error', $error_message, $e);
                return;
            }

        } catch (\NewsletterBridge\Lib\MailUpException $e) {
            $error_message = 'Errore MailUp: ' . $e->getStatusCode() . ' - ' . $e->getMessage();
            WP_CLI::error($error_message);
            Log::error($error_message);
            self::sendErrorNotification('MailUp Error', $error_message, $e);
        } catch (\Exception $e) {
            $error_message = 'Errore generico: ' . $e->getMessage();
            WP_CLI::error($error_message);
            Log::error($error_message);
            self::sendErrorNotification('Generic Error', $error_message, $e);
        }
    }

    /**
     * Mostra lo stato della newsletter
     *
     * ## EXAMPLES
     *
     *     wp newsletter status
     *     wp newsletter status --site-id=1
     *
     * @when before_wp_load
     */
    public function status($args, $assoc_args) {
        $site_id = isset($assoc_args['site-id']) ? (int) $assoc_args['site-id'] : null;
        
        // Se siamo in multisite ma non abbiamo site_id, usa il sito corrente
        if ($site_id === null && function_exists('is_multisite') && is_multisite()) {
            $site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
        }
        try {
            $calendar = new CalendarChecker(get_newsletter_config());
            $isSendable = $calendar->checkDate();
            
            if ($isSendable === 'ok') {
                WP_CLI::success('La newsletter può essere inviata');
            } else {
                WP_CLI::warning("La newsletter non può essere inviata: " . $isSendable);
            }
            
        } catch (\Exception $e) {
            WP_CLI::error('Errore nel controllo stato: ' . $e->getMessage());
        }
    }

    /**
     * Testa la configurazione del plugin
     *
     * ## EXAMPLES
     *
     *     wp newsletter test-config
     *     wp newsletter test-config --site-id=1
     *
     * @when before_wp_load
     */
    public function test_config($args, $assoc_args) {
        $site_id = isset($assoc_args['site-id']) ? (int) $assoc_args['site-id'] : null;
        
        // Se siamo in multisite ma non abbiamo site_id, usa il sito corrente
        if ($site_id === null && function_exists('is_multisite') && is_multisite()) {
            $site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
        }
        WP_CLI::log('Test configurazione Newsletter Bridge...');
        
        try {
            $newsletter_config = get_newsletter_config();
            $mailup_config = get_mailup_config();
            
            WP_CLI::log('✓ Configurazione Newsletter caricata');
            WP_CLI::log('✓ Configurazione MailUp caricata');
            
            // Test connessione MailUp
            if ($mailup_config->list != 0) {
                WP_CLI::log('✓ Lista MailUp configurata: ' . $mailup_config->list);
            } else {
                WP_CLI::warning('⚠ Lista MailUp non configurata');
            }
            
            WP_CLI::success('Configurazione OK');
            
        } catch (\Exception $e) {
            WP_CLI::error('Errore nella configurazione: ' . $e->getMessage());
        }
    }

    /**
     * Testa la connessione MailUp e verifica l'email template
     *
     * ## EXAMPLES
     *
     *     wp newsletter test-mailup
     *     wp newsletter test-mailup --site-id=1
     *
     * @when before_wp_load
     */
    public function test_mailup($args, $assoc_args) {
        $site_id = isset($assoc_args['site-id']) ? (int) $assoc_args['site-id'] : null;
        
        // Se siamo in multisite ma non abbiamo site_id, usa il sito corrente
        if ($site_id === null && function_exists('is_multisite') && is_multisite()) {
            $site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
        }
        WP_CLI::log('Test connessione MailUp...');
        
        try {
            $mailup_config = get_mailup_config();
            
            // Test autenticazione
            $mailup = new \NewsletterBridge\Services\External\Mailup();
            WP_CLI::log('✓ Classe Mailup istanziata');
            
            // Test duplicazione email
            WP_CLI::log('Test duplicazione email template ID: ' . $mailup_config->emailTemplateID);
            $result = $mailup->duplicateEmail($mailup_config->emailTemplateID, 'Test Subject', 'Test Summary');
            
            if ($result) {
                WP_CLI::success('✓ Duplicazione email riuscita');
                WP_CLI::log('ID nuova email: ' . ($result->idMessage ?? 'N/A'));
            } else {
                WP_CLI::error('✗ Duplicazione email fallita');
            }
            
        } catch (\Exception $e) {
            WP_CLI::error('Errore nel test MailUp: ' . $e->getMessage());
        }
    }

    /**
     * Testa la generazione dei feed
     *
     * ## EXAMPLES
     *
     *     wp newsletter test-feeds
     *     wp newsletter test-feeds --site-id=1
     *
     * @when before_wp_load
     */
    public function test_feeds($args, $assoc_args) {
        $site_id = isset($assoc_args['site-id']) ? (int) $assoc_args['site-id'] : null;
        
        // Se siamo in multisite ma non abbiamo site_id, usa il sito corrente
        if ($site_id === null && function_exists('is_multisite') && is_multisite()) {
            $site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
        }
        WP_CLI::log('Test generazione feed...');
        
        try {
            $config = get_newsletter_config();
            
            // Test generazione feed
            WP_CLI::log('Test generazione feed...');
            $container = new \NewsletterBridge\Utils\ServiceContainer();
            $container->configureDefaultServices();
            $feedGenerator = $container->get('feed_generator');
            $feedGenerator->resetUsedPosts();
            
            // Genera i feed e salva i file XML
            $allFeeds = $feedGenerator->generateAllFeeds($config, false, $site_id);
            
            WP_CLI::log('Feed generati:');
            foreach ($allFeeds as $name => $content) {
                $length = strlen($content);
                WP_CLI::log("  - $name: " . $length . " caratteri");
                if ($name === 'subject') {
                    WP_CLI::log("    Contenuto: " . substr($content, 0, 100) . "...");
                }
            }
            
            // Mostra il percorso dei file generati
            $base_path = dirname(ABSPATH) . '/nl-feed/';
            $is_multisite = function_exists('is_multisite') ? is_multisite() : false;
            
            if ($is_multisite) {
                if ($site_id !== null) {
                    $base_path .= 'site-' . $site_id . '/';
                } else {
                    $current_site_id = function_exists('get_current_blog_id') ? get_current_blog_id() : 1;
                    $base_path .= 'site-' . $current_site_id . '/';
                }
            }
            WP_CLI::log('📁 File salvati in: ' . $base_path);
            
            WP_CLI::success('✓ Generazione e salvataggio feed completati');
            
        } catch (\Exception $e) {
            WP_CLI::error('Errore nella generazione feed: ' . $e->getMessage());
        }
    }

    /**
     * Invia notifica email in caso di errore
     *
     * @param string $errorType Tipo di errore
     * @param string $errorMessage Messaggio di errore
     * @param \Exception $exception Eccezione originale
     */
    private static function sendErrorNotification($errorType, $errorMessage, $exception) {
        try {
            $to = 'techteam@blazemedia.it';
            $subject = '[Newsletter Bridge] Errore invio newsletter - ' . $errorType;
            
            $site_name = get_bloginfo('name');
            $site_url = get_site_url();
            $timestamp = current_time('Y-m-d H:i:s');
            
            $message = "
<html>
<head>
    <title>Errore Newsletter Bridge</title>
</head>
<body style='font-family: Arial, sans-serif; line-height: 1.6; color: #333;'>
    <div style='max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px;'>
        <h2 style='color: #d63638; margin-top: 0;'>🚨 Errore Newsletter Bridge</h2>
        
        <div style='background: #f8f9fa; padding: 15px; border-radius: 3px; margin: 15px 0;'>
            <h3 style='margin-top: 0; color: #495057;'>Dettagli Errore</h3>
            <p><strong>Tipo:</strong> {$errorType}</p>
            <p><strong>Messaggio:</strong> {$errorMessage}</p>
            <p><strong>Timestamp:</strong> {$timestamp}</p>
            <p><strong>Sito:</strong> {$site_name} ({$site_url})</p>
        </div>
        
        <div style='background: #fff3cd; padding: 15px; border-radius: 3px; margin: 15px 0; border-left: 4px solid #ffc107;'>
            <h3 style='margin-top: 0; color: #856404;'>Stack Trace</h3>
            <pre style='background: #f8f9fa; padding: 10px; border-radius: 3px; overflow-x: auto; font-size: 12px;'>{$exception->getTraceAsString()}</pre>
        </div>
        
        <div style='background: #d1ecf1; padding: 15px; border-radius: 3px; margin: 15px 0; border-left: 4px solid #17a2b8;'>
            <h3 style='margin-top: 0; color: #0c5460;'>Azioni Consigliate</h3>
            <ul>
                <li>Verificare la configurazione MailUp</li>
                <li>Controllare i log di WordPress</li>
                <li>Testare la connessione con: <code>wp newsletter test-mailup</code></li>
                <li>Verificare la configurazione con: <code>wp newsletter test-config</code></li>
            </ul>
        </div>
        
        <hr style='border: none; border-top: 1px solid #eee; margin: 20px 0;'>
        <p style='font-size: 12px; color: #666; text-align: center;'>
            Email generata automaticamente da Newsletter Bridge Plugin
        </p>
    </div>
</body>
</html>";

            $headers = [
                'Content-Type: text/html; charset=UTF-8',
                'From: Newsletter Bridge <noreply@' . parse_url($site_url, PHP_URL_HOST) . '>',
                'Reply-To: noreply@' . parse_url($site_url, PHP_URL_HOST)
            ];

            $sent = wp_mail($to, $subject, $message, $headers);
            
            if ($sent) {
                WP_CLI::log('📧 Email di notifica errore inviata a techteam@blazemedia.it');
                Log::info('Email di notifica errore inviata a techteam@blazemedia.it');
            } else {
                WP_CLI::warning('⚠️ Impossibile inviare email di notifica errore');
                Log::warning('Impossibile inviare email di notifica errore');
            }
            
        } catch (\Exception $e) {
            WP_CLI::warning('⚠️ Errore nell\'invio email di notifica: ' . $e->getMessage());
            Log::warning('Errore nell\'invio email di notifica: ' . $e->getMessage());
        }
    }
}
