import { describe, it, expect } from 'vitest';
import { ingestaBodySchema } from '@/lib/funnel/ingesta-schema';

describe('ingestaBodySchema', () => {
  it('acepta una foto con zona y momento por defecto "antes"', () => {
    const r = ingestaBodySchema.safeParse({
      items: [{ tipo: 'foto', zona: 'bano', imagen: 'data:image/png;base64,AAA' }],
    });
    expect(r.success).toBe(true);
    if (r.success) {
      const foto = r.data.items[0];
      expect(foto.tipo).toBe('foto');
      if (foto.tipo === 'foto') expect(foto.momento).toBe('antes');
    }
  });

  it('acepta momento "despues" explícito', () => {
    const r = ingestaBodySchema.safeParse({
      items: [{ tipo: 'foto', zona: 'cocina', momento: 'despues', imagen: 'https://x/y.jpg' }],
    });
    expect(r.success).toBe(true);
  });

  it('acepta una nota de texto y zona opcional', () => {
    const r = ingestaBodySchema.safeParse({ items: [{ tipo: 'texto', texto: 'suelo premium' }] });
    expect(r.success).toBe(true);
  });

  it('acepta items mixtos foto + texto', () => {
    const r = ingestaBodySchema.safeParse({
      items: [
        { tipo: 'foto', zona: 'bano', imagen: 'data:image/png;base64,AAA' },
        { tipo: 'texto', zona: 'bano', texto: 'suelo premium' },
      ],
    });
    expect(r.success).toBe(true);
  });

  it('acepta una llamada solo con flag perfilCompleto (sin items)', () => {
    const r = ingestaBodySchema.safeParse({ perfilCompleto: true });
    expect(r.success).toBe(true);
    if (r.success) expect(r.data.items).toEqual([]);
  });

  it('acepta una llamada solo con flag finalizar', () => {
    expect(ingestaBodySchema.safeParse({ finalizar: true }).success).toBe(true);
  });

  it('rechaza una llamada totalmente vacía', () => {
    expect(ingestaBodySchema.safeParse({}).success).toBe(false);
    expect(ingestaBodySchema.safeParse({ items: [] }).success).toBe(false);
  });

  it('rechaza un tipo de item inválido', () => {
    const r = ingestaBodySchema.safeParse({ items: [{ tipo: 'video', imagen: 'x' }] });
    expect(r.success).toBe(false);
  });

  it('rechaza una zona fuera del enum', () => {
    const r = ingestaBodySchema.safeParse({
      items: [{ tipo: 'foto', zona: 'jardin', imagen: 'data:...' }],
    });
    expect(r.success).toBe(false);
  });

  it('rechaza foto sin imagen y texto vacío', () => {
    expect(ingestaBodySchema.safeParse({ items: [{ tipo: 'foto', imagen: '' }] }).success).toBe(
      false,
    );
    expect(ingestaBodySchema.safeParse({ items: [{ tipo: 'texto', texto: '   ' }] }).success).toBe(
      false,
    );
  });
});
