import { z } from 'zod';

export const createPropertySchema = z.object({
  title: z.string().min(1, 'Título requerido').max(200),
  slug: z.string().min(1).max(100).regex(/^[a-z0-9-]+$/, 'Slug inválido'),
  description: z.string().max(5000).optional(),
  price: z.number().positive('Precio debe ser mayor a 0'),
  currency: z.enum(['PEN', 'USD']).default('PEN'),
  status: z.enum(['AVAILABLE', 'RESERVED', 'SOLD', 'RENTED', 'INACTIVE']).default('AVAILABLE'),
  type: z.enum(['HOUSE', 'APARTMENT', 'LAND', 'OFFICE', 'LOCAL', 'WAREHOUSE', 'BUILDING']),
  address: z.string().max(500).optional(),
  district: z.string().max(100).optional(),
  city: z.string().max(100).optional(),
  province: z.string().max(100).optional(),
  area: z.number().positive().optional(),
  bedrooms: z.number().int().min(0).optional(),
  bathrooms: z.number().int().min(0).optional(),
  parkingSpaces: z.number().int().min(0).optional(),
  yearBuilt: z.number().int().min(1800).max(new Date().getFullYear()).optional(),
  services: z.record(z.string(), z.string()).optional(),
  amenities: z.record(z.string(), z.string()).optional(),
  isPublished: z.boolean().default(false),
});

export const updatePropertySchema = createPropertySchema.partial();

export const propertyQuerySchema = z.object({
  page: z.coerce.number().default(1),
  limit: z.coerce.number().default(20).refine(val => val <= 100, { message: 'Limit must be 100 or less' }),
  status: z.enum(['AVAILABLE', 'RESERVED', 'SOLD', 'RENTED', 'INACTIVE']).optional(),
  type: z.enum(['HOUSE', 'APARTMENT', 'LAND', 'OFFICE', 'LOCAL', 'WAREHOUSE', 'BUILDING']).optional(),
  search: z.string().optional(),
});

export type CreatePropertyInput = z.infer<typeof createPropertySchema>;
export type UpdatePropertyInput = z.infer<typeof updatePropertySchema>;
export type PropertyQueryInput = z.infer<typeof propertyQuerySchema>;