"use server";

import { z } from "zod";

import { siteConfig } from "@/config/site.config";
import { submitLeadWebhook } from "@/features/contact/contact.api";
import { defaultLocale, hasLocale, type Locale } from "@/lib/locales";

export type LeadFormState = {
  errors?: Record<string, string[] | undefined>;
  message?: string;
  success?: boolean;
};

const leadSchema = z.object({
  company: z.string().trim().min(2, "Please enter your company name.").max(120),
  email: z.string().trim().email("Please enter a valid email address.").max(160),
  fullName: z.string().trim().min(2, "Please enter your full name.").max(120),
  locale: z.enum(["en", "hi", "gu"]),
  message: z.string().trim().max(1000).optional(),
  mobile: z
    .string()
    .trim()
    .regex(/^[6-9]\d{9}$/, "Enter a valid 10-digit mobile number"),
  mode: z.enum(["contact", "demo"]),
  preferredLanguage: z.enum(["en", "hi", "gu"]),
  product: z.enum(["pureestate", "buildpro", "societypro", "not-sure"]),
  website: z.string().max(0).optional(),
});

const leadMessages = {
  en: {
    checkFields: "Please check the highlighted fields.",
    deliveryMissing: `Lead delivery is not configured yet. Please email ${siteConfig.email}.`,
    sendFailed: "We could not send your request right now. Please try again shortly.",
  },
  hi: {
    checkFields: "कृपया हाइलाइट किए गए फ़ील्ड जांचें।",
    deliveryMissing: `लीड डिलीवरी अभी कॉन्फ़िगर नहीं है। कृपया ${siteConfig.email} पर ईमेल करें।`,
    sendFailed: "हम अभी आपका अनुरोध भेज नहीं सके। कृपया थोड़ी देर बाद फिर से कोशिश करें।",
  },
  gu: {
    checkFields: "કૃપા કરીને હાઇલાઇટ કરેલા ફીલ્ડ્સ તપાસો.",
    deliveryMissing: `લીડ ડિલિવરી હજી કૉન્ફિગર નથી. કૃપા કરીને ${siteConfig.email} પર ઇમેઇલ કરો.`,
    sendFailed: "અમે અત્યારે તમારી વિનંતી મોકલી શક્યા નથી. કૃપા કરીને થોડા સમય પછી ફરી પ્રયાસ કરો.",
  },
} satisfies Record<Locale, Record<string, string>>;

function sanitize(value: string | undefined) {
  return value?.replace(/[<>]/g, "").trim() ?? "";
}

export async function submitLead(
  _previousState: LeadFormState,
  formData: FormData,
): Promise<LeadFormState> {
  const locale = getFormLocale(formData);
  const parsed = leadSchema.safeParse({
    company: formData.get("company"),
    email: formData.get("email"),
    fullName: formData.get("fullName"),
    locale: formData.get("locale"),
    message: formData.get("message"),
    mobile: formData.get("mobile"),
    mode: formData.get("mode"),
    preferredLanguage: formData.get("preferredLanguage"),
    product: formData.get("product"),
    website: formData.get("website"),
  });

  if (!parsed.success) {
    return {
      errors: parsed.error.flatten().fieldErrors,
      message: leadMessages[locale].checkFields,
      success: false,
    };
  }

  if (parsed.data.website) {
    return { success: true };
  }

  const payload = {
    ...parsed.data,
    company: sanitize(parsed.data.company),
    fullName: sanitize(parsed.data.fullName),
    message: sanitize(parsed.data.message),
    receivedAt: new Date().toISOString(),
  };

  const webhookUrl = process.env.LEAD_WEBHOOK_URL;
  if (!webhookUrl) {
    return {
      message: leadMessages[parsed.data.locale].deliveryMissing,
      success: false,
    };
  }

  try {
    await submitLeadWebhook(webhookUrl, payload);
  } catch {
    return {
      message: leadMessages[parsed.data.locale].sendFailed,
      success: false,
    };
  }

  return {
    message: "success",
    success: true,
  };
}

function getFormLocale(formData: FormData): Locale {
  const locale = formData.get("locale");
  return typeof locale === "string" && hasLocale(locale) ? locale : defaultLocale;
}
