import { NextResponse } from "next/server"
import { ZodError } from "zod"
import { contactFormSchema } from "@/lib/contact-form"
import { sendContactNotification } from "@/lib/contact-mailer"
import { ContactMailerConfigError, loadContactMailerConfig } from "@/lib/contact-mailer-config"

export const runtime = "nodejs"

function getClientIp(request: Request) {
  const forwardedFor = request.headers.get("x-forwarded-for")

  if (forwardedFor) {
    return forwardedFor.split(",")[0]?.trim() || "unknown"
  }

  return request.headers.get("x-real-ip") ?? "unknown"
}

function formatSubmittedAt() {
  return new Intl.DateTimeFormat("zh-CN", {
    timeZone: "Asia/Shanghai",
    dateStyle: "full",
    timeStyle: "long",
  }).format(new Date())
}

export async function POST(request: Request) {
  let requestBody: unknown

  try {
    requestBody = await request.json()
  } catch {
    return NextResponse.json(
      { error: "请求格式不正确，请刷新后重试。" },
      { status: 400 }
    )
  }

  try {
    const payload = contactFormSchema.parse(requestBody)
    const config = await loadContactMailerConfig()

    await sendContactNotification({
      config,
      payload,
      meta: {
        submittedAt: formatSubmittedAt(),
        sourceUrl: request.headers.get("referer") ?? request.headers.get("origin") ?? new URL(request.url).origin,
        ipAddress: getClientIp(request),
        userAgent: request.headers.get("user-agent") ?? "unknown",
      },
    })

    return NextResponse.json({ ok: true })
  } catch (error) {
    if (error instanceof ZodError) {
      return NextResponse.json(
        { error: error.issues[0]?.message ?? "提交信息不完整，请检查后重试。" },
        { status: 400 }
      )
    }

    if (error instanceof ContactMailerConfigError) {
      console.error(error.message)

      return NextResponse.json(
        { error: "邮件通知配置不完整，请联系管理员检查 SMTP 设置。" },
        { status: 500 }
      )
    }

    console.error("Failed to send contact notification", error)

    return NextResponse.json(
      { error: "提交失败，邮件通知未发送成功，请稍后重试。" },
      { status: 500 }
    )
  }
}
