import { senderConfig } from './emailConfig';

interface BookingDetails {
  date: string;
  time: string;
  pickup: string;
  dropoff: string;
  passengers: number;
  customerName?: string;
  customerPhone?: string;
}


// Функция для отправки произвольного электронного письма
export const sendEmail = async (to: string, subject: string, html: string, text?: string) => {
  try {
    console.log('Начало отправки письма на адрес:', to);
    console.log('Тема письма:', subject);
    console.log('Длина HTML содержимого:', html.length);

    const mailOptions = {
      from: `"${senderConfig.name}" <${senderConfig.email}>`,
      to,
      subject,
      html,
      ...(text && { text }),
    };

    console.log('Параметры письма подготовлены:', {
      from: mailOptions.from,
      to: mailOptions.to,
      subject: mailOptions.subject,
      hasText: !!mailOptions.text
    });

    console.log('Создание транспорта для отправки письма');
    const nodemailerModule = await import('nodemailer');
    const smtpConfig = {
      host: process.env.MAIL_HOST || process.env.SMTP_HOST || 'localhost',
      port: parseInt(process.env.MAIL_PORT || process.env.SMTP_PORT || '1025'),
      secure: process.env.SMTP_SECURE === 'true',
      auth: process.env.MAIL_USER ? {
        user: process.env.MAIL_USER,
        pass: process.env.MAIL_PASS,
      } : process.env.SMTP_USER ? {
        user: process.env.SMTP_USER,
        pass: process.env.SMTP_PASSWORD,
      } : undefined,
    };

    const createTransport = nodemailerModule.default?.createTransport || nodemailerModule.createTransport;
    const transporter = createTransport(smtpConfig);
    console.log('Транспорт получен, отправка письма');

    const info = await transporter.sendMail(mailOptions);
    console.log('Письмо отправлено: ' + info.response);
    return info;
  } catch (error) {
    console.error('Ошибка при отправке письма:', error);
    console.error('Тип ошибки:', typeof error);
    console.error('Сообщение об ошибке:', error instanceof Error ? error.message : String(error));
    console.error('Стек вызовов:', error instanceof Error ? error.stack : 'N/A');
    throw error;
  }
};

// Функция для отправки письма с подтверждением бронирования
export const sendBookingConfirmation = async (to: string, bookingDetails: BookingDetails) => {
  const subject = 'Подтверждение бронирования - Berlin Minivan Transfers';

  const html = `
    <h2>Ваше бронирование подтверждено!</h2>
    <p>Здравствуйте,</p>
    <p>Ваш заказ на трансфер был успешно оформлен.</p>
    <ul>
      <li><strong>Дата:</strong> ${bookingDetails.date}</li>
      <li><strong>Время:</strong> ${bookingDetails.time}</li>
      <li><strong>Место подачи:</strong> ${bookingDetails.pickup}</li>
      <li><strong>Место назначения:</strong> ${bookingDetails.dropoff}</li>
      <li><strong>Количество пассажиров:</strong> ${bookingDetails.passengers}</li>
    </ul>
    <p>Наши водители свяжутся с вами за 24 часа до поездки для подтверждения деталей.</p>
    <p>Спасибо за использование наших услуг!</p>
  `;

  return sendEmail(to, subject, html);
};

// Функция для отправки письма с уведомлением администратору о новом заказе
export const sendAdminNotification = async (bookingDetails: BookingDetails) => {
  const adminEmail = process.env.ADMIN_EMAIL || process.env.SENDER_EMAIL;
  if (!adminEmail) {
    throw new Error('Не указан email администратора');
  }

  const subject = 'Новый заказ - Berlin Minivan Transfers';

  const html = `
    <h2>Новый заказ</h2>
    <p>Поступил новый заказ на трансфер.</p>
    <ul>
      <li><strong>Имя клиента:</strong> ${bookingDetails.customerName || 'Не указано'}</li>
      <li><strong>Телефон:</strong> ${bookingDetails.customerPhone || 'Не указано'}</li>
      <li><strong>Дата:</strong> ${bookingDetails.date}</li>
      <li><strong>Время:</strong> ${bookingDetails.time}</li>
      <li><strong>Место подачи:</strong> ${bookingDetails.pickup}</li>
      <li><strong>Место назначения:</strong> ${bookingDetails.dropoff}</li>
      <li><strong>Количество пассажиров:</strong> ${bookingDetails.passengers}</li>
    </ul>
  `;

  return sendEmail(adminEmail, subject, html);
};