package com.saas.shared.email;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import sendinblue.ApiClient;
import sendinblue.ApiException;
import sendinblue.Configuration;
import sendinblue.auth.ApiKeyAuth;
import sibApi.TransactionalEmailsApi;
import sibModel.*;

import jakarta.annotation.PostConstruct;
import java.util.List;
import java.util.Map;

/**
 * Brevo (formerly Sendinblue) Email Service
 * Handles all transactional email sending via Brevo API
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class BrevoEmailService {

    @Value("${brevo.api.key}")
    private String brevoApiKey;

    @Value("${brevo.sender.email:noreply@yourdomain.com}")
    private String defaultSenderEmail;

    @Value("${brevo.sender.name:SaaS VoIP Platform}")
    private String defaultSenderName;

    private TransactionalEmailsApi emailApi;

    @PostConstruct
    public void init() {
        ApiClient defaultClient = Configuration.getDefaultApiClient();
        ApiKeyAuth apiKey = (ApiKeyAuth) defaultClient.getAuthentication("api-key");
        apiKey.setApiKey(brevoApiKey);
        emailApi = new TransactionalEmailsApi();
        log.info("✅ Brevo Email Service initialized successfully");
    }

    /**
     * Send a simple text email
     */
    public boolean sendEmail(String toEmail, String toName, String subject, String textContent) {
        return sendEmail(toEmail, toName, subject, textContent, null, null);
    }

    /**
     * Send email with HTML content
     */
    public boolean sendEmailWithHtml(String toEmail, String toName, String subject, String htmlContent) {
        return sendEmail(toEmail, toName, subject, null, htmlContent, null);
    }

    /**
     * Send templated email with variables
     */
    public boolean sendTemplatedEmail(String toEmail, String toName, String subject, 
                                      String htmlContent, Map<String, Object> templateParams) {
        return sendEmail(toEmail, toName, subject, null, htmlContent, templateParams);
    }

    /**
     * Core email sending method
     */
    private boolean sendEmail(String toEmail, String toName, String subject, 
                              String textContent, String htmlContent, 
                              Map<String, Object> templateParams) {
        try {
            // Create sender
            SendSmtpEmailSender sender = new SendSmtpEmailSender();
            sender.setEmail(defaultSenderEmail);
            sender.setName(defaultSenderName);

            // Create recipient
            SendSmtpEmailTo recipient = new SendSmtpEmailTo();
            recipient.setEmail(toEmail);
            recipient.setName(toName != null ? toName : toEmail);

            // Build email
            SendSmtpEmail email = new SendSmtpEmail();
            email.setSender(sender);
            email.setTo(List.of(recipient));
            email.setSubject(subject);
            
            if (htmlContent != null) {
                email.setHtmlContent(htmlContent);
            }
            if (textContent != null) {
                email.setTextContent(textContent);
            }
            if (templateParams != null) {
                email.setParams(templateParams);
            }

            // Send email
            CreateSmtpEmail result = emailApi.sendTransacEmail(email);
            log.info("✅ Email sent successfully to {} - Message ID: {}", toEmail, result.getMessageId());
            return true;

        } catch (ApiException e) {
            log.error("❌ Failed to send email to {}: {} - {}", toEmail, e.getCode(), e.getResponseBody(), e);
            return false;
        } catch (Exception e) {
            log.error("❌ Unexpected error sending email to {}: {}", toEmail, e.getMessage(), e);
            return false;
        }
    }

    /**
     * Send email to multiple recipients
     */
    public boolean sendBulkEmail(List<String> toEmails, String subject, String htmlContent) {
        try {
            SendSmtpEmailSender sender = new SendSmtpEmailSender();
            sender.setEmail(defaultSenderEmail);
            sender.setName(defaultSenderName);

            List<SendSmtpEmailTo> recipients = toEmails.stream()
                    .map(email -> {
                        SendSmtpEmailTo recipient = new SendSmtpEmailTo();
                        recipient.setEmail(email);
                        return recipient;
                    })
                    .toList();

            SendSmtpEmail email = new SendSmtpEmail();
            email.setSender(sender);
            email.setTo(recipients);
            email.setSubject(subject);
            email.setHtmlContent(htmlContent);

            CreateSmtpEmail result = emailApi.sendTransacEmail(email);
            log.info("✅ Bulk email sent successfully to {} recipients - Message ID: {}", 
                    toEmails.size(), result.getMessageId());
            return true;

        } catch (ApiException e) {
            log.error("❌ Failed to send bulk email: {} - {}", e.getCode(), e.getResponseBody(), e);
            return false;
        } catch (Exception e) {
            log.error("❌ Unexpected error sending bulk email: {}", e.getMessage(), e);
            return false;
        }
    }
}
