// ../../Modelo/Archivos_JS/FiltroAvanzado_Abastecimientos.js
(function () {
  'use strict';

  // ===== Persistir copias originales UNA sola vez (para reset) =====
  if (!window.__origVeh) window.__origVeh = Array.isArray(window.abastecimientosData) ? window.abastecimientosData.slice() : [];
  if (!window.__origGal) window.__origGal = Array.isArray(window.abastecimientosGaloneraData) ? window.abastecimientosGaloneraData.slice() : [];
  // Mantener sincronizados los "originales" cuando llegue nueva data:
  window.setDataVehiculosOriginal = function (data) {
    window.__origVeh = Array.isArray(data) ? data.slice() : [];
  };
  window.setDataGalonerasOriginal = function (data) {
    window.__origGal = Array.isArray(data) ? data.slice() : [];
  };

  // ===== Utils =====
  const norm = (v) => (v == null ? '' : String(v)).replace(/\u00A0/g, ' ').trim().toLowerCase();
  const toNum = (v) => (v == null || v === '' || isNaN(v)) ? null : Number(v);
  const inRange = (val, min, max) => (val == null || (min == null || val >= min) && (max == null || val <= max));
  const uniqSorted = (arr) =>
    [...new Set((arr || []).map(x => (x || '').trim()).filter(Boolean))]
      .sort((a, b) => a.localeCompare(b, 'es', { numeric: true, sensitivity: 'base' }));

  // Visibilidad sin depender de jQuery :visible (por clases d-none)
  const isShown = (id) => {
    const el = document.getElementById(id);
    return !!(el && !el.classList.contains('d-none'));
  };

  // Reajuste seguro (evita ¡°espacio blanco¡± despu¨¦s de draw)
  function reajustarDT(sel) {
    if (!$.fn.DataTable || !$.fn.DataTable.isDataTable(sel)) return;
    const api = $(sel).DataTable();
    setTimeout(() => { api.columns.adjust().responsive.recalc().draw(false); }, 0);
    setTimeout(() => { api.columns.adjust().responsive.recalc().draw(false); }, 50);
  }

  // ===== Vista activa (veh / gal) =====
  function vistaActiva() {
    if (isShown('wrapTablaGal') || isShown('tarjetasGal')) return 'gal';
    const b = document.getElementById('badgeVista');
    if (b && /galoneras/i.test(b.textContent || '')) return 'gal';
    return 'veh';
  }
  function refrescarBadgeVista() {
    const v = vistaActiva();
    const el = document.getElementById('badgeVistaActual');
    if (el) el.textContent = (v === 'veh' ? 'Veh¨ªculos' : 'Galoneras');
  }

  // ===== Poblar selects comunes (grifos/combustibles) preservando selecci¨®n =====
  function poblarSelects({ preserve = true } = {}) {
    const veh = window.__origVeh || [];
    const gal = window.__origGal || [];

    const grifos = uniqSorted([
      ...(veh.map(x => x?.grifo || '')),
      ...(gal.map(x => x?.grifo || ''))
    ]);

    const combustibles = uniqSorted([
      ...(veh.map(x => x?.combustible_abastecido || '')),
      ...(gal.map(x => x?.combustible_abastecido || ''))
    ]);

    const $grifo = $('#filtro_grifo');
    const $comb  = $('#filtro_combustible');

    // Guardar selecci¨®n actual si se desea preservar
    const prevGrifo = preserve ? ($grifo.val() || '') : '';
    const prevComb  = preserve ? ($comb.val()  || '') : '';

    // Repoblar
    $grifo.empty().append('<option value="">Todos</option>');
    grifos.forEach(g => $grifo.append($('<option>', { value: g, text: g })));

    $comb.empty().append('<option value="">Todos</option>');
    combustibles.forEach(c => $comb.append($('<option>', { value: c, text: c })));

    // Restaurar selecci¨®n previa si todav¨ªa existe
    if (prevGrifo && grifos.includes(prevGrifo)) $grifo.val(prevGrifo); else $grifo.val('');
    if (prevComb  && combustibles.includes(prevComb)) $comb.val(prevComb); else $comb.val('');
  }

  // ===== Lectura de filtros =====
  function leerComunes() {
    return {
      fIni: $('#filtro_fecha_inicio').val() || '',
      fFin: $('#filtro_fecha_fin').val() || '',
      grifo: norm($('#filtro_grifo').val()),
      comb : norm($('#filtro_combustible').val()),
      vale : norm($('#filtro_vale').val()),
      glnMin: toNum($('#filtro_gln_min').val()),
      glnMax: toNum($('#filtro_gln_max').val()),
      vuMin : toNum($('#filtro_valor_min').val()),
      vuMax : toNum($('#filtro_valor_max').val())
    };
  }
  function leerVeh() {
    return {
      placa : norm($('#filtro_vehiculo').val()),
      chofer: norm($('#filtro_chofer').val()),
      kmMin : toNum($('#filtro_km_min').val()),
      kmMax : toNum($('#filtro_km_max').val())
    };
  }
  function leerGal() {
    return {
      galonera: norm($('#filtro_galonera').val()),
      obs     : norm($('#filtro_obs').val())
    };
  }

  // ===== Comparadores de fecha (YYYY-MM-DD string) =====
  const inDateRange = (d, d1, d2) => {
    if (!d) return true;
    if (d1 && d < d1) return false;
    if (d2 && d > d2) return false;
    return true;
  };

  // ===== Filtrar por vista =====
  function filtrarVeh() {
    const D = window.__origVeh || [];
    const c = leerComunes();
    const v = leerVeh();

    return D.filter(a => {
      const fecha = a.fecha_abastecimiento || '';
      const grifo = norm(a.grifo);
      const comb  = norm(a.combustible_abastecido);
      const vale  = norm(a.numero_vale);
      const placa = norm(a.vehiculo);
      const chofer= norm(a.chofer);
      const gln   = toNum(a.cantidad_gln);
      const vu    = toNum(a.valor_unitario_gln);
      const km    = toNum(a.kilometraje);

      return inDateRange(fecha, c.fIni, c.fFin) &&
             (!c.grifo || grifo === c.grifo) &&
             (!c.comb  || comb  === c.comb) &&
             (!c.vale  || vale.includes(c.vale)) &&
             inRange(gln, c.glnMin, c.glnMax) &&
             inRange(vu , c.vuMin , c.vuMax ) &&
             (!v.placa  || placa.includes(v.placa)) &&
             (!v.chofer || chofer.includes(v.chofer)) &&
             inRange(km, v.kmMin, v.kmMax);
    });
  }

  function filtrarGal() {
    const D = window.__origGal || [];
    const c = leerComunes();
    const g = leerGal();

    return D.filter(a => {
      const fecha = a.fecha_abastecimiento || '';
      const grifo = norm(a.grifo);
      const comb  = norm(a.combustible_abastecido);
      const vale  = norm(a.numero_vale);
      const galon = norm(a.galonera);
      const obs   = norm(a.observaciones);
      const gln   = toNum(a.cantidad_gln);
      const vu    = toNum(a.valor_unitario_gln);

      return inDateRange(fecha, c.fIni, c.fFin) &&
             (!c.grifo || grifo === c.grifo) &&
             (!c.comb  || comb  === c.comb) &&
             (!c.vale  || vale.includes(c.vale)) &&
             inRange(gln, c.glnMin, c.glnMax) &&
             inRange(vu , c.vuMin , c.vuMax ) &&
             (!g.galonera || galon.includes(g.galonera)) &&
             (!g.obs      || (obs && obs.includes(g.obs)));
    });
  }

  // ===== Eventos modal =====
  const modalEl = document.getElementById('modalFiltroAvanzado');
  if (modalEl) {
    modalEl.addEventListener('show.bs.modal', () => {
      refrescarBadgeVista();
      poblarSelects({ preserve: true }); // <- mantiene lo seleccionado en Grifo/Combustible
    });
  }

  // Aplicar filtros
  $('#btnAplicarFiltros').on('click', function () {
    const v = vistaActiva();

    if (v === 'veh') {
      const filtrados = filtrarVeh();
      window.abastecimientosData = filtrados;

      if (typeof window.actualizarTablaAbastecimientos === 'function') {
        window.actualizarTablaAbastecimientos(filtrados);
      } else if ($.fn.DataTable && $.fn.DataTable.isDataTable('#tablaAbastecimientos')) {
        const dt = $('#tablaAbastecimientos').DataTable();
        dt.clear().rows.add(filtrados).order([[1, 'desc'], [2, 'desc'], [0, 'desc']]).draw(false);
        reajustarDT('#tablaAbastecimientos');
      }
      if (isShown('tarjetasVeh')) {
        if (typeof window.renderizarTarjetasVeh === 'function') window.renderizarTarjetasVeh(filtrados);
        else if (typeof window.renderizarTarjetas === 'function') { window.pagina = 1; window.renderizarTarjetas(); }
      }
    } else {
      const filtrados = filtrarGal();
      window.abastecimientosGaloneraData = filtrados;

      if (typeof window.actualizarTablaAbastecimientosGaloneras === 'function') {
        window.actualizarTablaAbastecimientosGaloneras(filtrados);
      } else if ($.fn.DataTable && $.fn.DataTable.isDataTable('#tablaAbastecimientosGaloneras')) {
        const dt = $('#tablaAbastecimientosGaloneras').DataTable();
        dt.clear().rows.add(filtrados).order([[1, 'desc'], [2, 'desc'], [0, 'desc']]).draw(false);
        reajustarDT('#tablaAbastecimientosGaloneras');
      }
      if (isShown('tarjetasGal')) {
        if (typeof window.renderizarTarjetasGal === 'function') window.renderizarTarjetasGal(filtrados);
      }
    }

    // Cerrar modal (API nativa Bootstrap 5)
    if (modalEl) {
      const inst = bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
      inst.hide();
    }
  });

  // Limpiar (mantiene el modal abierto para seguir configurando si se desea)
  $('#btnResetFiltros').on('click', function () {
    $('#modalFiltroAvanzado input, #modalFiltroAvanzado select').val('');
    // Repoblar selects dejando "Todos" expl¨ªcito
    poblarSelects({ preserve: false });

    const v = vistaActiva();

    if (v === 'veh') {
      const originales = (window.__origVeh || []).slice();
      window.abastecimientosData = originales;

      if (typeof window.actualizarTablaAbastecimientos === 'function') {
        window.actualizarTablaAbastecimientos(originales);
      } else if ($.fn.DataTable && $.fn.DataTable.isDataTable('#tablaAbastecimientos')) {
        const dt = $('#tablaAbastecimientos').DataTable();
        dt.clear().rows.add(originales).order([[1, 'desc'], [2, 'desc'], [0, 'desc']]).draw(false);
        reajustarDT('#tablaAbastecimientos');
      }
      if (isShown('tarjetasVeh')) {
        if (typeof window.renderizarTarjetasVeh === 'function') window.renderizarTarjetasVeh(originales);
        else if (typeof window.renderizarTarjetas === 'function') { window.pagina = 1; window.renderizarTarjetas(); }
      }
    } else {
      const originales = (window.__origGal || []).slice();
      window.abastecimientosGaloneraData = originales;

      if (typeof window.actualizarTablaAbastecimientosGaloneras === 'function') {
        window.actualizarTablaAbastecimientosGaloneras(originales);
      } else if ($.fn.DataTable && $.fn.DataTable.isDataTable('#tablaAbastecimientosGaloneras')) {
        const dt = $('#tablaAbastecimientosGaloneras').DataTable();
        dt.clear().rows.add(originales).order([[1, 'desc'], [2, 'desc'], [0, 'desc']]).draw(false);
        reajustarDT('#tablaAbastecimientosGaloneras');
      }
      if (isShown('tarjetasGal')) {
        if (typeof window.renderizarTarjetasGal === 'function') window.renderizarTarjetasGal(originales);
      }
    }
  });

})();
