// Path in project: app/api/contact/route.ts
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { sendMail } from "@/lib/mailer";
import {
  contactEnquiryThankYouEmailTemplate,
  contactEnquiryAdminNotificationEmailTemplate,
} from "@/lib/email-templates";

interface ContactBody {
  name?: string;
  email?: string;
  phone?: string;
  subject?: string;
  message?: string;
  company_name?: string;
}

function getClientIp(req: NextRequest): string | null {
  // Behind most proxies/load balancers (Vercel, Cloudflare, nginx) the real
  // client IP is the first entry in x-forwarded-for. Fall back to x-real-ip.
  const forwardedFor = req.headers.get("x-forwarded-for");
  if (forwardedFor) return forwardedFor.split(",")[0].trim();

  const realIp = req.headers.get("x-real-ip");
  if (realIp) return realIp.trim();

  return null;
}

// POST /api/contact — public endpoint, stores a new contact enquiry.
export async function POST(req: NextRequest) {
  let body: ContactBody;
  try {
    body = await req.json();
  } catch {
    return NextResponse.json({ error: "Invalid request body" }, { status: 400 });
  }

  const name = body.name?.trim();
  const email = body.email?.trim();
  const phone = body.phone?.trim();
  const subject = body.subject?.trim();
  const message = body.message?.trim();
  const companyName = body.company_name?.trim();

  if (!name) {
    return NextResponse.json({ error: "Name is required" }, { status: 400 });
  }
  if (!email) {
    return NextResponse.json({ error: "Email is required" }, { status: 400 });
  }
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    return NextResponse.json({ error: "A valid email is required" }, { status: 400 });
  }
  if (!message) {
    return NextResponse.json({ error: "Message is required" }, { status: 400 });
  }

  let enquiry;
  try {
    enquiry = await prisma.contact_enquiries.create({
      data: {
        name,
        email,
        phone: phone || null,
        subject: subject || null,
        message,
        company_name: companyName || null,
        ip_address: getClientIp(req),
        status: "Pending",
      },
    });
  } catch (err) {
    console.error("Contact Enquiry Error:", err);
    return NextResponse.json({ error: "Failed to submit your enquiry. Please try again." }, { status: 500 });
  }

  // Notify the submitter and all active admins. Never let a mail failure
  // fail the request — the enquiry is already saved at this point.
  try {
    const thankYouHtml = contactEnquiryThankYouEmailTemplate(name);
    const sendThankYou = sendMail({
      to: email,
      subject: "Thank you for contacting RKDA",
      html: thankYouHtml,
    });

    const admins = await prisma.master_admin_users.findMany({
      where: {
        active_status: true,
        delete_status: false,
        deleted_at: null,
      },
      select: { user_email: true },
    });
    const adminEmails = admins.map((a) => a.user_email).filter(Boolean);

    const adminHtml = contactEnquiryAdminNotificationEmailTemplate({
      id: enquiry.id.toString(),
      name,
      email,
      phone: phone || null,
      subject: subject || null,
      message,
      companyName: companyName || null,
      ipAddress: getClientIp(req),
      submittedAt: enquiry.created_at ?? new Date(),
      dashboardLink: `${process.env.NEXT_PUBLIC_APP_URL}/admin/contact-enquiries`,
    });

    const sendAdminNotifications =
      adminEmails.length > 0
        ? Promise.allSettled(
            adminEmails.map((adminEmail) =>
              sendMail({
                to: adminEmail,
                subject: `New contact enquiry from ${name}`,
                html: adminHtml,
              })
            )
          )
        : Promise.resolve();

    if (adminEmails.length === 0) {
      console.warn("No active admin recipients found for contact enquiry notification.");
    }

    await Promise.allSettled([sendThankYou, sendAdminNotifications]);
  } catch (mailErr) {
    console.error("Contact Enquiry Email Error:", mailErr);
  }

  return NextResponse.json({
    message: "Enquiry submitted successfully",
    // BigInt isn't JSON-serializable by default — stringify explicitly.
    data: { id: enquiry.id.toString() },
  });
}