import { logoEmisor, nombreFantasiaEmisor, sucursalUnicaDeDocumentos } from './emisor-comprobante';

describe('logoEmisor', () => {
  it('usa el logo de la sucursal que emitió el documento', () => {
    expect(logoEmisor({ logo: 'https://cdn/suc.png' }, { logo: 'https://cdn/emp.png' })).toBe('https://cdn/suc.png');
  });

  it('sin logo propio de la sucursal, cae al de la empresa', () => {
    expect(logoEmisor({ logo: null }, { logo: 'https://cdn/emp.png' })).toBe('https://cdn/emp.png');
    expect(logoEmisor({ logo: '  ' }, { logo: 'https://cdn/emp.png' })).toBe('https://cdn/emp.png');
    expect(logoEmisor(null, { logo: 'https://cdn/emp.png' })).toBe('https://cdn/emp.png');
  });

  it('sin ninguno, null', () => {
    expect(logoEmisor(null, null)).toBeNull();
    expect(logoEmisor({ logo: '' }, { logo: '' })).toBeNull();
  });
});

describe('nombreFantasiaEmisor', () => {
  it('usa el nombre comercial de la sucursal que emitió', () => {
    expect(nombreFantasiaEmisor({ nombre_fantasia: 'Agogo Regalos' }, { nombre_fantasia: 'Empresa' })).toBe('Agogo Regalos');
  });

  it('sin nombre propio de la sucursal, cae al de la empresa', () => {
    expect(nombreFantasiaEmisor({ nombre_fantasia: ' ' }, { nombre_fantasia: 'Empresa' })).toBe('Empresa');
    expect(nombreFantasiaEmisor(null, { nombre_fantasia: 'Empresa' })).toBe('Empresa');
  });

  it('sin ninguno, null (el comprobante muestra sólo la razón social)', () => {
    expect(nombreFantasiaEmisor({ nombre_fantasia: null }, { nombre_fantasia: '' })).toBeNull();
  });
});

describe('sucursalUnicaDeDocumentos', () => {
  const crearPrisma = (sucursales: Array<{ id: string; punto_establecimiento: string; logo?: string | null; nombre_fantasia?: string | null }>) => ({
    empresas_sucursales: {
      findMany: jest.fn(({ where }) =>
        Promise.resolve(
          sucursales.filter(
            (s) =>
              (!where.id || where.id.in.includes(s.id)) &&
              (!where.punto_establecimiento || where.punto_establecimiento.in.includes(s.punto_establecimiento)),
          ),
        ),
      ),
    },
  });
  const TALLER = { id: 'suc-t', punto_establecimiento: '001', logo: 'https://cdn/t.png', nombre_fantasia: 'Taller' };
  const AGOGO = { id: 'suc-a', punto_establecimiento: '003', logo: null, nombre_fantasia: null };

  it('todas las facturas de un mismo establecimiento → esa sucursal', async () => {
    const prisma: any = crearPrisma([TALLER, AGOGO]);
    await expect(sucursalUnicaDeDocumentos(prisma, 'emp', { establecimientos: ['001', '001', null] })).resolves.toEqual({
      logo: 'https://cdn/t.png',
      nombre_fantasia: 'Taller',
    });
  });

  it('documentos de más de una sucursal → null (se usa la empresa)', async () => {
    const prisma: any = crearPrisma([TALLER, AGOGO]);
    await expect(sucursalUnicaDeDocumentos(prisma, 'emp', { establecimientos: ['001', '003'] })).resolves.toBeNull();
    await expect(sucursalUnicaDeDocumentos(prisma, 'emp', { sucursalIds: ['suc-t', 'suc-a'] })).resolves.toBeNull();
  });

  it('por sucursal_id (compras) y sin documentos', async () => {
    const prisma: any = crearPrisma([TALLER, AGOGO]);
    await expect(sucursalUnicaDeDocumentos(prisma, 'emp', { sucursalIds: ['suc-t'] })).resolves.toMatchObject({ nombre_fantasia: 'Taller' });
    await expect(sucursalUnicaDeDocumentos(prisma, 'emp', { establecimientos: [] })).resolves.toBeNull();
    expect(prisma.empresas_sucursales.findMany).toHaveBeenCalledTimes(1);
  });
});
