import { z } from 'zod';
import { TIPOS_ENTREGA, METODOS_PAGO } from './domain';

// Telefono venezolano: 0414/0424/0412/0416/0426 + 7 digitos (con o sin espacios/guiones).
const telefonoVE = z
  .string()
  .trim()
  .transform((s) => s.replace(/[\s-]/g, ''))
  .refine((s) => /^0(4(12|14|16|24|26)|2\d{2})\d{7}$/.test(s), {
    message: 'Telefono venezolano invalido (ej. 0414-1234567)',
  });

export const itemCarritoSchema = z.object({
  producto_id: z.string().uuid(),
  nombre: z.string(),
  precio_usd: z.number().nonnegative(),
  cantidad: z.number().int().positive().max(99),
  nota: z.string().max(200).optional(),
  opciones: z.array(z.string().max(80)).max(30).optional(),
  // Cada eleccion con su grupo. El servidor cobra el extra que corresponde a ESE
  // grupo: el mismo nombre puede ser gratis en uno ("incluida") y costar en otro.
  opciones_sel: z
    .array(z.object({ g: z.string().max(120), o: z.string().max(80) }))
    .max(30)
    .optional(),
});
export type ItemCarrito = z.infer<typeof itemCarritoSchema>;

export const checkoutSchema = z
  .object({
    restaurante_id: z.string().uuid(),
    cliente_nombre: z.string().trim().min(2, 'Nombre muy corto').max(80),
    cliente_telefono: telefonoVE,
    cliente_cedula: z.string().trim().max(20).optional(),
    tipo_entrega: z.enum(TIPOS_ENTREGA),
    mesa: z.string().trim().max(20).optional(),
    direccion: z.string().trim().max(300).optional(),
    direccion_lat: z.number().optional(),
    direccion_lng: z.number().optional(),
    metodo_pago: z.enum(METODOS_PAGO),
    nota: z.string().max(300).optional(),
    personas: z.number().int().min(1).max(50).optional(),
    items: z.array(itemCarritoSchema).min(1, 'El carrito esta vacio'),
  })
  .refine((d) => d.tipo_entrega !== 'delivery' || (d.direccion && d.direccion.length > 4), {
    message: 'Para delivery necesitas indicar la direccion',
    path: ['direccion'],
  })
  .refine((d) => d.tipo_entrega !== 'reserva' || (d.personas && d.personas >= 1), {
    message: 'Indica para cuantas personas es la reserva',
    path: ['personas'],
  });
export type CheckoutInput = z.infer<typeof checkoutSchema>;
