/**
 * Alcance opcional por categoría/precio de un plan de cuotas o regla de precio
 * (Fase 6, docs/plan-motor-precios-rentabilidad.md §11). Un plan sin
 * categoria_id ni rango seteado siempre aplica (retrocompatible). Con
 * categoria_id seteado, matchea la categoría específica del producto o su
 * categoría padre directa (un solo nivel).
 */
export type PlanConAlcance = {
  categoria_id: string | null;
  precio_producto_desde: unknown; // Prisma.Decimal | number | null
  precio_producto_hasta: unknown;
};

export function planAplicaAProducto(
  plan: PlanConAlcance,
  producto: { categoriaId: string | null; categoriaPadreId: string | null },
  precioContado: number,
): boolean {
  const matchCategoria =
    !plan.categoria_id ||
    plan.categoria_id === producto.categoriaId ||
    plan.categoria_id === producto.categoriaPadreId;
  const matchDesde =
    plan.precio_producto_desde === null ||
    plan.precio_producto_desde === undefined ||
    precioContado >= Number(plan.precio_producto_desde);
  const matchHasta =
    plan.precio_producto_hasta === null ||
    plan.precio_producto_hasta === undefined ||
    precioContado <= Number(plan.precio_producto_hasta);
  return matchCategoria && matchDesde && matchHasta;
}
