const EmailClient = require("../core/EmailClient");
const TemplateManager = require("../core/TemplateManager");
const logger = require("../../../utils/logger");

/**
 * MessagingEmailService handles all messaging-related email notifications
 * This service is responsible for:
 * - Sending new message notifications to users
 */
class MessagingEmailService {
  constructor() {
    this.emailClient = new EmailClient();
    this.templateManager = new TemplateManager();
    this.initialized = false;
  }

  /**
   * Initialize the messaging email service
   * @returns {Promise<void>}
   */
  async initialize() {
    if (this.initialized) return;

    await Promise.all([
      this.emailClient.initialize(),
      this.templateManager.initialize(),
    ]);

    this.initialized = true;
    logger.info("Messaging Email Service initialized successfully");
  }

  /**
   * Send new message notification email
   * @param {Object} receiver - User object of the message receiver
   * @param {string} receiver.firstName - Receiver's first name
   * @param {string} receiver.email - Receiver's email address
   * @param {Object} sender - User object of the message sender
   * @param {string} sender.id - Sender's user ID
   * @param {string} sender.firstName - Sender's first name
   * @param {string} sender.lastName - Sender's last name
   * @param {Object} message - Message object
   * @param {string} message.content - Message content
   * @param {Date} message.createdAt - Message creation timestamp
   * @returns {Promise<{success: boolean, messageId?: string, error?: string}>}
   */
  async sendNewMessageNotification(receiver, sender, message) {
    if (!this.initialized) {
      await this.initialize();
    }

    try {
      const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000";
      const conversationUrl = `${frontendUrl}/messages/conversations/${sender.id}`;

      const timestamp = new Date(message.createdAt).toLocaleString("en-US", {
        dateStyle: "medium",
        timeStyle: "short",
      });

      const variables = {
        recipientName: receiver.firstName || "there",
        senderName: `${sender.firstName} ${sender.lastName}`.trim() || "A user",
        messageContent: message.content,
        conversationUrl: conversationUrl,
        timestamp: timestamp,
      };

      const htmlContent = await this.templateManager.renderTemplate(
        "newMessageToUser",
        variables
      );

      const subject = `New message from ${sender.firstName} ${sender.lastName}`;

      const result = await this.emailClient.sendEmail(
        receiver.email,
        subject,
        htmlContent
      );

      if (result.success) {
        logger.info(
          `Message notification email sent to ${receiver.email} from ${sender.firstName} ${sender.lastName}`
        );
      }

      return result;
    } catch (error) {
      logger.error("Failed to send message notification email:", error);
      return { success: false, error: error.message };
    }
  }
}

module.exports = MessagingEmailService;
