import type { APIRoute } from "astro";
import nodemailer from "nodemailer";

const SMTP_HOST = import.meta.env.SMTP_HOST || "localhost";
const SMTP_PORT = parseInt(import.meta.env.SMTP_PORT || "1025");
const SMTP_USER = import.meta.env.SMTP_USER || "";
const SMTP_PASS = import.meta.env.SMTP_PASS || "";
const SMTP_FROM_NAME = import.meta.env.SMTP_FROM_NAME || "Advokat086";
const SMTP_FROM_EMAIL = import.meta.env.SMTP_FROM_EMAIL || "noreply@advokat086.ru";

// Email для получения заявок
const RECIPIENT_EMAIL = import.meta.env.RECIPIENT_EMAIL || "redibedi2019@gmail.com";

const PRACTICE_AREAS: Record<string, string> = {
  civil: "Гражданское право",
  admin: "Административное право",
  family: "Семейное право",
  arbitration: "Арбитражные дела",
  realestate: "Недвижимость",
  svo: "СВО",
};

export const POST: APIRoute = async ({ request }) => {
  try {
    const body = await request.json();
    const { name, phone, practice, message } = body;

    // Валидация
    if (!name || !phone || !message) {
      return new Response(
        JSON.stringify({ error: "Заполните все обязательные поля" }),
        {
          status: 400,
          headers: { "Content-Type": "application/json" },
        }
      );
    }

    if (name.length < 2 || name.length > 50) {
      return new Response(
        JSON.stringify({ error: "Имя должно быть от 2 до 50 символов" }),
        {
          status: 400,
          headers: { "Content-Type": "application/json" },
        }
      );
    }

    if (message.length < 10 || message.length > 1000) {
      return new Response(
        JSON.stringify({ error: "Сообщение должно быть от 10 до 1000 символов" }),
        {
          status: 400,
          headers: { "Content-Type": "application/json" },
        }
      );
    }

    const phoneRegex = /^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/;
    if (!phoneRegex.test(phone)) {
      return new Response(
        JSON.stringify({ error: "Некорректный формат телефона" }),
        {
          status: 400,
          headers: { "Content-Type": "application/json" },
        }
      );
    }

    // Создаём транспорт для отправки
    const transporter = nodemailer.createTransport({
      host: SMTP_HOST,
      port: SMTP_PORT,
      secure: false, // false для Maildev
      auth: SMTP_USER && SMTP_PASS ? {
        user: SMTP_USER,
        pass: SMTP_PASS,
      } : undefined,
    });

    // Формируем тему письма
    const practiceLabel = practice ? PRACTICE_AREAS[practice] || practice : "Не указано";
    const subject = `Новая заявка: ${practiceLabel} - ${name}`;

    // Формируем HTML тела письма
    const html = `
      <!DOCTYPE html>
      <html>
        <head>
          <meta charset="utf-8">
          <style>
            body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
            .container { max-width: 600px; margin: 0 auto; padding: 20px; }
            .header { background: linear-gradient(135deg, #1e293b 0%, #2d3748 100%); color: #d4af37; padding: 20px; border-radius: 8px 8px 0 0; }
            .header h1 { margin: 0; font-size: 24px; }
            .content { background: #f8f9fa; padding: 20px; border: 1px solid #e9ecef; border-top: none; }
            .field { margin-bottom: 15px; }
            .field-label { font-weight: bold; color: #666; font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; }
            .field-value { font-size: 16px; color: #1a202c; margin-top: 5px; }
            .message { background: #fff; padding: 15px; border-left: 4px solid #d4af37; margin-top: 10px; }
            .footer { text-align: center; padding: 15px; font-size: 12px; color: #999; background: #f8f9fa; border: 1px solid #e9ecef; border-top: none; border-radius: 0 0 8px 8px; }
          </style>
        </head>
        <body>
          <div class="container">
            <div class="header">
              <h1>📬 Новая заявка с сайта</h1>
            </div>
            <div class="content">
              <div class="field">
                <div class="field-label">Имя клиента</div>
                <div class="field-value">${escapeHtml(name)}</div>
              </div>
              <div class="field">
                <div class="field-label">Телефон</div>
                <div class="field-value">${escapeHtml(phone)}</div>
              </div>
              <div class="field">
                <div class="field-label">Сфера вопроса</div>
                <div class="field-value">${escapeHtml(practiceLabel)}</div>
              </div>
              <div class="field">
                <div class="field-label">Сообщение</div>
                <div class="message">${escapeHtml(message)}</div>
              </div>
            </div>
            <div class="footer">
              Отправлено с сайта Advokat086 • ${new Date().toLocaleString("ru-RU")}
            </div>
          </div>
        </body>
      </html>
    `;

    // Формируем текстовую версию
    const text = `
Новая заявка с сайта Advokat086

Имя: ${name}
Телефон: ${phone}
Сфера вопроса: ${practiceLabel}
Сообщение: ${message}

---
Отправлено: ${new Date().toLocaleString("ru-RU")}
    `.trim();

    // Отправляем письмо
    await transporter.sendMail({
      from: `"${SMTP_FROM_NAME}" <${SMTP_FROM_EMAIL}>`,
      to: RECIPIENT_EMAIL,
      subject,
      text,
      html,
      replyTo: SMTP_FROM_EMAIL,
    });

    console.log(`[Contact API] Письмо успешно отправлено на ${RECIPIENT_EMAIL}`);

    return new Response(
      JSON.stringify({ success: true, message: "Заявка успешно отправлена" }),
      {
        status: 200,
        headers: { "Content-Type": "application/json" },
      }
    );
  } catch (error) {
    console.error("[Contact API] Ошибка при отправке письма:", error);
    return new Response(
      JSON.stringify({ error: "Ошибка при отправке заявки. Попробуйте позже." }),
      {
        status: 500,
        headers: { "Content-Type": "application/json" },
      }
    );
  }
};

// Утилита для экранирования HTML
function escapeHtml(text: string): string {
  const map: Record<string, string> = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': "&quot;",
    "'": "&#039;",
  };
  return text.replace(/[&<>"']/g, (m) => map[m]);
}
