// Formulario_Abastecimiento.js
$(document).ready(function () {

  let ultimaFechaAbastecimiento = null;
  let ultimaHoraAbastecimiento = null;
  let ultimoKilometrajeAbastecimiento = null;
  let valeDuplicado = false; // ⬅ flag para bloquear envío si el vale está repetido

  // --- Tipos mixtos -> PARES BASE (el render SIEMPRE añadirá G-PREMIUM como 3ra opción) ---
  // IDs de ejemplo: 4..7 (ajusta si tus IDs difieren)
  const MIXTOS = {
    4: ["GLP", "G-REGULAR"],   // GLP / G-REGULAR
    5: ["GLP", "G-PREMIUM"],   // GLP / G-PREMIUM
    6: ["GNV", "G-REGULAR"],   // GNV / G-REGULAR
    7: ["GNV", "G-PREMIUM"]    // GNV / G-PREMIUM
  };

  // ===== Helpers de formato =====
  function normFuel(label) {
    return String(label || '').toUpperCase().trim();
  }
  // Redondeo mitad-arriba a n decimales (robusto)
  function roundHalfUp(n, dec) {
    const x = (parseFloat(n) || 0) + 1e-12;
    const f = Math.pow(10, dec);
    return Math.round(x * f + Number.EPSILON) / f;
  }
  // Normaliza el valor del input a n decimales si hay número
  function normalizeInputDecimals($input, dec) {
    const raw = $input.val();
    const n = parseFloat(raw);
    if (!isNaN(n)) $input.val(roundHalfUp(n, dec).toFixed(dec));
  }

  // 🔎 Intentar obtener el ID del tipo (con fallback por texto)
  function inferirTipoId(data) {
    const crudos = [
      data.tipo_combustible_id,
      data.tipo_combustible_id_fk,
      data.id_tipocombustible,
      data.tipocombustible_id
    ];
    for (const v of crudos) {
      const n = parseInt(v, 10);
      if (!isNaN(n) && n > 0) return n;
    }

    // si no llegó un ID, inferimos por el nombre
    const nombre = normFuel(data.tipo_combustible || data.tipo_combustible_nombre);
    if (!nombre) return 0;

    // mixtos primero
    if (nombre.includes('GLP') && nombre.includes('G-REGULAR')) return 4;
    if (nombre.includes('GLP') && nombre.includes('G-PREMIUM')) return 5;
    if (nombre.includes('GNV') && nombre.includes('G-REGULAR')) return 6;
    if (nombre.includes('GNV') && nombre.includes('G-PREMIUM')) return 7;

    // no mixtos (ejemplos)
    if (nombre.includes('DIESEL'))      return 1;
    if (nombre.includes('G-REGULAR'))   return 2;
    if (nombre.includes('G-PREMIUM'))   return 3;

    return 0;
  }

  // Render dinámico de radios según tipo combustible ID
  function renderOpcionesCombustible(tipoId) {
    const $grupo = $('#grupo-combustible-abastecido');
    const $cont  = $('#opciones-combustible');
    $cont.empty();

    const base = MIXTOS[tipoId];

    if (Array.isArray(base) && base.length) {
      // Siempre añadir G-PREMIUM como tercera opción (evitar duplicados y mantener orden)
      const set = new Set(base.map(normFuel));
      set.add('G-PREMIUM');
      const opciones = Array.from(set);

      opciones.forEach((label) => {
        const clean = normFuel(label).replace(/\W/g,'_');
        const id = `comb-opc-${clean}`;
        $cont.append(
          `<div class="form-check form-check-inline">
             <input class="form-check-input" type="radio"
                    name="combustible_abastecido"
                    id="${id}" value="${label}">
             <label class="form-check-label" for="${id}">${label}</label>
           </div>`
        );
      });

      // marcar como requerido cuando hay radios visibles
      $cont.find('input[type=radio]').prop('required', true);
      $grupo.show();
    } else {
      // No mixto => ocultar y limpiar selección
      $grupo.hide();
      $('input[name="combustible_abastecido"]').prop('checked', false).prop('required', false);
    }
  }

  // Select2 (si el select existe en la vista)
  if ($('#grifo_id').length) {
    $('#grifo_id').select2({ placeholder: "Seleccione un grifo", width: '100%' });
  }

  // === FETCH VEHICULO ===
  $('#placa').on('blur', function () {
    const placa = $(this).val().trim();
    if (!placa) return;

    $('#kilometraje').prop('disabled', true);

    $.getJSON(`../../Controlador/Utilidades/Fetch_Vehiculo.php?placa=${encodeURIComponent(placa)}&_ts=${Date.now()}`, function (data) {

      if (data && (data.tipo_vehiculo || data.id)) {
        $('#tipo_vehiculo').val(data.tipo_vehiculo || '');
        $('#tipo_combustible').val(data.tipo_combustible || data.tipo_combustible_nombre || '');
        $('#marca_vehiculo').val(data.marca || '');
        $('#modelo_vehiculo').val(data.modelo || '');
        $('#vehiculo_id').val(data.id || '');
        $('#marca_id').val(data.marca_id || '');
        $('#modelo_id').val(data.modelo_id || '');
        $('#capacidad_combustible').val(data.capacidad_combustible || '');
        $('#kilometraje_actual').val(data.kilometraje_actual || '');
        $('#kilometraje').val('').attr('data-anterior', data.kilometraje_actual || '');

        // Detectar ID del tipo aunque no venga del backend
        const tipoId = inferirTipoId(data);
        $('#tipo_combustible_id').val(tipoId);
        renderOpcionesCombustible(tipoId);

        // Última fecha/hora/km de abastecimiento
        $.ajax({
          url: '../../Controlador/Ctrl_Administrador/MySQL_Obtener_Ultima_Fecha.php',
          method: 'POST',
          data: { placa: placa },
          dataType: 'json',
          success: function (response) {
            ultimaFechaAbastecimiento        = response.ultima_fecha || null;
            ultimaHoraAbastecimiento         = response.ultima_hora || null;
            ultimoKilometrajeAbastecimiento  = parseInt(response.ultimo_kilometraje, 10);
            if (isNaN(ultimoKilometrajeAbastecimiento)) ultimoKilometrajeAbastecimiento = 0;
          },
          complete: function () {
            $('#kilometraje').prop('disabled', false);
          },
          error: function () {
            ultimaFechaAbastecimiento = null;
            ultimaHoraAbastecimiento  = null;
            ultimoKilometrajeAbastecimiento = 0;
            $('#kilometraje').prop('disabled', false);
          }
        });

      } else if (data && data.error === 'estado_invalido') {
        Swal.fire({
          icon: 'warning',
          title: 'Vehículo no disponible',
          text: `Estado del Vehículo: ${String(data.estado || '').toUpperCase()}` ,
          showConfirmButton: false,
          timer: 2000
        });
        limpiarCamposVehiculo();
      } else {
        Swal.fire({
          icon: 'error',
          title: 'Vehículo no encontrado',
          text: 'La placa ingresada no existe.',
          showConfirmButton: false,
          timer: 2000
        });
        limpiarCamposVehiculo();
      }
    });
  });

  // Re-render si otro script cambia el hidden tipo_combustible_id
  $('#tipo_combustible_id').on('change', function(){
    const tipoId = parseInt($(this).val() || '0', 10);
    renderOpcionesCombustible(tipoId);
  });

  // === FETCH CHOFER ===
  $('#dni').on('blur', function () {
    const dni = $(this).val().trim();
    if (!dni) return;

    $.getJSON(`../../Controlador/Utilidades/Fetch_Chofer.php?dni=${encodeURIComponent(dni)}&_ts=${Date.now()}`, function (data) {

      if (data && data.nombre_completo) {
        $('#nombre_chofer').val(data.nombre_completo);
        $('#chofer_id').val(data.id);
      } else if (data && data.error === 'estado_invalido') {
        Swal.fire({
          icon: 'warning',
          title: 'Conductor no disponible',
          text: `Estado del Conductor: ${String(data.estado || '').toUpperCase()}`,
          showConfirmButton: false,
          timer: 2000
        });
        limpiarCamposDNI();
      } else {
        Swal.fire({
          icon: 'error',
          title: 'Conductor no encontrado',
          text: 'El DNI ingresado no existe.',
          showConfirmButton: false,
          timer: 2000
        });
        limpiarCamposDNI();
      }
    });
  });

  // === NORMALIZAR Y VALIDAR CANTIDAD GLN (5 decimales) ===
  $('#cantidad_gln').on('blur change', function () {
    normalizeInputDecimals($(this), 5); // deja 5 decimales
    const capacidad = parseFloat($('#capacidad_combustible').val()) || 0;
    const cantidad  = parseFloat($(this).val()) || 0;
    if (capacidad > 0 && cantidad > capacidad) {
      Swal.fire({
        icon: 'warning',
        title: 'Cantidad inválida',
        text: `La cantidad ingresada (${cantidad}) excede la capacidad máxima del vehículo (${capacidad}).`,
        showConfirmButton: false,
        timer: 2000
      });
      $(this).val('').focus();
    }
  });

  // === NORMALIZAR VALOR UNITARIO (2 decimales) ===
  $('#valor_unitario_gln').on('blur change', function () {
    normalizeInputDecimals($(this), 2); // 2 decimales
  });

  // === VALIDAR KILOMETRAJE ===
  $('#kilometraje').on('blur change', function () {
    const kmIngresado = parseInt($(this).val(), 10) || 0;

    let kmValidar = 0;
    let textoReferencia = '';

    if (ultimoKilometrajeAbastecimiento > 0) {
      kmValidar = ultimoKilometrajeAbastecimiento;
      textoReferencia = `el último registrado en abastecimiento (${kmValidar} km)`;
    } else {
      const kmInicialVehiculo = parseInt($('#kilometraje_actual').val(), 10) || 0;

      if (kmInicialVehiculo === 0) {
        Swal.fire({
          icon: 'error',
          title: 'Error',
          text: 'No se pudo determinar el kilometraje inicial del vehículo. Verifica la información.',
          showConfirmButton: false,
          timer: 2000
        });
        $(this).val('').focus();
        return;
      }

      kmValidar = kmInicialVehiculo;
      textoReferencia = `el kilometraje inicial del vehículo (${kmValidar} km)`;
    }

    if (kmIngresado > 0 && kmIngresado <= kmValidar) {
      Swal.fire({
        icon: 'warning',
        title: 'Kilometraje inválido',
        text: `El kilometraje ingresado (${kmIngresado}) debe ser mayor que ${textoReferencia}.`,
        showConfirmButton: false,
        timer: 2000
      });
      $(this).val('').focus();
    }
  });

  // === VALIDAR FECHA ===
  $('#fecha_abastecimiento').on('blur', function () {
    const fechaIngresada = $(this).val();
    if (!fechaIngresada) return;

    if (ultimaFechaAbastecimiento && fechaIngresada < ultimaFechaAbastecimiento) {
      Swal.fire({
        icon: 'error',
        title: 'Fecha Incorrecta',
        text: 'La fecha ingresada es menor a la última registrada: ' + ultimaFechaAbastecimiento,
        showConfirmButton: false,
        timer: 2000
      });
      $(this).val('');
      $('#hora_abastecimiento').val('');
      return;
    }

    const hoy = new Date();
    hoy.setHours(0, 0, 0, 0);
    const fechaIngresadaDate = new Date(fechaIngresada + "T00:00:00");

    if (fechaIngresadaDate > hoy) {
      Swal.fire({
        icon: 'warning',
        title: 'Fecha inválida',
        text: 'La fecha ingresada no puede ser posterior a la fecha actual.',
        showConfirmButton: false,
        timer: 2000
      });
      $(this).val('');
      $('#hora_abastecimiento').val('');
    }
  });

  // === VALIDAR HORA ===
  $('#hora_abastecimiento').on('blur', function () {
    const fechaStr = $('#fecha_abastecimiento').val();
    const horaStr  = $(this).val();
    if (!horaStr) return;

    if (ultimaFechaAbastecimiento && fechaStr === ultimaFechaAbastecimiento) {
      if (ultimaHoraAbastecimiento && horaStr <= ultimaHoraAbastecimiento) {
        Swal.fire({
          icon: 'error',
          title: 'Hora Incorrecta',
          text: 'Para la fecha ' + ultimaFechaAbastecimiento +
                ', la hora ingresada debe ser mayor a la última registrada (' + ultimaHoraAbastecimiento + ').',
          showConfirmButton: false,
          timer: 2000
        });
        $(this).val('');
        return;
      }
    }

    const fechaHoraIngresada = new Date(`${fechaStr}T${horaStr}:00`);
    const ahora = new Date();

    if (fechaHoraIngresada > ahora) {
      Swal.fire({
        icon: 'warning',
        title: 'Hora inválida',
        text: 'La hora ingresada no puede ser posterior a la hora actual.',
        showConfirmButton: false,
        timer: 2000
      });
      $(this).val('');
    }
  });

  // === INPUT: N° VALE (permitir "/" y "-"; mayúsculas) ===
  $('#numero_vale').on('input', function () {
    this.value = this.value.toUpperCase().replace(/[^A-Z0-9\-\/]/g, '');
  });

  // === VALIDAR N° DE VALE (duplicados en tiempo real) ===
  $('#numero_vale').on('blur', function () {
    const numeroVale = $(this).val().trim();
    valeDuplicado = false; // reset
    if (!numeroVale) return;

    $.ajax({
      url: '../../Controlador/Ctrl_Administrador/checkVale.php',
      method: 'POST',
      data: { numero_vale: numeroVale },
      dataType: 'json',
      success: function (resp) {
        if (!resp.ok) {
          Swal.fire({
            icon: 'error',
            title: 'Error',
            text: resp.msg,
            timer: 2500,
            showConfirmButton: false
          });
          $('#numero_vale').val('').focus();
          valeDuplicado = true;
          return;
        }

        if (resp.duplicate) {
          Swal.fire({
            icon: 'warning',
            title: 'Vale duplicado',
            text: resp.msg,
            timer: 2500,
            showConfirmButton: false
          });
          $('#numero_vale').val('').focus();
          valeDuplicado = true;
        } else {
          valeDuplicado = false;
        }
      },
      error: function () {
        Swal.fire({
          icon: 'error',
          title: 'Error de conexión',
          text: 'No se pudo validar el N° de vale. Intente nuevamente.',
          timer: 2000,
          showConfirmButton: false
        });
        // ante error de red, prevenimos enviar hasta revalidar
        valeDuplicado = true;
      }
    });
  });

  // === BOTÓN REGISTRAR ===
  $('#btn-registrar').on('click', async function () {
    const campos = [
      { id: "placa", mensaje: "Ingrese la placa del vehículo.", regex: /^[A-Z0-9]{6,8}$/ },
      { id: "dni", mensaje: "Ingrese un DNI válido (8 dígitos).", regex: /^\d{8}$/ },
      { id: "grifo_id", mensaje: "Seleccione un grifo válido.", regex: /^\d+$/ },
      { id: "cantidad_gln", mensaje: "Ingrese una cantidad válida (hasta 5 decimales).", regex: /^\d+(\.\d{1,5})?$/ },
      { id: "valor_unitario_gln", mensaje: "Ingrese un valor válido (2 decimales).", regex: /^\d+(\.\d{1,2})?$/ },
      { id: "kilometraje", mensaje: "Ingrese un kilometraje válido.", regex: /^\d+$/ },
      { id: "numero_vale", mensaje: "Ingrese el número de vale (A-Z, 0-9, - y /).", regex: /^[A-Z0-9\-\/]{1,20}$/ },
      { id: "fecha_abastecimiento", mensaje: "Seleccione una fecha." },
      { id: "hora_abastecimiento", mensaje: "Seleccione una hora." }
    ];

    // Normalización previa (si el usuario no salió de los inputs)
    normalizeInputDecimals($('#cantidad_gln'), 5);
    normalizeInputDecimals($('#valor_unitario_gln'), 2);

    for (const campo of campos) {
      const $input = $('#' + campo.id);
      const valor = ($input.val() || '').trim();
      if (!valor || (campo.regex && !campo.regex.test(valor))) {
        await Swal.fire({ icon: 'warning', title: 'Campo obligatorio', text: campo.mensaje, showConfirmButton: false, timer: 2000 });
        $input.focus();
        return;
      }
    }

    // Bloqueo extra por vale duplicado (por si el usuario no salió del campo)
    if (valeDuplicado) {
      await Swal.fire({
        icon: 'error',
        title: 'N° de vale duplicado',
        text: 'Corrige el N° de vale antes de guardar.',
        showConfirmButton: false,
        timer: 2000
      });
      $('#numero_vale').focus();
      return;
    }

    const kmNuevo = parseInt($('#kilometraje').val(), 10) || 0;
    const kmActualVehiculo = parseInt($('#kilometraje_actual').val(), 10) || 0;

    const kmValidar = (ultimoKilometrajeAbastecimiento > 0)
      ? ultimoKilometrajeAbastecimiento
      : kmActualVehiculo;

    if (kmNuevo <= kmValidar) {
      await Swal.fire({
        icon: 'error',
        title: 'Error',
        text: `El kilometraje ingresado (${kmNuevo}) es menor o igual al último registrado (${kmValidar} km).`,
        showConfirmButton: false,
        timer: 2000
      });
      $('#kilometraje').val('').focus();
      return;
    }

    // ➕ Validar selección de combustible si el tipo es mixto
    const tipoId = parseInt($('#tipo_combustible_id').val() || '0', 10);
    if (MIXTOS[tipoId]) {
      const elegido = $('input[name="combustible_abastecido"]:checked').val();
      if (!elegido) {
        await Swal.fire({
          icon: 'warning',
          title: 'Falta seleccionar combustible',
          text: 'Selecciona el combustible realmente abastecido (incluye G-PREMIUM si corresponde).',
          showConfirmButton: false,
          timer: 2000
        });
        document.getElementById('grupo-combustible-abastecido')?.scrollIntoView({ behavior: 'smooth', block: 'center' });
        return;
      }
    }

    $('#Registrar_Abastecimiento')[0].submit();
  });

  // Botón borrar
  $('#btn-borrar').on('click', limpiarCampos);

  // --- Helpers limpiar ---
  function limpiarCamposVehiculo() {
    $('#placa, #tipo_vehiculo, #tipo_combustible, #marca_vehiculo, #modelo_vehiculo, #vehiculo_id, #marca_id, #modelo_id, #capacidad_combustible, #kilometraje').val('');
    $('#kilometraje').attr('data-anterior', '');
    $('#kilometraje_actual').val('');
    $('#tipo_combustible_id').val('0').trigger('change');
  }
  function limpiarCamposDNI() {
    $('#dni, #nombre_chofer, #chofer_id').val('');
  }
  function limpiarCampos() {
    $('#Registrar_Abastecimiento')[0].reset();
    $('#grifo_id').val('').trigger('change');
    $('#marca_vehiculo, #modelo_vehiculo, #tipo_vehiculo, #tipo_combustible, #capacidad_combustible, #kilometraje_actual, #nombre_chofer').val('');
    $('#vehiculo_id, #marca_id, #modelo_id, #chofer_id').val('');
    $('#tipo_combustible_id').val('0').trigger('change');
    $('#Registrar_Abastecimiento').find('.form-control, .form-select').removeClass('is-valid is-invalid');
    $('#Registrar_Abastecimiento').find('.invalid-feedback').hide().text('');
    valeDuplicado = false;
  }
});

// === NAVEGACIÓN CON ENTER ===
$('#Registrar_Abastecimiento').on('keypress', 'input, select', function (e) {
  if (e.which === 13) {
    e.preventDefault();
    const $inputs = $('#Registrar_Abastecimiento')
      .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();
    }
  }
});
