import { MailerService } from '@nestjs-modules/mailer';
import { Injectable } from '@nestjs/common';

@Injectable()
export class MailService {
  constructor(private readonly mailerService: MailerService) {}

  async sendVerificationCode(email: string, code: string, companyName?: string): Promise<void> {
    try {
      console.log('Enviando email a:', email, 'con código:', code, companyName ? `empresa: ${companyName}` : '');
      await this.mailerService.sendMail({
        to: email,
        subject: 'Código de verificación',
        template: 'verificacion',
        context: {
          code,
          companyName,
        },
      });
      console.log('Email enviado exitosamente');
    } catch (error) {
      console.error('Error al enviar email:', error);
      throw new Error(
        `Error al enviar email de verificación: ${error instanceof Error ? error.message : 'Error desconocido'}`,
      );
    }
  }

  /**
   * Envía la alerta de documentos de legajo próximos a vencer / vencidos.
   * Usa el template legajo-vencimiento.hbs.
   *
   * @param to             — array de emails destinatarios
   * @param payload.empresaNombre
   * @param payload.empleadoNombre
   * @param payload.documentos — { tipo_nombre, codigo, nombre_original, fecha_vencimiento, dias_para_vencer, es_vencido }[]
   */
  async sendLegajoVencimientoAlert(
    to: string[],
    payload: {
      empresaNombre: string;
      empleadoNombre: string;
      empleadoEmail?: string | null;
      documentos: Array<{
        tipo_nombre: string;
        codigo: string;
        nombre_original: string;
        fecha_vencimiento: string;
        dias_para_vencer: number;
        es_vencido: boolean;
      }>;
    },
  ): Promise<void> {
    if (!to || to.length === 0) return;

    const hayVencidos = payload.documentos.some((d) => d.es_vencido);
    const categoria = hayVencidos
      ? 'VENCIDOS — requieren regularización urgente'
      : 'próximos a vencer — convendría renovarlos pronto';
    const subject = hayVencidos
      ? `[Legajo vencido] ${payload.empleadoNombre} — ${payload.documentos.length} documento(s)`
      : `[Legajo por vencer] ${payload.empleadoNombre} — ${payload.documentos.length} documento(s)`;

    await this.mailerService.sendMail({
      to,
      subject,
      template: 'legajo-vencimiento',
      context: {
        empresaNombre: payload.empresaNombre,
        empleadoNombre: payload.empleadoNombre,
        categoria,
        esEmpleado: payload.empleadoEmail ? to.includes(payload.empleadoEmail) : false,
        documentos: payload.documentos,
      },
    });
  }

  /**
   * Envía un presupuesto/cotización al cliente con el PDF adjunto, enlace al
   * portal público y pixel de tracking de apertura. Usa el template presupuesto.hbs.
   */
  /**
   * Envía al proveedor el reporte de productos vencidos de sus marcas con Excel adjunto.
   */
  async sendProveedorVencidosReport(payload: {
    to: string;
    empresaNombre: string;
    proveedorNombre: string;
    totalLotes: number;
    totalCosto: string;
    excelBuffer: Buffer;
    fileName: string;
  }): Promise<void> {
    await this.mailerService.sendMail({
      to: payload.to,
      subject: `Productos vencidos — ${payload.empresaNombre}`,
      html: `
        <p>Estimado proveedor <strong>${payload.proveedorNombre}</strong>,</p>
        <p>Adjuntamos el listado de productos vencidos de las marcas que nos provee.</p>
        <ul>
          <li><strong>Total de lotes:</strong> ${payload.totalLotes}</li>
          <li><strong>Costo total:</strong> ${payload.totalCosto}</li>
        </ul>
        <p>Quedamos a la espera de su gestión de canje o devolución.</p>
        <p>Atte.<br/>${payload.empresaNombre}</p>
      `,
      attachments: [
        {
          filename: payload.fileName,
          content: payload.excelBuffer,
          contentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        },
      ],
    });
  }

  /** Envía un email de notificación de tienda con body HTML personalizado. */
  async sendStoreEmail(payload: {
    to: string;
    subject: string;
    html: string;
    pdfAttachment?: { filename: string; content: Buffer };
  }): Promise<void> {
    if (!payload.to) return;
    const wrappedHtml = `<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{background:#eef0f3;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;font-size:14px;line-height:1.65;color:#1a1a1a;padding:24px 8px 32px}
table{border-collapse:collapse;width:100%}
td{vertical-align:top}
.wrap{max-width:600px;margin:0 auto;background:#fff;border-radius:14px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.10)}
.body{padding:28px 32px}
.footer{background:#f3f4f6;border-top:1px solid #e5e7eb;padding:16px 32px;text-align:center;font-size:11px;color:#9ca3af;line-height:1.8}
</style>
</head>
<body>
<div class="wrap">
<div class="body">${payload.html}</div>
<div class="footer">Este correo fue enviado automáticamente · Por favor no respondas<br/>© ${new Date().getFullYear()} — Todos los derechos reservados</div>
</div>
</body>
</html>`;
    await this.mailerService.sendMail({
      to: payload.to,
      subject: payload.subject,
      html: wrappedHtml,
      attachments: payload.pdfAttachment
        ? [{ filename: payload.pdfAttachment.filename, content: payload.pdfAttachment.content, contentType: 'application/pdf' }]
        : undefined,
    });
  }

  async sendPresupuestoEmail(payload: {
    to: string[];
    cc?: string[];
    replyTo?: string;
    asunto: string;
    empresaNombre: string;
    clienteNombre: string;
    numero: string;
    version?: number | null;
    titulo: string;
    fechaVigencia: string;
    total: string;
    mensaje?: string | null;
    portalUrl: string;
    pixelUrl: string;
    pdfBuffer: Buffer;
    pdfFilename: string;
  }): Promise<void> {
    await this.mailerService.sendMail({
      to: payload.to,
      cc: payload.cc && payload.cc.length ? payload.cc : undefined,
      replyTo: payload.replyTo || undefined,
      subject: payload.asunto,
      template: 'presupuesto',
      context: {
        empresaNombre: payload.empresaNombre,
        clienteNombre: payload.clienteNombre,
        numero: payload.numero,
        version: payload.version ?? null,
        titulo: payload.titulo,
        fechaVigencia: payload.fechaVigencia,
        total: payload.total,
        mensaje: payload.mensaje ?? null,
        portalUrl: payload.portalUrl,
        pixelUrl: payload.pixelUrl,
      },
      attachments: [
        {
          filename: payload.pdfFilename,
          content: payload.pdfBuffer,
          contentType: 'application/pdf',
        },
      ],
    });
  }
}
