import { planAplicaAProducto } from './plan-cuotas-matching.util';

describe('planAplicaAProducto', () => {
  const planSinAlcance = { categoria_id: null, precio_producto_desde: null, precio_producto_hasta: null };

  it('un plan sin categoría ni rango siempre aplica', () => {
    expect(planAplicaAProducto(planSinAlcance, { categoriaId: 'cat-x', categoriaPadreId: null }, 500000)).toBe(true);
    expect(planAplicaAProducto(planSinAlcance, { categoriaId: null, categoriaPadreId: null }, 500000)).toBe(true);
  });

  it('matchea la categoría específica del producto', () => {
    const plan = { categoria_id: 'cat-heladeras', precio_producto_desde: null, precio_producto_hasta: null };
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-heladeras', categoriaPadreId: 'cat-electro' }, 500000)).toBe(true);
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-zapateros', categoriaPadreId: 'cat-muebles' }, 500000)).toBe(false);
  });

  it('matchea la categoría padre del producto', () => {
    const plan = { categoria_id: 'cat-electro', precio_producto_desde: null, precio_producto_hasta: null };
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-heladeras', categoriaPadreId: 'cat-electro' }, 500000)).toBe(true);
  });

  it('respeta el rango de precio (desde/hasta)', () => {
    const plan = { categoria_id: null, precio_producto_desde: 300000, precio_producto_hasta: 1000000 };
    expect(planAplicaAProducto(plan, { categoriaId: null, categoriaPadreId: null }, 500000)).toBe(true);
    expect(planAplicaAProducto(plan, { categoriaId: null, categoriaPadreId: null }, 200000)).toBe(false);
    expect(planAplicaAProducto(plan, { categoriaId: null, categoriaPadreId: null }, 2000000)).toBe(false);
  });

  it('precio_producto_hasta null = sin tope superior', () => {
    const plan = { categoria_id: null, precio_producto_desde: 300000, precio_producto_hasta: null };
    expect(planAplicaAProducto(plan, { categoriaId: null, categoriaPadreId: null }, 50000000)).toBe(true);
  });

  it('categoría Y precio deben cumplirse ambos (AND)', () => {
    const plan = { categoria_id: 'cat-tv', precio_producto_desde: 500000, precio_producto_hasta: null };
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-tv', categoriaPadreId: null }, 300000)).toBe(false);
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-otra', categoriaPadreId: null }, 700000)).toBe(false);
    expect(planAplicaAProducto(plan, { categoriaId: 'cat-tv', categoriaPadreId: null }, 700000)).toBe(true);
  });
});
