import { z } from 'zod';

// Espejo del enum tipo_reforma (src/db/schema.ts). Se mantiene aquí como tupla literal para que
// el schema sea puro (sin importar drizzle) y los tests lo validen sin tocar la DB.
export const ZONAS = ['cocina', 'bano', 'salon', 'comedor', 'integral', 'otro'] as const;

const itemFoto = z.object({
  tipo: z.literal('foto'),
  zona: z.enum(ZONAS).optional(),
  momento: z.enum(['antes', 'despues']).default('antes'),
  imagen: z.string().min(1), // data URI o URL http(s)
  orden: z.number().int().min(0).optional(),
});

const itemTexto = z.object({
  tipo: z.literal('texto'),
  zona: z.enum(ZONAS).optional(),
  texto: z.string().trim().min(1),
});

// Cuerpo del EP de ingesta: una lista de items (foto o texto) y/o flags. Una llamada vacía
// (sin items ni flag) se rechaza.
export const ingestaBodySchema = z
  .object({
    items: z.array(z.discriminatedUnion('tipo', [itemFoto, itemTexto])).default([]),
    perfilCompleto: z.boolean().optional(),
    finalizar: z.boolean().optional(),
  })
  .refine((b) => b.items.length > 0 || b.perfilCompleto || b.finalizar, {
    message: 'Llamada vacía: aporta items o un flag (perfilCompleto/finalizar).',
  });

export type IngestaBody = z.infer<typeof ingestaBodySchema>;
export type IngestaItem = IngestaBody['items'][number];
