import { z } from "zod";

/**
 * Lead capture: validation schemas and delivery. Server-only (imported by the server action).
 * Delivery posts JSON to LEAD_WEBHOOK_URL (Zapier, Make, n8n, a CRM workflow, or Slack via a relay).
 */

export const businessModels = ["saas", "ecommerce", "other"] as const;
export const spendRanges = ["none", "under-10k", "10k-50k", "50k-150k", "150k-plus", "not-sure"] as const;

const trimmed = (max: number) => z.string().trim().max(max, { error: `Keep this under ${max} characters.` });

const baseFields = {
  name: trimmed(120).min(2, { error: "Enter your name." }),
  email: z.string().trim().toLowerCase().pipe(z.email({ error: "Enter a valid work email." })),
  company: trimmed(160).min(1, { error: "Enter your company name." }),
  consent: z.literal("yes", { error: "Please confirm you've read the privacy policy." }),
};

const website = trimmed(300).refine((value) => value === "" || /^(https?:\/\/)?[\w-]+(\.[\w-]+)+([/?#]\S*)?$/i.test(value), {
  error: "Enter a valid website, like example.com.",
});

export const auditLeadSchema = z.object({
  intent: z.literal("audit"),
  ...baseFields,
  website,
  model: z.enum(businessModels, { error: "Choose a business model." }),
  spend: z.enum(spendRanges).or(z.literal("")),
  message: trimmed(3000),
  focus: z.string().trim().max(80).regex(/^[a-z,]*$/, { error: "Invalid focus." }),
});

export const contactLeadSchema = z.object({
  intent: z.literal("contact"),
  ...baseFields,
  message: trimmed(3000).min(10, { error: "Tell us a little more (at least 10 characters)." }),
});

export type AuditLead = z.infer<typeof auditLeadSchema>;
export type ContactLead = z.infer<typeof contactLeadSchema>;
export type Lead = AuditLead | ContactLead;

export const leadFieldNames = ["name", "email", "company", "website", "model", "spend", "message", "focus", "consent"] as const;
export type LeadField = (typeof leadFieldNames)[number];

export interface DeliveryResult {
  ok: boolean;
  message?: string;
}

export async function deliverLead(lead: Lead, meta: { userAgent: string | null; referer: string | null }): Promise<DeliveryResult> {
  const webhook = process.env.LEAD_WEBHOOK_URL?.trim();
  const payload = {
    ...lead,
    consent: true,
    submittedAt: new Date().toISOString(),
    site: "axidysmedia.com",
    meta,
  };

  if (!webhook) {
    if (process.env.NODE_ENV !== "production") {
      console.info("[lead] LEAD_WEBHOOK_URL is not set. Development submission logged locally:", payload);
      return { ok: true };
    }
    console.error("[lead] LEAD_WEBHOOK_URL is not configured; a submission could not be delivered.");
    return { ok: false, message: "Our form isn't accepting submissions right now. Please try again later." };
  }

  if (!webhook.startsWith("https://")) {
    console.error("[lead] LEAD_WEBHOOK_URL must use https.");
    return { ok: false, message: "Our form isn't accepting submissions right now. Please try again later." };
  }

  try {
    const secret = process.env.LEAD_WEBHOOK_SECRET?.trim();
    const response = await fetch(webhook, {
      method: "POST",
      headers: { "content-type": "application/json", ...(secret ? { "x-axidys-signature": secret } : {}) },
      body: JSON.stringify(payload),
      signal: AbortSignal.timeout(8000),
      cache: "no-store",
    });
    if (!response.ok) throw new Error(`Webhook responded with ${response.status}`);
    return { ok: true };
  } catch (error) {
    console.error("[lead] Delivery failed:", error instanceof Error ? error.message : error);
    return { ok: false, message: "Something went wrong sending your request. Please try again in a moment." };
  }
}
