import { z } from 'zod';

// Common regex for numbers or common formats
const phoneRegex = /^[0-9\s\-\+\(\)]+$/;

export const ClientSchema = z.object({
  firstName: z.string().min(2, "Le prénom doit faire au moins 2 caractères"),
  lastName: z.string().min(2, "Le nom doit faire au moins 2 caractères"),
  email: z.string().email("L'adresse email est invalide").optional().or(z.literal('')),
  dateOfBirth: z.string().optional().or(z.literal(null)),
  nationality: z.string().optional().or(z.literal('')),
  socialSecurityNumber: z.string().optional().or(z.literal('')),
  street: z.string().optional().or(z.literal('')),
  streetNumber: z.string().optional().or(z.literal('')),
  postalCode: z.string().optional().or(z.literal('')),
  stateCanton: z.string().optional().or(z.literal('')),
  country: z.string().optional().or(z.literal('')),
  mobilePhone: z.string().regex(phoneRegex, "Format de téléphone invalide").optional().or(z.literal('')).or(z.literal(null)),
  otherPhone: z.string().optional().or(z.literal('')),
}).passthrough(); // allows other fields we may not explicitly check

export const TaskSchema = z.object({
  title: z.string().min(3, "Le titre doit faire au moins 3 caractères"),
  description: z.string().optional().or(z.literal('')),
  responsibleId: z.number({ required_error: "Le responsable est obligatoire" }),
  clientId: z.number().optional().nullable(),
  priority: z.string().optional(),
  dueDate: z.string().optional().nullable(),
  status: z.enum(['PENDING', 'IN_PROGRESS', 'COMPLETED', 'OVERDUE']).default('PENDING')
}).passthrough();

export const FolderSchema = z.object({
  name: z.string().min(2, "Le nom du dossier doit faire au moins 2 caractères"),
  description: z.string().optional().or(z.literal('')),
  clientId: z.number().optional().nullable(),
  status: z.enum(['PENDING', 'PROGRESS', 'FINISHED', 'URGENT']).default('PROGRESS')
}).passthrough();

export const DocumentSchema = z.object({
  name: z.string().min(1, "Le nom est obligatoire"),
  fileType: z.string().min(1, "Le type de fichier est obligatoire"),
  path: z.string().min(1, "Le chemin est obligatoire"),
  isPermanent: z.boolean().default(false),
  clientId: z.number().optional().nullable(),
  folderId: z.number().optional().nullable()
}).passthrough();

export const FactureSchema = z.object({
  titre: z.string().min(2, "Le titre est obligatoire"),
  type: z.string().min(1, "Le type est obligatoire"),
  dateReception: z.string().or(z.date()),
  echeance: z.string().or(z.date()),
  statut: z.string().default('OPEN'),
  montant: z.number().optional().nullable(),
  partenaireId: z.number({ required_error: "Le partenaire est obligatoire" })
}).passthrough();
