import { Injectable, Logger } from '@nestjs/common';
import * as nodemailer from 'nodemailer';

export interface MailMessage {
  to: string;
  subject: string;
  text: string;
  html?: string;
}

/**
 * Thin SMTP wrapper. Configure with SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS,
 * SMTP_FROM (and optionally SMTP_SECURE=true for port 465).
 */
@Injectable()
export class MailService {
  private readonly logger = new Logger(MailService.name);
  private transporter: nodemailer.Transporter | null = null;

  isConfigured(): boolean {
    return !!process.env.SMTP_HOST;
  }

  private getTransporter(): nodemailer.Transporter {
    if (!this.transporter) {
      const port = parseInt(process.env.SMTP_PORT || '587', 10);
      this.transporter = nodemailer.createTransport({
        host: process.env.SMTP_HOST,
        port,
        secure: process.env.SMTP_SECURE
          ? process.env.SMTP_SECURE === 'true'
          : port === 465,
        auth: process.env.SMTP_USER
          ? { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS || '' }
          : undefined,
      });
    }
    return this.transporter;
  }

  async send(message: MailMessage): Promise<boolean> {
    if (!this.isConfigured()) {
      this.logger.warn(
        `SMTP not configured — skipped email "${message.subject}" to ${message.to}`,
      );
      return false;
    }
    await this.getTransporter().sendMail({
      from:
        process.env.SMTP_FROM ||
        'Seedco Online Shop <no-reply@seedcoonlineshop.com>',
      ...message,
    });
    this.logger.log(`Sent email "${message.subject}" to ${message.to}`);
    return true;
  }
}
