// ../../Modelo/Archivos_JS/Formulario_Abastecimiento_Galonera.js
$(function () {
  const $form     = $('#Registrar_Abastecimiento_Galonera');
  const $galonera = $('#galonera_id');
  const $grifo    = $('#grifo_id');

  const $capTxt   = $('#capacidad_litros');
  const $tipoTxt  = $('#tipo_combustible_txt');

  const $tipoId   = $('#tipo_combustible_id');
  const $cant     = $('#cantidad_gln');
  const $vu       = $('#valor_unitario_gln');
  const $vale     = $('#numero_vale');
  const $fecha    = $('#fecha_abastecimiento');
  const $hora     = $('#hora_abastecimiento');
  const $obs      = $('#observaciones');

  const $btnBorrar = $('#btn-borrar');
  const $btnReg    = $('#btn-registrar');
  const $alertCap  = $('#capacidad_alert');

  // Responsable por DNI
  const $dni   = $('#dni');
  const $rId   = $('#responsable_id');
  const $rName = $('#nombre_chofer');

  // ===== Helpers =====
  // Incluye GLP (id 8). También mapeo histórico por si hay datos viejos con mixtos o GNV.
  const TIPO_COMB_MAP = {
    1: 'DIESEL B5 (DB5)',
    2: 'G-REGULAR',
    3: 'G-PREMIUM',
    4: 'GLP/G-REGULAR',
    5: 'GLP/G-PREMIUM',
    6: 'GNV/G-REGULAR',
    7: 'GNV/G-PREMIUM',
    8: 'GLP'
  };

  // parseo seguro: coma → punto
  function toNum(v) {
    if (v === null || v === undefined) return NaN;
    return parseFloat(String(v).replace(',', '.'));
  }

  // limita decimales SÓLO visualmente (no rellena ceros)
  function limitDecimals(str, maxDec) {
    const s = String(str).replace(',', '.').replace(/[^\d.]/g, '');
    if (!s) return '';
    const parts = s.split('.');
    if (parts.length === 1) return parts[0].replace(/^0+(?=\d)/, '0');
    parts[1] = parts[1].slice(0, maxDec);
    return parts[0].replace(/^0+(?=\d)/, '0') + '.' + parts[1];
  }

  // fija decimales para envío
  function toFixedOrEmpty(v, decs) {
    const n = toNum(v);
    if (!Number.isFinite(n)) return '';
    return n.toFixed(decs);
  }

  // ===== Select2 =====
  if ($.fn.select2) {
    $galonera.select2({ width: '100%', placeholder: 'Seleccione una galonera' });
    $grifo.select2({ width: '100%', placeholder: 'Seleccione un grifo' });
  }

  // ===== N° Vale: permitir letras, números, guion y SLASH =====
  let valeDuplicado = false;        // flag para bloquear envío si hay duplicado
  let valeTimer = null;             // debounce

  $vale.on('input', function () {
    const v = $(this).val().toUpperCase().replace(/[^A-Z0-9\-\/]/g, '');
    $(this).val(v);
    // al escribir, resetea el flag y no bloquees el formulario todavía
    valeDuplicado = false;
    if (valeTimer) clearTimeout(valeTimer);
  });

  // Validación AJAX de N° de vale reutilizando checkVale.php (scope=galonera)
  function validarValeAjax() {
    const numeroVale = ($vale.val() || '').trim();
    valeDuplicado = false;

    // en galonera el vale puede ser opcional (NULL): si está vacío, no validar
    if (!numeroVale) return;

    $.ajax({
      url: '../../Controlador/Ctrl_Administrador/checkVale.php',
      method: 'POST',
      data: {
        numero_vale: numeroVale,
        scope: 'galonera' // ⬅ indica al PHP que consulte control_abastecimiento_galonera
      },
      dataType: 'json'
    })
    .done(function (resp) {
      if (!resp.ok) {
        Swal.fire({
          icon: 'error',
          title: 'Error',
          text: resp.msg || 'No se pudo validar el N° de vale.',
          timer: 2500,
          showConfirmButton: false
        });
        // ante error lógico, prevenimos envío
        valeDuplicado = true;
        return;
      }
      if (resp.duplicate) {
        Swal.fire({
          icon: 'warning',
          title: 'Vale duplicado',
          text: resp.msg,
          timer: 2500,
          showConfirmButton: false
        });
        // mantenemos el valor para que el usuario lo corrija manualmente
        $vale.focus();
        valeDuplicado = true;
      } else {
        valeDuplicado = false;
      }
    })
    .fail(function () {
      // ante error de red, bloquea enviar hasta revalidar
      Swal.fire({
        icon: 'error',
        title: 'Error de conexión',
        text: 'No se pudo validar el N° de vale. Intente nuevamente.',
        timer: 2000,
        showConfirmButton: false
      });
      valeDuplicado = true;
    });
  }

  // Dispara validación al salir del campo (con un pequeño debounce por si hay blur rápido)
  $vale.on('blur', function () {
    if (valeTimer) clearTimeout(valeTimer);
    valeTimer = setTimeout(validarValeAjax, 200);
  });

  // ===== Cambio de Galonera =====
  let capacidadActual = null;

  $galonera.on('change', function () {
    const opt = this.selectedOptions && this.selectedOptions[0];
    if (!opt || !opt.dataset) { limpiarCamposDependientes(); return; }

    const cap  = Number(opt.dataset.capacidad || 0);
    const tid  = opt.dataset.tipo !== '' ? Number(opt.dataset.tipo) : null;

    capacidadActual = Number.isFinite(cap) ? cap : null;
    $capTxt.val(capacidadActual !== null ? cap.toFixed(2) : '');

    // 1) intenta leer el nombre desde data-tipo-nombre (si lo envías en el HTML)
    let nombreTipo = '';
    const dataTipoNombre = (opt.getAttribute('data-tipo-nombre') || '').trim();
    if (dataTipoNombre) {
      nombreTipo = dataTipoNombre;
    } else if (tid && TIPO_COMB_MAP[tid]) {
      // 2) fallback por ID (incluye GLP id=8)
      nombreTipo = TIPO_COMB_MAP[tid];
    }

    $tipoTxt.val(nombreTipo || '—');
    $tipoId.val(tid || '');

    validarCapacidadCantidad();
  });

  function limpiarCamposDependientes() {
    capacidadActual = null;
    $capTxt.val('');
    $tipoTxt.val('');
    $tipoId.val('');
    ocultarAlertaCapacidad();
  }
  function mostrarAlertaCapacidad() {
    $alertCap.removeClass('d-none');
    $cant.addClass('is-invalid');
  }
  function ocultarAlertaCapacidad() {
    $alertCap.addClass('d-none');
    $cant.removeClass('is-invalid');
  }

  function validarCapacidadCantidad() {
    const q = toNum($cant.val());
    if (!Number.isFinite(q) || q <= 0 || capacidadActual === null) {
      ocultarAlertaCapacidad();
      return true;
    }
    if (q > capacidadActual + 1e-9) { mostrarAlertaCapacidad(); return false; }
    ocultarAlertaCapacidad();
    return true;
  }
  $cant.on('input', function () {
    // recorta a 5 decimales mientras escribe (admite coma)
    const rec = limitDecimals($(this).val(), 5);
    if (rec !== $(this).val()) $(this).val(rec);
  });
  $cant.on('change', validarCapacidadCantidad);

  // ===== Responsable por DNI =====
  function limpiarResponsable(msg = '') { $rId.val(''); $rName.val(msg); }

  function buscarChoferPorDNI(dni) {
    if (!/^\d{8}$/.test(dni)) { limpiarResponsable(''); return; }

    $.getJSON(`../../Controlador/Utilidades/Fetch_Chofer.php?dni=${encodeURIComponent(dni)}&_ts=${Date.now()}`)
      .done(function (data) {
        if (data?.nombre_completo) {
          $rName.val(data.nombre_completo);
          $rId.val(data.id);
        } else if (data?.error === 'estado_invalido') {
          limpiarResponsable('');
          Swal.fire({ icon:'warning', title:'Conductor no disponible', text:`Estado: ${(data.estado||'').toUpperCase()}`, timer:2000, showConfirmButton:false });
        } else {
          limpiarResponsable('');
          Swal.fire({ icon:'error', title:'Conductor no encontrado', text:'El DNI ingresado no existe.', timer:2000, showConfirmButton:false });
        }
      })
      .fail(function (jq, text, err) {
        limpiarResponsable('');
        Swal.fire({
          icon:'error',
          title:'Error',
          html:`No se pudo consultar el DNI.<br>Status: ${jq.status}<br>${jq.responseText || text || err}`
        });
      });
  }

  $dni.on('input', function () {
    const v = this.value.replace(/\D/g,'').slice(0,8);
    this.value = v;
    if (v.length === 8) buscarChoferPorDNI(v); else limpiarResponsable('');
  });
  $dni.on('blur', function () {
    const v = this.value.trim();
    if (v.length === 8) buscarChoferPorDNI(v);
  });

  // ===== Fecha/Hora =====
  $fecha.on('blur change', function () {
    const f = $(this).val(); if (!f) return;
    const hoy = new Date(); hoy.setHours(0,0,0,0);
    const fDate = new Date(f + 'T00:00:00');
    if (fDate > hoy) {
      Swal.fire({ icon:'warning', title:'Fecha inválida', text:'La fecha no puede ser posterior a hoy.', timer:2000, showConfirmButton:false });
      $(this).val(''); $hora.val('');
    }
  });

  $hora.on('blur change', function () {
    const f = $fecha.val(); const h = $(this).val(); if (!f || !h) return;
    const ingreso = new Date(`${f}T${h}:00`);
    const ahora   = new Date();
    const hoy0    = new Date(); hoy0.setHours(0,0,0,0);
    const f0      = new Date(f + 'T00:00:00');
    if (f0.getTime() === hoy0.getTime() && ingreso > ahora) {
      Swal.fire({ icon:'warning', title:'Hora inválida', text:'La hora no puede ser posterior a la actual.', timer:2000, showConfirmButton:false });
      $(this).val('');
    }
  });

  // ===== Valor Unitario: recortar a 2 decimales mientras escribe =====
  $vu.on('input', function () {
    const rec = limitDecimals($(this).val(), 2);
    if (rec !== $(this).val()) $(this).val(rec);
  });

  // ===== Borrar =====
  $btnBorrar.on('click', function () {
    $form[0].reset();
    if ($.fn.select2) { $galonera.val('').trigger('change'); $grifo.val('').trigger('change'); }
    limpiarCamposDependientes();
    ocultarAlertaCapacidad();
    limpiarResponsable('');
    valeDuplicado = false;
    if (valeTimer) clearTimeout(valeTimer);
  });

  // ===== Submit =====
  $form.on('submit', function (e) {
    if (!$galonera.val()) { e.preventDefault(); return Swal.fire('Falta información','Seleccione una galonera.','warning'); }
    if (!$grifo.val())    { e.preventDefault(); return Swal.fire('Falta información','Seleccione un grifo.','warning'); }

    const dni = ($dni.val() || '').trim();
    if (!/^\d{8}$/.test(dni)) { e.preventDefault(); return Swal.fire('Campo obligatorio','Ingrese un DNI válido (8 dígitos).','warning'); }
    if (!$rId.val())         { e.preventDefault(); return Swal.fire('Responsable','Ingrese un DNI válido para seleccionar al responsable.','warning'); }

    if (!validarCapacidadCantidad()) { e.preventDefault(); return Swal.fire('Cantidad excedida','La cantidad (GLN) no puede superar la capacidad de la galonera.','error'); }

    const vu = toNum($vu.val());
    if (!Number.isFinite(vu) || vu <= 0) { e.preventDefault(); return Swal.fire('Valor inválido','Ingrese un valor unitario (S/ por GLN) mayor a 0.','error'); }

    if (!$fecha.val() || !$hora.val()) { e.preventDefault(); return Swal.fire('Falta información','Complete la fecha y la hora.','warning'); }

    // Si hay N° de vale y está marcado como duplicado, bloquear envío
    const numeroVale = ($vale.val() || '').trim();
    if (numeroVale && valeDuplicado) {
      e.preventDefault();
      return Swal.fire({
        icon: 'error',
        title: 'N° de vale duplicado',
        text: 'Corrige el N° de vale antes de guardar.',
        timer: 2200,
        showConfirmButton: false
      });
    }

    // ===== Normalización final antes de enviar (coma → punto) =====
    // cantidad: hasta 5 decimales; valor unitario: fijo 2 decimales
    const cantFixed = (function(){
      const n = toNum($cant.val());
      return Number.isFinite(n) ? n.toFixed(5) : '';
    })();
    const vuFixed = toFixedOrEmpty($vu.val(), 2);

    if (!cantFixed || !vuFixed) {
      e.preventDefault();
      return Swal.fire('Formato inválido','Revise los decimales: Cantidad (hasta 5), Valor Unitario (2).','error');
    }

    $cant.val(cantFixed);   // ej. "12.34567"
    $vu.val(vuFixed);       // ej. "15.98"

    $btnReg.prop('disabled', true);
  });

  if ($galonera.val()) $galonera.trigger('change');
});

// Navegación con ENTER
$('#Registrar_Abastecimiento_Galonera').on('keypress', 'input, select', function (e) {
  if (e.which === 13) {
    e.preventDefault();
    const $inputs = $('#Registrar_Abastecimiento_Galonera')
      .find('input:visible:not([disabled]), select:visible:not([disabled])')
      .filter(':not([readonly])');
    const idx = $inputs.index(this);
    if (idx > -1 && idx < $inputs.length - 1) $inputs.eq(idx + 1).focus();
    else $('#btn-registrar').click();
  }
});
