const nodemailer = require('nodemailer');

/**
 * 邮件发送工具类
 * 支持SMTP和其他邮件服务提供商
 */
class EmailService {
  constructor() {
    this.transporter = null;
    this.init();
  }

  /**
   * 初始化邮件传输器
   */
  init() {
    try {
      // 根据环境变量配置邮件服务
      const emailConfig = {
        host: process.env.SMTP_HOST || 'smtp.qq.com',
        port: parseInt(process.env.SMTP_PORT) || 587,
        secure: process.env.SMTP_SECURE === 'true', // true for 465, false for other ports
        auth: {
          user: process.env.SMTP_USER,
          pass: process.env.SMTP_PASS
        }
      };

      // 如果没有配置SMTP，使用测试账户
      if (!process.env.SMTP_USER) {
        console.warn('⚠️  未配置SMTP邮件服务，将使用测试模式');
        this.transporter = nodemailer.createTransport({
          host: 'smtp.ethereal.email',
          port: 587,
          auth: {
            user: 'ethereal.user@ethereal.email',
            pass: 'ethereal.pass'
          }
        });
      } else {
        this.transporter = nodemailer.createTransport(emailConfig);
      }

      console.log('✅ 邮件服务初始化成功');
    } catch (error) {
      console.error('❌ 邮件服务初始化失败:', error.message);
    }
  }

  /**
   * 发送邮件
   * @param {Object} options - 邮件选项
   * @param {string} options.to - 收件人邮箱
   * @param {string} options.subject - 邮件主题
   * @param {string} options.text - 纯文本内容
   * @param {string} options.html - HTML内容
   * @param {string} options.from - 发件人（可选）
   */
  async sendEmail(options) {
    try {
      if (!this.transporter) {
        throw new Error('邮件服务未初始化');
      }

      const mailOptions = {
        from: options.from || process.env.SMTP_FROM || '"结伴客" <noreply@jiebanke.com>',
        to: options.to,
        subject: options.subject,
        text: options.text,
        html: options.html
      };

      const info = await this.transporter.sendMail(mailOptions);
      
      console.log('📧 邮件发送成功:', {
        messageId: info.messageId,
        to: options.to,
        subject: options.subject
      });

      // 如果是测试环境，输出预览链接
      if (process.env.NODE_ENV === 'development' && !process.env.SMTP_USER) {
        console.log('📧 邮件预览链接:', nodemailer.getTestMessageUrl(info));
      }

      return info;
    } catch (error) {
      console.error('❌ 邮件发送失败:', error.message);
      throw error;
    }
  }

  /**
   * 发送验证码邮件
   * @param {string} to - 收件人邮箱
   * @param {string} code - 验证码
   * @param {number} expiresInMinutes - 过期时间（分钟）
   */
  async sendVerificationCode(to, code, expiresInMinutes = 10) {
    const subject = '结伴客 - 邮箱验证码';
    const html = `
      <div style="max-width: 600px; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif;">
        <div style="text-align: center; margin-bottom: 30px;">
          <h1 style="color: #2c3e50; margin: 0;">结伴客</h1>
          <p style="color: #7f8c8d; margin: 5px 0;">让旅行更有温度</p>
        </div>
        
        <div style="background: #f8f9fa; padding: 30px; border-radius: 8px; text-align: center;">
          <h2 style="color: #2c3e50; margin-bottom: 20px;">邮箱验证</h2>
          <p style="color: #555; margin-bottom: 30px;">您的验证码是：</p>
          <div style="background: #fff; padding: 20px; border-radius: 4px; border: 2px dashed #3498db; display: inline-block;">
            <span style="font-size: 32px; font-weight: bold; color: #3498db; letter-spacing: 5px;">${code}</span>
          </div>
          <p style="color: #7f8c8d; margin-top: 30px; font-size: 14px;">
            验证码将在 ${expiresInMinutes} 分钟后过期，请及时使用。
          </p>
        </div>
        
        <div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; text-align: center;">
          <p style="color: #7f8c8d; font-size: 12px; margin: 0;">
            如果这不是您的操作，请忽略此邮件。<br>
            此邮件由系统自动发送，请勿回复。
          </p>
        </div>
      </div>
    `;

    return this.sendEmail({ to, subject, html });
  }

  /**
   * 发送密码重置邮件
   * @param {string} to - 收件人邮箱
   * @param {string} resetUrl - 重置链接
   * @param {number} expiresInMinutes - 过期时间（分钟）
   */
  async sendPasswordReset(to, resetUrl, expiresInMinutes = 30) {
    const subject = '结伴客 - 密码重置';
    const html = `
      <div style="max-width: 600px; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif;">
        <div style="text-align: center; margin-bottom: 30px;">
          <h1 style="color: #2c3e50; margin: 0;">结伴客</h1>
          <p style="color: #7f8c8d; margin: 5px 0;">让旅行更有温度</p>
        </div>
        
        <div style="background: #f8f9fa; padding: 30px; border-radius: 8px;">
          <h2 style="color: #2c3e50; margin-bottom: 20px;">密码重置</h2>
          <p style="color: #555; margin-bottom: 20px;">
            您请求重置密码，请点击下面的按钮重置您的密码：
          </p>
          <div style="text-align: center; margin: 30px 0;">
            <a href="${resetUrl}" 
               style="background: #3498db; color: white; padding: 12px 30px; text-decoration: none; border-radius: 4px; display: inline-block; font-weight: bold;">
              重置密码
            </a>
          </div>
          <p style="color: #7f8c8d; font-size: 14px; margin-bottom: 10px;">
            如果按钮无法点击，请复制以下链接到浏览器地址栏：
          </p>
          <p style="background: #fff; padding: 10px; border-radius: 4px; word-break: break-all; font-size: 12px; color: #555;">
            ${resetUrl}
          </p>
          <p style="color: #e74c3c; font-size: 14px; margin-top: 20px;">
            此链接将在 ${expiresInMinutes} 分钟后过期。
          </p>
        </div>
        
        <div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; text-align: center;">
          <p style="color: #7f8c8d; font-size: 12px; margin: 0;">
            如果这不是您的操作，请忽略此邮件。您的密码不会被更改。<br>
            此邮件由系统自动发送，请勿回复。
          </p>
        </div>
      </div>
    `;

    return this.sendEmail({ to, subject, html });
  }

  /**
   * 发送欢迎邮件
   * @param {string} to - 收件人邮箱
   * @param {string} username - 用户名
   */
  async sendWelcomeEmail(to, username) {
    const subject = '欢迎加入结伴客！';
    const html = `
      <div style="max-width: 600px; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif;">
        <div style="text-align: center; margin-bottom: 30px;">
          <h1 style="color: #2c3e50; margin: 0;">结伴客</h1>
          <p style="color: #7f8c8d; margin: 5px 0;">让旅行更有温度</p>
        </div>
        
        <div style="background: #f8f9fa; padding: 30px; border-radius: 8px;">
          <h2 style="color: #2c3e50; margin-bottom: 20px;">欢迎加入结伴客！</h2>
          <p style="color: #555; margin-bottom: 20px;">
            亲爱的 ${username}，欢迎您加入结伴客大家庭！
          </p>
          <p style="color: #555; margin-bottom: 20px;">
            在这里，您可以：
          </p>
          <ul style="color: #555; margin-bottom: 20px; padding-left: 20px;">
            <li>发起或参加精彩的旅行活动</li>
            <li>认领可爱的小动物，体验农场生活</li>
            <li>结识志同道合的旅行伙伴</li>
            <li>享受专业的商家服务</li>
          </ul>
          <div style="text-align: center; margin: 30px 0;">
            <a href="${process.env.FRONTEND_URL || 'https://jiebanke.com'}" 
               style="background: #27ae60; color: white; padding: 12px 30px; text-decoration: none; border-radius: 4px; display: inline-block; font-weight: bold;">
              开始探索
            </a>
          </div>
        </div>
        
        <div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; text-align: center;">
          <p style="color: #7f8c8d; font-size: 12px; margin: 0;">
            感谢您选择结伴客，祝您使用愉快！<br>
            此邮件由系统自动发送，请勿回复。
          </p>
        </div>
      </div>
    `;

    return this.sendEmail({ to, subject, html });
  }
}

// 创建邮件服务实例
const emailService = new EmailService();

// 导出便捷方法
const sendEmail = (options) => emailService.sendEmail(options);
const sendVerificationCode = (to, code, expiresInMinutes) => 
  emailService.sendVerificationCode(to, code, expiresInMinutes);
const sendPasswordReset = (to, resetUrl, expiresInMinutes) => 
  emailService.sendPasswordReset(to, resetUrl, expiresInMinutes);
const sendWelcomeEmail = (to, username) => 
  emailService.sendWelcomeEmail(to, username);

module.exports = {
  EmailService,
  emailService,
  sendEmail,
  sendVerificationCode,
  sendPasswordReset,
  sendWelcomeEmail
};