import nodemailer, { type Transporter } from 'nodemailer';

export interface BookingPayload {
  treatment: string;
  date: string;
  time: string;
  firstName: string;
  lastName: string;
  email: string;
  phone: string;
  message?: string;
}

let transporter: Transporter | null = null;

const getTransporter = (): Transporter => {
  if (transporter) return transporter;

  transporter = nodemailer.createTransport({
    host: process.env.SMTP_HOST ?? 'smtp.gmail.com',
    port: Number(process.env.SMTP_PORT ?? 587),
    secure: false,
    auth: {
      user: process.env.SMTP_USER,
      pass: process.env.SMTP_PASS,
    },
  });

  return transporter;
};

const escapeHtml = (str: string) =>
  str.replace(/[&<>"']/g, (c) => ({
    '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;',
  }[c] ?? c));

export const BookingService = {
  async verifyConnection(): Promise<boolean> {
    try {
      await getTransporter().verify();
      return true;
    } catch {
      return false;
    }
  },

  async sendConfirmationEmails(booking: BookingPayload) {
    const t = getTransporter();
    const safe = {
      treatment: escapeHtml(booking.treatment),
      date: escapeHtml(booking.date),
      time: escapeHtml(booking.time),
      firstName: escapeHtml(booking.firstName),
      lastName: escapeHtml(booking.lastName),
      email: escapeHtml(booking.email),
      phone: escapeHtml(booking.phone),
      message: booking.message ? escapeHtml(booking.message) : '',
    };

    const clientHtml = `
      <div style="font-family:sans-serif;color:#5D3F23;max-width:500px">
        <h2 style="color:#DBBB65">Votre réservation Holyzen est confirmée</h2>
        <p>Bonjour ${safe.firstName},</p>
        <p>Nous avons bien reçu votre demande de réservation :</p>
        <ul>
          <li><strong>Soin :</strong> ${safe.treatment}</li>
          <li><strong>Date :</strong> ${safe.date} à ${safe.time}</li>
        </ul>
        <p>Nous vous contacterons au ${safe.phone} pour confirmer définitivement le rendez-vous.</p>
        <p style="margin-top:24px">À bientôt,<br/><strong>L'équipe Holyzen</strong></p>
      </div>
    `;

    const adminHtml = `
      <div style="font-family:sans-serif;max-width:500px">
        <h2>Nouvelle demande de réservation</h2>
        <ul>
          <li><strong>Client :</strong> ${safe.firstName} ${safe.lastName}</li>
          <li><strong>Email :</strong> ${safe.email}</li>
          <li><strong>Téléphone :</strong> ${safe.phone}</li>
          <li><strong>Soin :</strong> ${safe.treatment}</li>
          <li><strong>Date :</strong> ${safe.date} à ${safe.time}</li>
          <li><strong>Message :</strong> ${safe.message || '—'}</li>
        </ul>
      </div>
    `;

    await Promise.all([
      t.sendMail({
        from: `"Holyzen" <${process.env.SMTP_USER}>`,
        to: booking.email,
        subject: 'Confirmation de votre réservation - Holyzen',
        html: clientHtml,
      }),
      t.sendMail({
        from: `"Holyzen Site" <${process.env.SMTP_USER}>`,
        to: process.env.SMTP_USER,
        // to: process.env.SMTP_USER ?? 'contact@holyzen.fr',
        subject: `Nouvelle réservation - ${safe.firstName} ${safe.lastName}`,
        html: adminHtml,
      }),
    ]);
  },
};