<?php

namespace NewsletterBridge\Services\External;

use NewsletterBridge\Utils\Service;
use NewsletterBridge\Lib\MailUpClient;
use NewsletterBridge\Lib\MailUpException;
use NewsletterBridge\Config\MailupConfig;
use NewsletterBridge\Utils\Log;

/**
 * Si occupa di interrogare il 
 * querydispatcher 
 * 
 * @method getOffers( string ) ritorna le offerte per la query in ingresso
 * 
 */
class Mailup extends Service {

    private string $subject = '';
    private string $summary = '';

    function __construct() {

        $this->setName("Mailup");
        $this->setCode("mailup");
        $this->setDescription("Gestisce le iscrizioni a MailUp");
        $this->setParams([]);
    }

    public function subscribe($param)
    {
        try {
            $config = MailupConfig::getConfig();
            
            $email   = $param['email'] ?? '';
            
            if (empty($email) || !preg_match('/^([a-z0-9_\.-])+@(([a-z0-9_-])+\.)+[a-z]{2,6}$/Di', $email)) 
                return (["ERROR","Formato email non valido"]);
        
            $ip = $param['ip'] ?? "";
            $inviaDem = $param['inviaDem'] ?? 'true';
            $inviaDem = ($inviaDem == 'true') ? 1 : 0; // NORMALIZE INVIADEV VALUE
            $refer_url = $param['refer_url'] ?? "";
        
            // Determina i gruppi da utilizzare
            $groups = [];
            if ($inviaDem == 1) {
                // Se DEM è attivata, iscrivi su entrambi i gruppi
                $groups[] = $config->group;
                if ($config->groupDem > 0) {
                    $groups[] = $config->groupDem;
                }
            } else {
                // Se DEM non è attivata, usa solo il gruppo principale
                $groups[] = $config->group;
            }

            if ($config->list != 0) {
                // Debug: Log dei valori di configurazione
                error_log("MailUp Config Debug:");
                error_log("clientId: " . ($config->clientId ?: 'EMPTY'));
                error_log("clientSecret: " . ($config->clientSecret ?: 'EMPTY'));
                error_log("user: " . ($config->user ?: 'EMPTY'));
                error_log("password: " . ($config->password ?: 'EMPTY'));
                error_log("list: " . $config->list);
                error_log("callbackUri: " . $config->callbackUri);
                
                // Initializing MailUpClient
                $mailUp = new MailUpClient($config->clientId, $config->clientSecret, $config->callbackUri);
                
                // Debug: Log della chiamata di autenticazione
                error_log("=== MAILUP AUTH DEBUG ===");
                error_log("URL: " . $mailUp->getConsoleEndpoint());
                error_log("Client ID: " . $config->clientId);
                error_log("Client Secret: " . $config->clientSecret);
                error_log("User: " . $config->user);
                error_log("Password: " . ($config->password ? 'SET' : 'EMPTY'));
                error_log("Callback URI: " . $config->callbackUri);
                error_log("========================");
                
                $mailUp->logOnWithPassword($config->user, $config->password);
                $today = date("Y-m-d");

                //check if alredy esist
                $url = $mailUp->getConsoleEndpoint() . "/Console/List/".$config->list."/Recipients/Subscribed?filterby=\"Email=='".$email."'\"";
                $result_json = $mailUp->callMethod($url, "GET", null, "JSON");
                $result = json_decode($result_json);
                
                $userExists = $result->TotalElementsCount > 0;
                $userAlreadyInGroups = false;
                
                if ($userExists && ! str_contains($refer_url, "offerte")) {
                    // L'utente esiste già, controlla se è già nei gruppi corretti
                    foreach ($groups as $group) {
                        if ($group > 0) {
                            try {
                                $groupUrl = $mailUp->getConsoleEndpoint() . "/Console/Group/".$group."/Recipients?filterby=\"Email=='".$email."'\"";
                                $groupResult = $mailUp->callMethod($groupUrl, "GET", null, "JSON");
                                $groupData = json_decode($groupResult);
                                
                                if ($groupData->TotalElementsCount > 0) {
                                    $userAlreadyInGroups = true;
                                    break;
                                }
                            } catch (Exception $e) {
                                error_log("Errore controllo gruppo $group: " . $e->getMessage());
                            }
                        }
                    }
                    
                    // Se l'utente esiste ma non è nei gruppi, continua per aggiungerlo
                    if ($userAlreadyInGroups) {
                        return ["ERROR","La mail risulta già registrata e nei gruppi"];
                    }
                }

            
                // check if unsubscribed 
                $url = $mailUp->getConsoleEndpoint() . "/Console/List/".$config->list."/Recipients/Unsubscribed?filterby=\"Email=='".$email."'\"";
                $result_json = $mailUp->callMethod($url, "GET", null, "JSON");
                $result_unsub = json_decode($result_json);
                
                $param = ($result_unsub->TotalElementsCount > 0 || $config->optin) ? "?ConfirmEmail=true" : "";
                
                $idRecipient = null;
                $successGroups = [];
                
                // Se l'utente esiste già, ottieni il suo ID
                if ($userExists) {
                    try {
                        $recipientUrl = $mailUp->getConsoleEndpoint() . "/Console/List/".$config->list."/Recipients/Subscribed?filterby=\"Email=='".$email."'\"";
                        $recipientResult = $mailUp->callMethod($recipientUrl, "GET", null, "JSON");
                        $recipientData = json_decode($recipientResult);
                        
                        if ($recipientData->TotalElementsCount > 0 && !empty($recipientData->Items)) {
                            $idRecipient = $recipientData->Items[0]->IdRecipient;
                        }
                    } catch (Exception $e) {
                        error_log("Errore recupero ID utente esistente: " . $e->getMessage());
                    }
                }
                
                // Aggiungi l'utente ai gruppi determinati
                foreach ($groups as $group) {
                    if ($group > 0) {
                        try {
                            // Import recipients to group
                            $url = $mailUp->getConsoleEndpoint() . "/Console/Group/".$group."/Recipient".$param;
                            $recipientRequest = "{\"Email\":\"".$email."\"}";
                            $groupResult = $mailUp->callMethod($url, "POST", $recipientRequest, "JSON");
                            $successGroups[] = $group;
                            
                            // Se non avevamo ancora l'ID del recipient, prendilo dal risultato del gruppo
                            if (!$idRecipient) {
                                $idRecipient = $groupResult;
                            }
                        } catch (Exception $e) {
                            error_log("Errore iscrizione gruppo $group: " . $e->getMessage());
                        }
                    }
                }
                
                if ($idRecipient) {
                    // Update personal data fields of a subscriber
                    $url = $mailUp->getConsoleEndpoint() . "/Console/Recipient/Detail";
                    $recipientRequest = "{\"idRecipient\":\"".$idRecipient."\",\"Email\":\"".$email."\",\"Fields\": [{\"Description\": \"dem\",\"Id\": 31,\"Value\":".$inviaDem."},{\"Description\": \"consenso\",\"Id\": 30,\"Value\":1}, {\"Description\": \"data iscrizione\",\"Id\": 28,\"Value\":\"".$today."\"}]}";
                    $importId = $mailUp->callMethod($url, "PUT", $recipientRequest, "JSON");
                }
                
                $groupsInfo = count($successGroups) > 1 ? " (gruppi: " . implode(', ', $successGroups) . ")" : "";
                
                if ($userExists) {
                    return ["SUCCESS","Utente esistente aggiunto ai gruppi" . $groupsInfo];
                } else {
                    return ["SUCCESS","Grazie per esserti iscritto! Ti invieremo a breve una email di benvenuto"];
                }
               
            } else {
                return ["SUCCESS","PARAMETRI NON CORRETTAMENTE CONFIGURATI"];
            }
            } catch (\NewsletterBridge\Lib\MailUpException $ex) {
                $debug_info = " | clientId: " . ($config->clientId ?: 'EMPTY') . " | user: " . ($config->user ?: 'EMPTY') . " | list: " . $config->list;
                return ["ERROR", "MailUp: " . $ex->getStatusCode() . ": " . $ex->getMessage() . $debug_info];
            } catch (Exception $ex) {
                $debug_info = " | clientId: " . ($config->clientId ?: 'EMPTY') . " | user: " . ($config->user ?: 'EMPTY') . " | list: " . $config->list;
                return ["ERROR", "MailUp: Errore generico - " . $ex->getMessage() . $debug_info];
            }
    } // end function subscribe()


    public function subscribeoptin($param)
    {
        return ["SUCCESS","OK"];
    }
    
    public function unsubscribe($param)
    {
        return ["SUCCESS","OK"];
    }

    /**
     * Duplica un'email esistente con nuovo subject e summary
     */
    public function duplicateEmail(int $emailID, string $subject, string $summary) : object|null {
        $config = MailupConfig::getConfig();
        
        // Initializing MailUpClient
        $client = new MailUpClient($config->clientId, $config->clientSecret, $config->callbackUri);
        $client->logOnWithPassword($config->user, $config->password);
        
        $endpoint = $client->getConsoleEndpoint();
        $apiCall = "{$endpoint}/Console/list/{$config->list}/Email/{$emailID}";
        $header = json_encode(["Subject" => $subject, "PreHeader" => $summary]);

        try {
            $response = $client->callMethod($apiCall, 'POST', $header);
            return json_decode($response);
        } catch (MailUpException $ex) {
            $exampleResult = "Error " . $ex->getStatusCode() . ": " . $ex->getMessage();
            error_log("MailUp Exception: " . $exampleResult);
            Log::warning("KO - duplicateEmail" . $exampleResult);
            return null;
        }
    }
    
    /**
     * Invia un'email a un gruppo specifico
     */
    public function sendEmail(int $emailID, int $group) {
        $config = MailupConfig::getConfig();
        
        // Initializing MailUpClient
        $client = new MailUpClient($config->clientId, $config->clientSecret, $config->callbackUri);
        $client->logOnWithPassword($config->user, $config->password);
        
        $endpoint = $client->getConsoleEndpoint();
        $apiCall = "{$endpoint}/Console/List/1/Email/{$emailID}/Send?inGroups={$group}";

        try {
            $response = $client->callMethod($apiCall, "POST");
            return $response;
        } catch (MailUpException $ex) {
            $exampleResult = "Error " . $ex->getStatusCode() . ": " . $ex->getMessage();
            Log::error("KO " . $exampleResult);
            return null;
        }
    }

    /**
     * Invia una nuova newsletter completa
     * Combina duplicateEmail e sendEmail per il processo completo
     */
    public function sendNewEmail(int $site_id = null) {
        // Se è specificato un site_id, cambia contesto PRIMA di leggere le configurazioni
        $switched = false;
        if ($site_id !== null && function_exists('is_multisite') && is_multisite() && function_exists('switch_to_blog')) {
            $current_blog_id = get_current_blog_id();
            if ($current_blog_id != $site_id) {
                switch_to_blog($site_id);
                $switched = true;
            }
        }
        
        try {
            $mailupConfig = MailupConfig::getConfig();
            
            // Duplica l'email template con nuovo subject e summary
            $subject = !empty($this->subject) ? $this->subject : 'Newsletter Autoblog';
            $summary = !empty($this->summary) ? $this->summary : 'Le ultime notizie dal mondo dell\'automotive';
            
            $newEmail = $this->duplicateEmail($mailupConfig->emailTemplateID, $subject, $summary);
            
            if ($newEmail == null) {
                Log::error('Impossibile creare la nuova email dalla matrice');
                return false;
            }
            
            // Invia l'email al gruppo
            $response = $this->sendEmail($newEmail->idMessage, $mailupConfig->group);
            
            if ($response == null) {
                Log::error("Problemi con l'invio dell'email generata");
                return false;
            }
            return true;
        } finally {
            // Ripristina il contesto originale se era stato cambiato
            if ($switched && function_exists('restore_current_blog')) {
                restore_current_blog();
            }
        }
    }
    
    /**
     * Imposta subject e summary per l'invio
     */
    public function setSubjectAndSummary(string $subject, string $summary) {
        $this->subject = $subject;
        $this->summary = $summary;
    }

    /**
     * Ottiene i parametri del servizio
     */
    public function getParams() {
        return $this->params;
    }

}
