import { describe, expect, it } from "vitest";
import { auditLeadSchema, contactLeadSchema } from "@/lib/lead";
import { allowRequest } from "@/lib/rate-limit";
import { isKnownInternalHref } from "@/lib/routes";

const validAudit = {
  intent: "audit",
  name: "Jordan Lee",
  email: "Jordan@Example.com ",
  company: "Example Co",
  website: "example.com",
  model: "saas",
  spend: "10k-50k",
  message: "",
  focus: "measurement,conversion",
  consent: "yes",
};

describe("auditLeadSchema", () => {
  it("accepts a complete request and normalizes the email", () => {
    const result = auditLeadSchema.safeParse(validAudit);
    expect(result.success).toBe(true);
    expect(result.success && result.data.email).toBe("jordan@example.com");
  });

  it("requires consent, a valid email, and a business model", () => {
    const result = auditLeadSchema.safeParse({ ...validAudit, consent: "", email: "not-an-email", model: "" });
    expect(result.success).toBe(false);
    const fields = result.success ? [] : result.error.issues.map((issue) => issue.path[0]);
    expect(fields).toEqual(expect.arrayContaining(["consent", "email", "model"]));
  });

  it("allows an empty website but rejects malformed ones", () => {
    expect(auditLeadSchema.safeParse({ ...validAudit, website: "" }).success).toBe(true);
    expect(auditLeadSchema.safeParse({ ...validAudit, website: "not a site" }).success).toBe(false);
  });

  it("rejects focus values that could smuggle markup", () => {
    expect(auditLeadSchema.safeParse({ ...validAudit, focus: "<script>" }).success).toBe(false);
  });
});

describe("contactLeadSchema", () => {
  it("requires a meaningful message", () => {
    const base = { intent: "contact", name: "Jordan Lee", email: "jordan@example.com", company: "Example Co", consent: "yes" };
    expect(contactLeadSchema.safeParse({ ...base, message: "Hi" }).success).toBe(false);
    expect(contactLeadSchema.safeParse({ ...base, message: "We'd like to discuss a project." }).success).toBe(true);
  });
});

describe("allowRequest", () => {
  it("allows a burst up to the limit, then blocks until the window passes", () => {
    const key = `test-${Math.random()}`;
    const start = 1_000_000;
    for (let i = 0; i < 5; i += 1) expect(allowRequest(key, 5, 60_000, start + i)).toBe(true);
    expect(allowRequest(key, 5, 60_000, start + 10)).toBe(false);
    expect(allowRequest(key, 5, 60_000, start + 61_000)).toBe(true);
  });
});

describe("isKnownInternalHref", () => {
  it("recognizes real routes and home anchors only", () => {
    expect(isKnownInternalHref("/paid-media")).toBe(true);
    expect(isKnownInternalHref("/resources/mer-vs-roas-guide")).toBe(true);
    expect(isKnownInternalHref("/#growth-diagnostic")).toBe(true);
    expect(isKnownInternalHref("/growth-audit?model=saas")).toBe(true);
    expect(isKnownInternalHref("/#missing-anchor")).toBe(false);
    expect(isKnownInternalHref("/services")).toBe(false);
    expect(isKnownInternalHref("https://example.com")).toBe(false);
  });
});
