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

  // Vista inicial (respeta ?v=galoneras)
  let vista = (new URLSearchParams(location.search).get('v') === 'galoneras') ? 'galoneras' : 'vehiculos';
  let tarjetas = false; // false = tabla, true = tarjetas

  const $badge = $('#badgeVista');                 // Badge principal din�mico
  const $badgeModal = $('#badgeVistaActual');      // Badge del modal (fijo)
  const $btnReg = $('#btnRegistrar');
  const $btnVeh = $('#btnVistaVehiculos');
  const $btnGal = $('#btnVistaGaloneras');
  const $btnRef = $('#btnRefrescar');
  const $btnToggleCards = $('#toggleViewBtn');

  // Endpoints que devuelven ARRAY JSON
  const API = {
    vehiculos: '../../Controlador/Ctrl_Administrador/MySQL_Listar_Abastecimientos_DT.php',
    galoneras: '../../Controlador/Ctrl_Administrador/MySQL_Listar_Abastecimientos_Galonera_DT.php'
  };

  // Nombres seguros (sin mojibake)
  const VIEWS = {
    vehiculos: {
      tabla: '#wrapTablaVeh', tarjetas: '#tarjetasVeh',
      badge: 'Veh\u00edculos', color: 'primary',
      tableSel: '#tablaAbastecimientos'
    },
    galoneras: {
      tabla: '#wrapTablaGal', tarjetas: '#tarjetasGal',
      badge: 'Galoneras', color: 'success',
      tableSel: '#tablaAbastecimientosGaloneras'
    }
  };

  /* -------------------- Funciones auxiliares -------------------- */
  function ocultarTodo() { $('.vista').addClass('d-none'); }

  function pintarBadge() {
    const conf = VIEWS[vista];
    $badge
      .text('Vista: ' + conf.badge)
      .removeClass('bg-primary bg-success')
      .addClass('bg-' + conf.color);

    $btnVeh.toggleClass('active', vista === 'vehiculos');
    $btnGal.toggleClass('active', vista === 'galoneras');

    $btnReg.data('href',
      vista === 'vehiculos'
        ? 'Adm_Formulario_Abastecimiento.php'
        : 'Adm_Formulario_Abastecimiento_Galonera.php'
    );

    $btnToggleCards.text(tarjetas ? 'Ver como tabla' : 'Ver como tarjetas');
  }

  function inicializarSiHaceFalta() {
    if (tarjetas) return;
    if (vista === 'vehiculos') {
      if (typeof window.initDTVehiculos === 'function') window.initDTVehiculos();
    } else {
      if (typeof window.initDTGaloneras === 'function') window.initDTGaloneras();
    }
  }

  function ajustarColumnasDT() {
    setTimeout(() => {
      try {
        if (tarjetas) return;
        const sel = VIEWS[vista].tableSel;
        if ($.fn.DataTable.isDataTable(sel)) {
          $(sel).DataTable().columns.adjust().responsive.recalc().draw(false);
        }
      } catch (e) { /* noop */ }
    }, 0);
  }

  function mostrarVistaActual() {
    ocultarTodo();
    const conf = VIEWS[vista];
    $(tarjetas ? conf.tarjetas : conf.tabla).removeClass('d-none');
    pintarBadge();
    inicializarSiHaceFalta();
    ajustarColumnasDT();
    window.scrollTo(0, 0);
  }

  function normalizePayload(d) {
    if (Array.isArray(d)) return d;
    if (d && Array.isArray(d.data)) return d.data;
    if (d && Array.isArray(d.aaData)) return d.aaData;
    return [];
  }

  function ordenarDesc(data) {
    const arr = Array.isArray(data) ? data.slice() : [];
    return arr.sort((a, b) => {
      const hA = a.hora_abastecimiento || '00:00:00';
      const hB = b.hora_abastecimiento || '00:00:00';
      const ta = `${a.fecha_abastecimiento || ''} ${hA}`;
      const tb = `${b.fecha_abastecimiento || ''} ${hB}`;
      if (ta === tb) return (b.id || 0) - (a.id || 0);
      return ta < tb ? 1 : -1;
    });
  }

  function pintarDirectoEnDT(selector, filas) {
    if (!$.fn.DataTable.isDataTable(selector)) return false;
    try {
      const api = $(selector).DataTable();
      const ordenados = ordenarDesc(filas || []);
      api.clear();
      api.rows.add(ordenados);
      api.order([[1, 'desc'], [2, 'desc'], [0, 'desc']]);
      api.page('first').draw(false);
      setTimeout(() => api.columns.adjust().responsive.recalc().draw(false), 0);
      return true;
    } catch (e) {
      console.error('[Actualizar] pintarDirectoEnDT error:', e);
      return false;
    }
  }

  const debounce = (fn, w = 140) => { let t; return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), w); }; };

  /* -------------------- Refrescar v�a AJAX -------------------- */
  function refrescarVistaAjax() {
    const selTabla = VIEWS[vista].tableSel;
    const url = API[vista];

    if (!tarjetas && $.fn.DataTable.isDataTable(selTabla)) {
      $btnRef.prop('disabled', true);
      if (vista === 'vehiculos' && typeof window.recargarAbastecimientosPorAjax === 'function') {
        return window.recargarAbastecimientosPorAjax(() => {
          if (typeof window.__repoblarSelectsSegunDatos === 'function') { try { window.__repoblarSelectsSegunDatos(); } catch (_) { } }
          $btnRef.prop('disabled', false);
        });
      }
      if (vista === 'galoneras' && typeof window.recargarGalonerasPorAjax === 'function') {
        return window.recargarGalonerasPorAjax(() => {
          if (typeof window.__repoblarSelectsSegunDatos === 'function') { try { window.__repoblarSelectsSegunDatos(); } catch (_) { } }
          $btnRef.prop('disabled', false);
        });
      }
      $btnRef.prop('disabled', false);
    }

    if (!url) {
      const u = new URL(location.href);
      u.searchParams.set('v', vista);
      return location.replace(u.toString());
    }

    $btnRef.prop('disabled', true);

    $.ajax({
      url: url,
      type: 'GET',
      dataType: 'json',
      cache: false,
      data: { _: Date.now() }
    })
      .done(function (resp) {
        const arr = normalizePayload(resp);

        if (vista === 'vehiculos') {
          window.abastecimientosData = arr;
          if (typeof window.setDataVehiculosOriginal === 'function') window.setDataVehiculosOriginal(arr);

          let hecho = false;
          try {
            if (typeof window.actualizarTablaAbastecimientos === 'function') {
              window.actualizarTablaAbastecimientos(arr);
              hecho = true;
            }
          } catch (e) { console.warn('[Actualizar] actualizarTablaAbastecimientos error, fallback:', e); }
          if (!hecho) pintarDirectoEnDT(selTabla, arr);

          if (tarjetas) {
            if (typeof window.renderizarTarjetasVeh === 'function') window.renderizarTarjetasVeh(arr);
            else if (typeof window.renderizarTarjetas === 'function') { window.pagina = 1; window.renderizarTarjetas(); }
          }
        } else {
          window.abastecimientosGaloneraData = arr;
          if (typeof window.setDataGalonerasOriginal === 'function') window.setDataGalonerasOriginal(arr);

          let hecho = false;
          try {
            if (typeof window.actualizarTablaAbastecimientosGaloneras === 'function') {
              window.actualizarTablaAbastecimientosGaloneras(arr);
              hecho = true;
            }
          } catch (e) { console.warn('[Actualizar] actualizarTablaAbastecimientosGaloneras error, fallback:', e); }
          if (!hecho) pintarDirectoEnDT(selTabla, arr);

          if (tarjetas) {
            if (typeof window.renderizarTarjetasGal === 'function') window.renderizarTarjetasGal(arr);
          }
        }

        if (typeof window.__repoblarSelectsSegunDatos === 'function') { try { window.__repoblarSelectsSegunDatos(); } catch (_) { } }
      })
      .fail(function (xhr, status, err) {
        console.error('[Actualizar] fallo', status, err, xhr && xhr.responseText);
        const u = new URL(location.href);
        u.searchParams.set('v', vista);
        location.replace(u.toString());
      })
      .always(function () {
        $btnRef.prop('disabled', false);
      });
  }

  /* -------------------- Bloqueo de badge modal -------------------- */
  function lockBadgeModal() {
    const el = document.getElementById('badgeVistaActual');
    if (!el) return;
    const FIX = 'Veh\u00edculos';
    el.textContent = FIX;

    const mo = new MutationObserver(() => {
      if (el.textContent !== FIX) el.textContent = FIX;
    });
    mo.observe(el, { childList: true, characterData: true, subtree: true });

    document.addEventListener('shown.bs.modal', (ev) => {
      if (ev.target && ev.target.id === 'modalFiltroAvanzado') el.textContent = FIX;
    });
  }

  /* -------------------- Arranque -------------------- */
  lockBadgeModal();
  mostrarVistaActual();

  // Eventos
  $btnVeh.off('click').on('click', () => { vista = 'vehiculos'; tarjetas = false; mostrarVistaActual(); });
  $btnGal.off('click').on('click', () => { vista = 'galoneras'; tarjetas = false; mostrarVistaActual(); });
  $btnReg.off('click').on('click', function () { location.href = $(this).data('href'); });
  $btnToggleCards.off('click').on('click', () => { tarjetas = !tarjetas; mostrarVistaActual(); });
  $btnRef.off('click').on('click', debounce(refrescarVistaAjax, 140));

  // Exponer vista actual
  window.__vistaAbastecimientos = () => vista;
  window.__vistaEsTarjetas = () => tarjetas;

  inicializarSiHaceFalta();
})();
