/** Subcadena sin distinguir mayúsculas; filtro vacío no excluye. */
export function filterText(cell: unknown, filter: string): boolean {
    const f = filter.trim().toLowerCase();
    if (!f) return true;
    return String(cell ?? '')
        .toLowerCase()
        .includes(f);
}

/** Coincidencia exacta como string; filtro vacío no excluye. */
export function filterSelectEq(cell: unknown, filter: string): boolean {
    if (!filter) return true;
    return String(cell ?? '') === filter;
}

/** '' = todos, '1' = marcado, '0' = no marcado */
export function filterTriBool(cell: unknown, filter: string): boolean {
    if (!filter) return true;
    const on = cell === true || cell === 1 || String(cell) === '1';
    if (filter === '1') return on;
    if (filter === '0') return !on;
    return true;
}

/** Etiqueta de tarifa comparable (espacios, mayúsculas). */
export function normalizeTarifaLabel(value: unknown): string {
    return String(value ?? '')
        .replace(/\s+/g, ' ')
        .trim()
        .toLowerCase();
}

/**
 * Misma noción que el `filtro` de integración/tarifas (nombreTarifa del CUPS origen):
 * solo las filas con la misma tarifa (nombreTarifa o tarifa) reciben la ventana al propagar con datos comunes.
 */
export function rowMatchesVentanaTarifaFiltro(origenRow: any, candidateRow: any): boolean {
    const oN = normalizeTarifaLabel(origenRow?.nombreTarifa);
    const oT = normalizeTarifaLabel(origenRow?.tarifa);
    const cN = normalizeTarifaLabel(candidateRow?.nombreTarifa);
    const cT = normalizeTarifaLabel(candidateRow?.tarifa);
    if (oN && (cN === oN || cT === oN)) return true;
    if (oT && (cN === oT || cT === oT)) return true;
    return false;
}

export function origenRowHasTarifaParaVentana(origenRow: any): boolean {
    return !!(normalizeTarifaLabel(origenRow?.nombreTarifa) || normalizeTarifaLabel(origenRow?.tarifa));
}
