"use server";

import { headers } from "next/headers";
import { auditLeadSchema, contactLeadSchema, deliverLead, leadFieldNames, type LeadField } from "@/lib/lead";
import { allowRequest } from "@/lib/rate-limit";

export interface LeadFormState {
  status: "idle" | "success" | "error";
  message?: string;
  fieldErrors?: Partial<Record<LeadField, string>>;
  values?: Partial<Record<LeadField, string>>;
}

const MIN_FILL_MS = 2500;

export async function submitLead(_previous: LeadFormState, formData: FormData): Promise<LeadFormState> {
  const text = (name: string) => {
    const value = formData.get(name);
    return typeof value === "string" ? value : "";
  };

  // Bots: a filled honeypot or an instant submission is accepted silently and dropped.
  const startedAt = Number(text("started_at"));
  if (text("company_role") !== "" || (Number.isFinite(startedAt) && startedAt > 0 && Date.now() - startedAt < MIN_FILL_MS)) {
    return { status: "success" };
  }

  const requestHeaders = await headers();
  const ip = requestHeaders.get("x-forwarded-for")?.split(",")[0]?.trim() || requestHeaders.get("x-real-ip") || "unknown";
  if (!allowRequest(`lead:${ip}`)) {
    return { status: "error", message: "Too many submissions from this connection. Please wait a few minutes and try again." };
  }

  const intent = text("intent") === "contact" ? "contact" : "audit";
  const values = Object.fromEntries(leadFieldNames.map((field) => [field, text(field)])) as Record<LeadField, string>;
  const parsed =
    intent === "audit"
      ? auditLeadSchema.safeParse({ intent, ...values })
      : contactLeadSchema.safeParse({ intent, name: values.name, email: values.email, company: values.company, message: values.message, consent: values.consent });

  if (!parsed.success) {
    const fieldErrors: Partial<Record<LeadField, string>> = {};
    for (const issue of parsed.error.issues) {
      const field = issue.path[0];
      if (typeof field === "string" && field in values && !fieldErrors[field as LeadField]) {
        fieldErrors[field as LeadField] = issue.message;
      }
    }
    return { status: "error", message: "Please check the highlighted fields.", fieldErrors, values };
  }

  const result = await deliverLead(parsed.data, {
    userAgent: requestHeaders.get("user-agent"),
    referer: requestHeaders.get("referer"),
  });

  if (!result.ok) return { status: "error", message: result.message, values };
  return { status: "success" };
}
