import { z } from "zod";

const PROTOCOL_PREFIX_REGEX = /^https?:\/\//i;

const projectTypes = [
  { value: "headless-migration", label: "Headless Build or Migration" },
  { value: "performance-audit", label: "Performance & Strategy Audit" },
  { value: "ecommerce-shopify", label: "E-commerce Experience (Shopify)" },
  { value: "marketing-site", label: "Marketing Site Development" },
  { value: "technical-consulting", label: "Technical Consulting" },
  { value: "other", label: "Other" },
] as const;

export type ProjectType = (typeof projectTypes)[number]["value"];

export interface ContactFormSchemaMessages {
  emailInvalid?: string;
  emailRequired?: string;
  fullNameRequired?: string;
  fullNameTooLong?: string;
  messageTooLong?: string;
  projectTypeInvalid?: string;
  projectTypeRequired?: string;
  websiteInvalid?: string;
  websiteRequired?: string;
  websiteTooLong?: string;
}

export function createContactFormSchema(messages?: ContactFormSchemaMessages) {
  return z.object({
    email: z
      .string()
      .min(1, messages?.emailRequired ?? "Email is required")
      .email(messages?.emailInvalid ?? "Please enter a valid email address"),
    website: z
      .string()
      .min(1, messages?.websiteRequired ?? "Website is required")
      .transform((val) => {
        const trimmed = val.trim();
        return PROTOCOL_PREFIX_REGEX.test(trimmed)
          ? trimmed
          : `https://${trimmed}`;
      })
      .pipe(
        z
          .string()
          .url(messages?.websiteInvalid ?? "Please enter a valid domain")
          .max(200, messages?.websiteTooLong ?? "Website URL is too long")
      ),
    fullName: z
      .string()
      .min(1, messages?.fullNameRequired ?? "Name is required")
      .max(100, messages?.fullNameTooLong ?? "Name is too long"),
    projectType: z
      .string()
      .min(1, messages?.projectTypeRequired ?? "Please select a project type")
      .refine((val) => projectTypes.some((type) => type.value === val), {
        message:
          messages?.projectTypeInvalid ?? "Please select a valid project type",
      }),
    message: z
      .string()
      .max(1000, messages?.messageTooLong ?? "Message is too long")
      .optional()
      .or(z.literal("")),
  });
}

export const contactFormSchema = createContactFormSchema();

export type ContactFormData = z.infer<typeof contactFormSchema>;

export interface ContactFormResponse {
  data?: {
    emailId: string;
    timestamp: string;
  };
  error?: string;
  message: string;
  success: boolean;
}

export interface ContactFormState {
  error: string | null;
  isSubmitted: boolean;
  isSubmitting: boolean;
  success: string | null;
}

export interface ContactFormProps {
  className?: string;
  subtitle?: string;
  title?: string;
  variant?: "default" | "compact";
}
