<?php

namespace NewsletterBridge\Commands;

use WP_CLI;
use WP_CLI_Command;
use NewsletterBridge\Utils\Log;
use NewsletterBridge\Utils\ErrorNotification;
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);
                    ErrorNotification::send('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);
                ErrorNotification::send('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);
                ErrorNotification::send('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);
            ErrorNotification::send('MailUp Error', $error_message, $e);
        } catch (\Exception $e) {
            $error_message = 'Errore generico: ' . $e->getMessage();
            WP_CLI::error($error_message);
            Log::error($error_message);
            ErrorNotification::send('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());
        }
    }

}
