import { z } from "zod";
import { verifiedEmailSchema } from "./email";

export const createLeadSchema = z.object({
  propertyId: z.string().uuid("Invalid property ID"),
  clientName: z.string().min(2, "Name must be at least 2 characters").max(100),
  clientEmail: verifiedEmailSchema,
  clientPhone: z.string().optional().nullable(),
  message: z.string().min(5, "Message must be at least 5 characters").max(2000),
  inquiryType: z.enum(["GENERAL_INQUIRY", "SCHEDULE_VIEWING", "MAKE_OFFER", "DIRECT_CALL", "WHATSAPP_INQUIRY"]).default("GENERAL_INQUIRY"),
  preferredViewingDate: z.string().optional().nullable(),
  meetingType: z.enum(["PHYSICAL", "VIRTUAL_VIDEO"]).optional().nullable(),
  source: z.string().optional().nullable(),
});

export const recordContactClickSchema = z.object({
  propertyId: z.string().uuid("Invalid property ID"),
  channel: z.enum(["CALL", "WHATSAPP"]),
  clientName: z.string().optional().nullable(),
  clientPhone: z.string().optional().nullable(),
});


export const updateLeadStatusSchema = z.object({
  leadId: z.string().uuid(),
  status: z.enum([
    "NEW",
    "CONTACTED",
    "VIEWING_SCHEDULED",
    "VIEWING_COMPLETED",
    "NEGOTIATING",
    "WON",
    "LOST",
    "SPAM",
  ]),
  lostReason: z.string().max(255).optional().nullable(),
});

export const scheduleViewingSchema = z.object({
  leadId: z.string().uuid(),
  propertyId: z.string().uuid(),
  scheduledAt: z.string().min(1, "Please select appointment date and time"),
  durationMinutes: z.number().int().min(15).max(240).default(60),
  meetingType: z.enum(["PHYSICAL", "VIRTUAL_VIDEO"]).default("PHYSICAL"),
  meetingLocation: z.string().max(255).optional().nullable(),
  notes: z.string().max(1000).optional().nullable(),
});

export const updateViewingStatusSchema = z.object({
  appointmentId: z.string().uuid(),
  status: z.enum(["SCHEDULED", "CONFIRMED", "COMPLETED", "CANCELLED", "NO_SHOW"]),
  cancellationReason: z.string().max(255).optional().nullable(),
});

export const addLeadNoteSchema = z.object({
  leadId: z.string().uuid(),
  note: z.string().min(2, "Note must be at least 2 characters").max(1000),
});

export const leadFilterSchema = z.object({
  search: z.string().optional(),
  status: z.string().optional(),
  propertyId: z.string().optional(),
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().default(20),
});

export type CreateLeadInput = z.infer<typeof createLeadSchema>;
export type UpdateLeadStatusInput = z.infer<typeof updateLeadStatusSchema>;
export type ScheduleViewingInput = z.infer<typeof scheduleViewingSchema>;
export type UpdateViewingStatusInput = z.infer<typeof updateViewingStatusSchema>;
export type AddLeadNoteInput = z.infer<typeof addLeadNoteSchema>;
export type LeadFilterInput = z.infer<typeof leadFilterSchema>;
export type RecordContactClickInput = z.infer<typeof recordContactClickSchema>;

