import { Injectable } from '@nestjs/common';

@Injectable()
export class EmailService {
  private enabled() {
    return process.env.ENABLE_EMAIL === 'true';
  }

  private provider() {
    if (process.env.RESEND_API_KEY) return 'resend';
    if (process.env.SENDGRID_API_KEY) return 'sendgrid';
    if (process.env.SMTP_HOST) return 'smtp';

    return 'log';
  }

  private from() {
    return (
      process.env.MAIL_FROM ||
      'noreply@rc.clientspaymenetgetway.com'
    );
  }

  private async send(
    subject: string,
    payload: any,
  ) {
    const provider = this.provider();

    if (!this.enabled()) {
      console.log('[EMAIL DISABLED]', {
        provider,
        subject,
        payload,
      });

      return {
        success: true,
        provider,
        simulated: true,
      };
    }

    console.log('[EMAIL]', {
      provider,
      from: this.from(),
      subject,
      payload,
    });

    return {
      success: true,
      provider,
    };
  }

  async sendInvoiceEmail(data: any) {
    const lang = data.lang || 'fr';

    const subject =
      lang === 'fr'
        ? `Facture ${data.invoiceNumber || ''}`
        : `Invoice ${data.invoiceNumber || ''}`;

    return this.send(subject, data);
  }

  async sendReceiptEmail(data: any) {
    const lang = data.lang || 'fr';

    const subject =
      lang === 'fr'
        ? `Reçu ${data.receiptNumber || data.invoiceNumber || ''}`
        : `Receipt ${data.receiptNumber || data.invoiceNumber || ''}`;

    return this.send(subject, data);
  }

  async sendDepositEmail(data: any) {
    const lang = data.lang || 'fr';

    const subject =
      lang === 'fr'
        ? `Reçu caution ${data.receiptNumber || data.invoiceNumber || ''}`
        : `Deposit receipt ${data.receiptNumber || data.invoiceNumber || ''}`;

    return this.send(subject, data);
  }

  async sendCreditNoteEmail(data: any) {
    const lang = data.lang || 'fr';

    const subject =
      lang === 'fr'
        ? `Avoir ${data.creditNoteNumber || data.invoiceNumber || ''}`
        : `Credit note ${data.creditNoteNumber || data.invoiceNumber || ''}`;

    return this.send(subject, data);
  }

  async sendPaymentLinkEmail(data: any) {
    const lang = data.lang || 'fr';

    const subject =
      lang === 'fr'
        ? 'Lien de paiement'
        : 'Payment link';

    return this.send(subject, data);
  }
}