/* ESTADO DE LOS PEDIDOS
a = aperturado/abierto/activo/
b = preparacion
c = en camino
d = despachado/entregado/cerrado
z = anulado
*/

var Categorias = [];

var Productos = [];
var rolUsuarioActual = 0;
var mozoBloqueadoPorSesion = false;
var mozoSesionId = "";
var mozoSesionNombre = "";

// ─── STOCK RUNTIME COMPARTIDO ────────────────────────────────────────────────
// Clave: String(id_ins) para recetas, String(id_pres) para no-receta.
// Es la ÚNICA fuente de verdad de stock en caliente; todas las presentaciones
// que comparten un insumo leen desde aquí y se repintan juntas.
var StockRuntime = {};

/** Pobla StockRuntime desde el array Productos recién cargado del servidor. */
function buildStockRuntime(productos) {
  StockRuntime = {};
  (productos || []).forEach(function(p) {
    if (!p.Stock || p.Stock.crt_stock != 1 || !p.Stock.ingredientes) return;
    try {
      var ings = JSON.parse(p.Stock.ingredientes || '[]');
      ings.forEach(function(ing) {
        var key = String(ing.id_ins);
        if (!(key in StockRuntime)) {
          StockRuntime[key] = parseFloat(ing.stock_actual) || 0;
        }
      });
    } catch(e) {}
  });
}

/**
 * Devuelve las unidades ENTERAS vendibles de una presentación, leyendo desde
 * StockRuntime. Para recetas con varios ingredientes toma el mínimo real.
 * Siempre retorna Math.floor → nunca sobreestima.
 */
function getStockVendible(item) {
  if (!item.Stock || item.Stock.crt_stock != 1 || !item.Stock.ingredientes) return null;
  try {
    var ings = JSON.parse(item.Stock.ingredientes || '[]');
    if (!ings.length) return 0;
    if (item.Stock.receta == 1) {
      var minVendible = Infinity;
      for (var i = 0; i < ings.length; i++) {
        var ing = ings[i];
        var cant = parseFloat(ing.cant) || 0;
        if (cant <= 0) continue;
        var key = String(ing.id_ins);
        var stockBase = (key in StockRuntime) ? StockRuntime[key] : (parseFloat(ing.stock_actual) || 0);
        var vendible = Math.floor(stockBase / cant);
        if (vendible < minVendible) minVendible = vendible;
      }
      return minVendible === Infinity ? 0 : minVendible;
    } else {
      var ing0 = ings[0];
      var key0 = String(ing0.id_ins);
      var base = (key0 in StockRuntime) ? StockRuntime[key0] : (parseFloat(ing0.stock_actual) || 0);
      return Math.floor(base);
    }
  } catch(e) { return 0; }
}

/**
 * Actualiza StockRuntime según la operación ('restar'|'sumar') y repinta
 * TODAS las presentaciones que comparten alguno de los insumos afectados.
 */
function actualizarStockRuntime(item, qty, operacion) {
  if (!item.Stock || item.Stock.crt_stock != 1 || !item.Stock.ingredientes) return;
  try {
    var ings = JSON.parse(item.Stock.ingredientes || '[]');
    var keysAfectadas = [];
    var procesados = {}; // guard: evita doble-descuento si id_ins está duplicado en el JSON (bug SQL de JOIN cartesiano)
    ings.forEach(function(ing) {
      var key = String(ing.id_ins);
      if (procesados[key]) return; // mismo insumo ya procesado → skip
      procesados[key] = true;
      if (!(key in StockRuntime)) StockRuntime[key] = parseFloat(ing.stock_actual) || 0;
      var delta = item.Stock.receta == 1 ? (parseFloat(ing.cant) || 0) * qty : qty;
      if (operacion === 'restar') {
        StockRuntime[key] = Math.max(0, StockRuntime[key] - delta);
      } else {
        StockRuntime[key] += delta;
      }
      keysAfectadas.push(key);
    });
    repaintPresentacionesAfectadas(keysAfectadas);
  } catch(e) { console.warn('actualizarStockRuntime:', e); }
}

/** Repinta los badges de todas las presentaciones que usan alguno de los insumos dados. */
function repaintPresentacionesAfectadas(keysAfectadas) {
  var keySet = {};
  keysAfectadas.forEach(function(k) { keySet[String(k)] = true; });
  Productos.forEach(function(p) {
    if (!p.Stock || p.Stock.crt_stock != 1 || !p.Stock.ingredientes) return;
    try {
      var pIngs = JSON.parse(p.Stock.ingredientes || '[]');
      var afectado = pIngs.some(function(i) { return keySet[String(i.id_ins)]; });
      if (!afectado) return;
      $('.section-list .card-menu-wrapper').each(function() {
        var it = $(this).data('item');
        if (!it || it.id_pres !== p.id_pres) return;
        if ($(this).closest('.grid-view').length) {
          var $h = $(this).find('.card-menu-header');
          $h.find('.stock-badge').remove();
          $h.append(renderStockBadge(p));
        } else {
          var $c = $(this).find('.stock-container-list');
          $c.empty();
          $c.append(renderStockBadgeList(p));
        }
      });
    } catch(e) {}
  });
}

/**
 * Recorre TODOS los .card-menu-wrapper visibles en el DOM y repinta sus badges
 * desde StockRuntime (ya actualizado). Usar después de recargar Productos del servidor.
 */
function refrescarTodosLosBadgesVisibles() {
  $('.section-list .card-menu-wrapper').each(function() {
    var $wrap = $(this);
    var it = $wrap.data('item');
    if (!it || !it.Stock || it.Stock.crt_stock != 1) return;
    // Sincronizar el data("item") con el Productos global (ya fresco)
    var fresh = Productos.find(function(p) { return p.id_pres === it.id_pres; });
    var p = fresh || it;
    if (fresh) $wrap.data('item', fresh);
    if ($wrap.closest('.grid-view').length) {
      var $h = $wrap.find('.card-menu-header');
      $h.find('.stock-badge').remove();
      $h.append(renderStockBadge(p));
    } else {
      var $c = $wrap.find('.stock-container-list');
      $c.empty();
      $c.append(renderStockBadgeList(p));
    }
  });
}
// ─────────────────────────────────────────────────────────────────────────────

var selectedCategoryId = null;

var selectionMode = false;

var selectedProducts = [];

var pedidoSeleccionado = [];

function crearPedidoContextoBase() {
  return {
    tipoPedido: 0,
    idPedido: 0,
    idMesa: 0,
    mesa: "",
    salon: "",
    idSalon: 0,
    codSalonOrigen: 0,
    codMesaOrigen: 0,
  };
}

function buildMozoDisplayName(mozo) {
  return $.trim(
    `${mozo.nombres || ""} ${mozo.ape_paterno || ""} ${mozo.ape_materno || ""}`
  );
}

function inicializarEstadoMozoSesion() {
  rolUsuarioActual = parseInt($("#rol_usr").val() || "0", 10);
  mozoBloqueadoPorSesion = rolUsuarioActual === 5;
  mozoSesionId = ($("#usuario_actual_id").val() || "").toString();
  mozoSesionNombre = ($("#usuario_actual_nombre").val() || "").trim();
}

function isMozoSesionBloqueado() {
  if (!$("#rol_usr").length) return false;
  if (!mozoSesionId && !mozoSesionNombre && rolUsuarioActual === 0) {
    inicializarEstadoMozoSesion();
  }
  return mozoBloqueadoPorSesion && !!mozoSesionId;
}

function applyLockedMozoSelection() {
  if (!isMozoSesionBloqueado()) return;

  if ($("#select_mozo_input").length) {
    $("#select_mozo_input").val(mozoSesionId).prop("disabled", true);
  }

  if ($("#id_mozo").length) {
    $("#id_mozo").selectpicker("val", mozoSesionId);
    $("#id_mozo").attr("disabled", "true");
    $("#id_mozo").selectpicker("refresh");
  }
}

function getResponsableActualId() {
  var tipoPedidoActual = normalizarNumeroContexto($("#codtipoped").val());
  var usuarioActualId = ($("#usuario_actual_id").val() || "").toString();

  if (isMozoSesionBloqueado()) {
    return mozoSesionId || usuarioActualId;
  }

  if (tipoPedidoActual === 1) {
    return (
      ($("#select_mozo_input").val() || "").toString() ||
      ($("#id_mozo").val() || "").toString() ||
      usuarioActualId
    );
  }

  return usuarioActualId;
}

function getResponsableActualNombre() {
  var tipoPedidoActual = normalizarNumeroContexto($("#codtipoped").val());
  var usuarioActualNombre = ($("#usuario_actual_nombre").val() || "").trim();

  if (isMozoSesionBloqueado() && mozoSesionNombre) {
    return mozoSesionNombre;
  }

  if (tipoPedidoActual === 1) {
    var nombreSeleccionado = $.trim(
      ($("#select_mozo_input option:selected").text() || "").trim()
    );

    if (!nombreSeleccionado && $("#id_mozo").length) {
      nombreSeleccionado = $.trim(
        ($("#id_mozo option:selected").text() || "").trim()
      );
    }

    if (nombreSeleccionado) {
      return nombreSeleccionado;
    }
  }

  return usuarioActualNombre || ($("#dato_usuario").val() || "").trim();
}

var pedidoContextoActivo = crearPedidoContextoBase();

function limpiarTextoContexto(valor) {
  const texto = (valor == null ? "" : String(valor)).trim();
  if (!texto) return "";
  const lower = texto.toLowerCase();
  return lower === "undefined" || lower === "null" ? "" : texto;
}

function normalizarNumeroContexto(valor) {
  const numero = parseInt(valor, 10);
  return Number.isFinite(numero) ? numero : 0;
}

function construirTextoInfoMesa(contexto) {
  const salon = limpiarTextoContexto(contexto && contexto.salon);
  const mesa = limpiarTextoContexto(contexto && contexto.mesa);
  if (!salon && !mesa) return "";
  if (!salon) return `Mesa: ${mesa}`;
  if (!mesa) return salon;
  return `${salon} - Mesa: ${mesa}`;
}

function sincronizarPedidoContextoDOM() {
  const contexto = pedidoContextoActivo || crearPedidoContextoBase();

  $("#id_pedido").val(contexto.idPedido || 0);
  $(".id-mesa").val(contexto.idMesa || "");
  $("#salon").val(contexto.salon || "");
  $("#mesa").val(contexto.mesa || "");
  $("#codsalonorigen").val(contexto.codSalonOrigen || "");
  $("#codmesaorigen").val(contexto.codMesaOrigen || "");
  $("#info_mesa").text(construirTextoInfoMesa(contexto));
}

function setPedidoContexto(parcial) {
  const base = crearPedidoContextoBase();
  const previo = pedidoContextoActivo || base;
  const entrada = parcial || {};

  const contexto = {
    tipoPedido: normalizarNumeroContexto(
      entrada.tipoPedido != null ? entrada.tipoPedido : previo.tipoPedido
    ),
    idPedido: normalizarNumeroContexto(
      entrada.idPedido != null ? entrada.idPedido : previo.idPedido
    ),
    idMesa: normalizarNumeroContexto(
      entrada.idMesa != null ? entrada.idMesa : previo.idMesa
    ),
    mesa: limpiarTextoContexto(
      entrada.mesa != null ? entrada.mesa : previo.mesa
    ),
    salon: limpiarTextoContexto(
      entrada.salon != null ? entrada.salon : previo.salon
    ),
    idSalon: normalizarNumeroContexto(
      entrada.idSalon != null ? entrada.idSalon : previo.idSalon
    ),
    codSalonOrigen: normalizarNumeroContexto(
      entrada.codSalonOrigen != null
        ? entrada.codSalonOrigen
        : previo.codSalonOrigen
    ),
    codMesaOrigen: normalizarNumeroContexto(
      entrada.codMesaOrigen != null ? entrada.codMesaOrigen : previo.codMesaOrigen
    ),
  };

  if (contexto.tipoPedido !== 1) {
    contexto.idMesa = 0;
    contexto.mesa = "";
    contexto.salon = "";
    contexto.idSalon = 0;
    contexto.codSalonOrigen = 0;
    contexto.codMesaOrigen = 0;
  } else {
    if (!contexto.idSalon && contexto.codSalonOrigen) {
      contexto.idSalon = contexto.codSalonOrigen;
    }
    if (!contexto.codSalonOrigen && contexto.idSalon) {
      contexto.codSalonOrigen = contexto.idSalon;
    }
    if (!contexto.codMesaOrigen && contexto.idMesa) {
      contexto.codMesaOrigen = contexto.idMesa;
    }
  }

  pedidoContextoActivo = contexto;
  sincronizarPedidoContextoDOM();
  return pedidoContextoActivo;
}

function clearPedidoContexto() {
  pedidoContextoActivo = crearPedidoContextoBase();
  sincronizarPedidoContextoDOM();
}

function getPedidoContextoActual() {
  const contexto = {
    ...crearPedidoContextoBase(),
    ...(pedidoContextoActivo || {}),
  };

  if (!contexto.tipoPedido) {
    contexto.tipoPedido = normalizarNumeroContexto($("#codtipoped").val());
  }
  if (!contexto.idPedido) {
    contexto.idPedido = normalizarNumeroContexto($("#id_pedido").val());
  }
  if (!contexto.idMesa) {
    contexto.idMesa = normalizarNumeroContexto($(".id-mesa").val());
  }
  if (!contexto.mesa) {
    contexto.mesa = limpiarTextoContexto($("#mesa").val());
  }
  if (!contexto.salon) {
    contexto.salon = limpiarTextoContexto($("#salon").val());
  }
  if (!contexto.idSalon) {
    contexto.idSalon = normalizarNumeroContexto($("#codsalonorigen").val());
  }
  if (!contexto.codSalonOrigen) {
    contexto.codSalonOrigen = normalizarNumeroContexto($("#codsalonorigen").val());
  }
  if (!contexto.codMesaOrigen) {
    contexto.codMesaOrigen = normalizarNumeroContexto($("#codmesaorigen").val());
  }

  if (contexto.tipoPedido !== 1) {
    contexto.idMesa = 0;
    contexto.mesa = "";
    contexto.salon = "";
    contexto.idSalon = 0;
    contexto.codSalonOrigen = 0;
    contexto.codMesaOrigen = 0;
  }

  return contexto;
}

var modoListaProductos = "grid";

var TotalPedido = 0;

let isLoadingPedidos = false;
let ajaxListarPedidos = null;
let ajaxListarPedidosDetalle = null;

var mesaListXHR = null;
var mesaListTimeout = null;
var currentSalon = null;

var moneda = $("#moneda").val();

// Validador interno de imagenes de productos (con fallback silencioso).
const productoImagenCache = new Map();

function normalizarNombreImagenProducto(valor) {
  let raw = (valor == null ? "" : String(valor)).trim();
  if (!raw) return "default.png";

  const lower = raw.toLowerCase();
  if (lower === "null" || lower === "undefined") return "default.png";

  raw = raw.replace(/\\/g, "/").replace(/^\.?\//, "");
  raw = raw.replace(/^public\/images\/productos\//i, "");
  raw = raw.replace(/^images\/productos\//i, "");
  return raw || "default.png";
}

function construirUrlImagenProducto(valor) {
  const normalized = normalizarNombreImagenProducto(valor);
  if (/^https?:\/\//i.test(normalized)) return normalized;

  const base = ($("#url").val() || "").replace(/\/+$/, "") + "/";
  const encoded = normalized
    .split("/")
    .map((part) => encodeURIComponent(part))
    .join("/");
  return `${base}public/images/productos/${encoded}`;
}

function validarImagenesProductosEnSegundoPlano($scope) {
  const $root = $scope && $scope.length ? $scope : $(document);
  const base = ($("#url").val() || "").replace(/\/+$/, "") + "/";
  const fallbackPrincipal = construirUrlImagenProducto("default.png");
  const fallbackSecundario = `${base}public/images/default.png`;

  $root.find("img.js-product-img").each(function () {
    const img = this;
    if (img.dataset.validatorBound === "1") return;
    img.dataset.validatorBound = "1";

    const applyFallback = () => {
      const step = Number(img.dataset.fallbackStep || 0);
      if (step === 0) {
        img.dataset.fallbackStep = "1";
        img.src = fallbackPrincipal;
        return;
      }
      if (step === 1) {
        img.dataset.fallbackStep = "2";
        img.src = fallbackSecundario;
      }
    };

    img.addEventListener("error", applyFallback);

    const src = img.getAttribute("src") || "";
    if (!src) {
      applyFallback();
      return;
    }

    if (productoImagenCache.has(src)) {
      if (!productoImagenCache.get(src)) applyFallback();
      return;
    }

    // Validacion silenciosa en segundo plano.
    const probe = new Image();
    probe.onload = function () {
      productoImagenCache.set(src, true);
    };
    probe.onerror = function () {
      productoImagenCache.set(src, false);
      applyFallback();
    };
    probe.src = src;
  });
}

// Parser robusto para montos: tolera "S/ 16.00", comas y espacios.
function parseMontoSeguro(value) {
  if (value === null || value === undefined) return 0;
  let str = String(value).trim();
  if (!str) return 0;

  str = str.replace(/\s+/g, "");
  str = str.replace(/[^0-9,.-]/g, "");
  if (!str) return 0;

  const hasComma = str.indexOf(",") !== -1;
  const hasDot = str.indexOf(".") !== -1;

  if (hasComma && hasDot) {
    if (str.lastIndexOf(",") > str.lastIndexOf(".")) {
      str = str.replace(/\./g, "").replace(",", ".");
    } else {
      str = str.replace(/,/g, "");
    }
  } else if (hasComma && !hasDot) {
    str = str.replace(",", ".");
  }

  const num = parseFloat(str);
  return Number.isFinite(num) ? num : 0;
}

function getTotalPedidoActual() {
  let total = 0;
  let hasVisible = false;

  $(".totalPedidoMenosTarjeta").each(function () {
    if (!$(this).is(":visible")) return;
    hasVisible = true;
    const value = parseMontoSeguro($(this).text());
    if (value > 0) {
      total = value;
      return false;
    }
    if (!total) total = value;
  });

  if (!hasVisible) {
    const first = parseMontoSeguro($(".totalPedidoMenosTarjeta").first().text());
    if (first > 0) total = first;
  }

  if (total > 0) return total;

  const totalPedidoInput = parseMontoSeguro($(".totalPedido").first().val());
  if (totalPedidoInput > 0) return totalPedidoInput;

  const subtotal = parseMontoSeguro($(".SubtotalPedido").first().text());
  const descuento = parseMontoSeguro($(".totalDescuento").first().text());
  const delivery = parseMontoSeguro($("#comision_delivery").val()) ||
                   parseMontoSeguro($(".totalDelivery").first().text());
  const comision =
    getTipoPagoActual() === 2 && $(".comision_tarjeta_venta").is(":checked")
      ? parseMontoSeguro($(".comisionTarjeta").first().text())
      : 0;
  const recomputado = subtotal + delivery + comision - descuento;

  return recomputado > 0 ? recomputado : 0;
}

function getPagoInput(selector) {
  const $visible = $(`${selector}:visible`).first();
  if ($visible.length) return parseMontoSeguro($visible.val());
  return parseMontoSeguro($(selector).first().val());
}

function getComisionTarjetaActual() {
  if (!(getTipoPagoActual() === 2 && $(".comision_tarjeta_venta").is(":checked"))) {
    return 0;
  }
  return parseMontoSeguro($(".comisionTarjeta").first().text());
}

function getPorcentajeComisionTarjetaConfig() {
  const $config = $("#config_comision_tarjeta").first();
  if ($config.length) return parseMontoSeguro($config.val());

  // Fallback de compatibilidad para versiones anteriores.
  const $legacy = $("#comision_tarjeta").first();
  if ($legacy.length) return parseMontoSeguro($legacy.val());

  return 0;
}

function getTipoPagoActual() {
  const $tipoPago = $("#tipo_pago");
  if (!$tipoPago.length) return 1;

  const tipoDesdeValue = parseInt($tipoPago.val(), 10);
  return Number.isFinite(tipoDesdeValue) ? tipoDesdeValue : 1;
}

function actualizarVuelto() {
  const tipoPago = getTipoPagoActual();
  const total = getTotalPedidoActual();
  const pagoEfe = getPagoInput("#pago_efe");
  const pagoTar = getPagoInput("#pago_tar");
  const pagoYape = getPagoInput("#pago_yape");
  const pagoPlin = getPagoInput("#pago_plin");
  const pagoTran = getPagoInput("#pago_tran");
  const comision = getComisionTarjetaActual();
  const $vueltoSpan = $("#vuelto").parent();

  if (tipoPago === 3) {
    // MIXTO: mostrar cuánto falta por cubrir entre todos los medios ingresados.
    const totalIngresado = pagoEfe + pagoTar + pagoYape + pagoPlin + pagoTran + comision;
    const pendiente = total - totalIngresado;
    $("#vuelto").text(formatNumber(Math.max(0, pendiente)));
    $("#label-vuelto").text("PENDIENTE");
    $vueltoSpan.removeClass("text-info text-success text-danger");
    $vueltoSpan.addClass(pendiente <= 0.001 ? "text-success" : "text-danger");
    return;
  }

  // No-mixto: restaurar etiqueta y color originales.
  $("#label-vuelto").text("VUELTO");
  $vueltoSpan.removeClass("text-danger text-success").addClass("text-info");

  // Efectivo puro: vuelto = lo que dio el cliente menos el total.
  const saldoEfectivoPendiente = tipoPago === 1 ? total : 0;
  let vuelto = pagoEfe - saldoEfectivoPendiente;
  if (!Number.isFinite(vuelto) || vuelto < 0) vuelto = 0;
  $("#vuelto").text(formatNumber(vuelto));
}

$(function () {
  console.log(getPorcentajeComisionTarjetaConfig());
  inicializarEstadoMozoSesion();

  $("#button-open-modal-menu").on("click", function () {
    openModalTest();
  });
  moment.locale("es");
  mesa_list(1);
  tiempo_mesa();
  //setInterval(tiempo_mesa, 1000);
  tiempo_pedido();
  //setInterval(tiempo_pedido, 1000);
  tiempo_preparacion();
  //setInterval(tiempo_preparacion, 1000);
  //countNuevoPedidoDelivery();
  //setInterval(countNuevoPedidoDelivery, 10000);
  alert_pedidos_programados();
  //setInterval(alert_pedidos_programados, 50000);
  validarApertura();
  listarCategorias();

  // ── Stock fresco cada vez que se abre el panel de tomar pedido ──────────────
  // Cubre TODOS los puntos de entrada: nueva mesa, mesa existente, nuevo pedido
  $("#modal-super-test, #modal-sub-pedido").on("show.bs.modal", function () {
    getProductosByCategory().then(function () {
      // Si hay una categoría activa, re-renderizar con los datos frescos
      if (selectedCategoryId) {
        listarProductos(selectedCategoryId, modoListaProductos);
      }
      refrescarTodosLosBadgesVisibles();
    });
  });
  // ────────────────────────────────────────────────────────────────────────────

  document
    .querySelector(".section-category")
    .addEventListener("wheel", function (e) {
      if (e.deltaY !== 0) {
        e.preventDefault();
        this.scrollLeft += e.deltaY;
      }
    });

  let dataMozo = $("#mozos_data").val();
  dataMozo = JSON.parse(dataMozo);

  if (isMozoSesionBloqueado()) {
    dataMozo = dataMozo.filter(function (mozo) {
      return String(mozo.id_usu) === mozoSesionId;
    });

    if (!dataMozo.length) {
      dataMozo = [
        {
          id_usu: mozoSesionId,
          nombres: mozoSesionNombre,
          ape_paterno: "",
          ape_materno: "",
        },
      ];
    }
  }

  function cerrarModalSuperTest() {
    var $panel = $("#modal-super-test");
    if (!$panel.length) return;
    $panel.modal("hide");
    $(".modal-backdrop").remove();
  }

  $("#modal-super-test").on("hidden.bs.modal", function () {
    setMobileOrderPanel(false);
  });

  $("#btn_close_aside").on("click", function (e) {
    e.preventDefault();
    cerrarModalSuperTest();

    var $panel = $("#modal-super-test");

    // 1) Si es un modal de BS4, ciérralo
    if ($panel.hasClass("modal")) {
      $panel.modal("hide");
      // también quita el backdrop si queda alguno
      $(".modal-backdrop").remove();

      // 2) Si es un Collapse (offcanvas custom), ciérralo
    } else if ($panel.hasClass("collapse")) {
      $panel.collapse("hide");

      // 3) Fallback: quita clases manualmente
    } else {
      $panel.removeClass("show");
    }
  });

  $(document).on("click", "#btn_close_modal_mobile", function (e) {
    e.preventDefault();
    cerrarModalSuperTest();
  });

  $("#descuento_porcentaje").on("input", function () {
    let pct = parseFloat(this.value) || 0;
    if (pct < 0) pct = 0;
    if (pct > 100) pct = 100;
    // 3) Calculas el monto de descuento
    const monto = (TotalPedido * pct) / 100;
    // 4) Lo vuelcas donde quieras y haces tu log
    console.log(
      "TotalPedido:",
      TotalPedido,
      "– %:",
      pct,
      "– Descuento:",
      monto
    );
    $("#descuento_monto_fijo").val(monto.toFixed(2));
  });

  function sanitize($el) {
    let v = String($el.val() || "");

    // Solo números y punto
    v = v.replace(/[^\d.]/g, "");

    // Mantener solo el primer punto decimal
    const i = v.indexOf(".");
    if (i !== -1) v = v.slice(0, i + 1) + v.slice(i + 1).replace(/\./g, "");

    $el.val(v);
  }

  // Sanea mientras escribe
  $(document).on("input", ".decimal-only", function () {
    sanitize($(this));
  });

  // Sanea al pegar
  $(document).on("paste", ".decimal-only", function () {
    const $el = $(this);
    setTimeout(() => sanitize($el), 0);
  });

  // Evita arrastrar texto
  $(document).on("drop", ".decimal-only", function (e) {
    e.preventDefault();
  });

  // Bloquea exponentes/signos
  $(document).on("keydown", ".decimal-only", function (e) {
    if (["e", "E", "+", "-"].includes(e.key)) e.preventDefault();
  });

  // Normaliza al salir (quita punto final suelto)
  $(document).on("blur", ".decimal-only", function () {
    let v = this.value;
    if (v === ".") v = "0";
    if (v.endsWith(".")) v = v.slice(0, -1);
    this.value = v;
  });

  var parseMontoSeguro = function (valor) {
    if (valor === undefined || valor === null) return 0;
    return parseFloat(valor.toString().replace(/[^\d.-]/g, "")) || 0;
  };

  var obtenerTotalBasePedido = function () {
    var totalBase = parseMontoSeguro($(".totalPedido").val());

    if (!totalBase) {
      totalBase = parseMontoSeguro($(".totalPedido").first().text());
    }

    if (!totalBase) {
      totalBase = parseMontoSeguro($("#total_venta").val());
    }

    if (!totalBase) {
      var subtotal = parseMontoSeguro($(".SubtotalPedido").first().text());
      var delivery = parseMontoSeguro($(".totalDelivery").first().text());
      var descuento = parseMontoSeguro($(".totalDescuento").first().text());
      totalBase = subtotal + delivery - descuento;
    }

    if (!totalBase) {
      var totalMostrado = parseMontoSeguro(
        $(".totalPedidoMenosTarjeta").first().text()
      );
      var comisionMostrada = getComisionTarjetaActual();
      totalBase = totalMostrado - comisionMostrada;
    }

    return totalBase > 0 ? totalBase : 0;
  };

  $("#pago_tar").on("input", function () {
    let valor = parseFloat($(this).val()) || 0;
    let tipo_pago = getTipoPagoActual();
    let porcentaje_comision_tarjeta = getPorcentajeComisionTarjetaConfig();
    let comision_tarjeta_check = $(".comision_tarjeta_venta").is(":checked");
    let comision_tarjeta = 0;
    let totalPedidoBase = obtenerTotalBasePedido();

    if (
      tipo_pago === 3 &&
      porcentaje_comision_tarjeta > 0 &&
      comision_tarjeta_check
    ) {
      comision_tarjeta = valor * (porcentaje_comision_tarjeta / 100);
    }

    $(".comisionTarjeta").text(formatNumber(comision_tarjeta));
    $(".totalPedidoMenosTarjeta").text(
      formatNumber(totalPedidoBase + comision_tarjeta)
    );

    if (typeof calculo_efectivo === "function") {
      calculo_efectivo();
    }
  });

  $("#pago_efe, #pago_yape").on("input", function () {
    if (typeof calculo_efectivo === "function") {
      calculo_efectivo();
    }
  });

  const $select = $(
    '<select class="form-control" id="select_mozo_input" aria-label="Seleccionar mozo"></select>'
  );
  // Agregar las opciones
  dataMozo.forEach(function (mozo) {
    const nombre = buildMozoDisplayName(mozo);
    const $option = $("<option></option>").val(mozo.id_usu).text(nombre);
    $select.append($option);
  });

  // Insertar el select dentro del div
  $("#select_mozo").html($select);

  function syncMozoVisualFromLegacy() {
    if (isMozoSesionBloqueado()) {
      $("#select_mozo_input").val(mozoSesionId).prop("disabled", true);
      return;
    }
    const legacyVal = ($("#id_mozo").val() || "").toString();
    if (!legacyVal) return;
    $("#select_mozo_input").val(legacyVal);
  }

  function syncMozoLegacyFromVisual() {
    if (isMozoSesionBloqueado()) {
      applyLockedMozoSelection();
      return;
    }
    const visualVal = ($("#select_mozo_input").val() || "").toString();
    if (!visualVal) return;
    if ($("#id_mozo").length) {
      $("#id_mozo").selectpicker("val", visualVal);
    }
  }

  // Valor inicial sincronizado para evitar guardar mozo incorrecto.
  syncMozoVisualFromLegacy();
  applyLockedMozoSelection();

  // Cambio en UI nueva -> sincroniza campo legacy que persiste en BD.
  $("#select_mozo").on("change", "#select_mozo_input", function () {
    syncMozoLegacyFromVisual();
  });

  // Cambio en legacy (por lógica anterior) -> sincroniza UI nueva.
  $("#id_mozo").on("changed.bs.select change", function () {
    syncMozoVisualFromLegacy();
  });

  $("#btnActualizarDataDelivery").on("click", function (event) {
    event.preventDefault(); // Evitar redirección

    actualizarDataDelivery();
  });

  $("#btn_descuentos").on("click", function (event) {
    event.preventDefault(); // Evitar redirección
    actualizarPrecioDescuentos();
  });

  function getTipoDocumentoSeleccionado() {
    return Number($('input:radio[name="tipo_doc"]:checked').val() || 0);
  }

  function aplicarEstadoDescuentoModal(tipoRaw, options = {}) {
    const opts = {
      showAlerts: true,
      resetValuesOnNone: false,
      ...options,
    };

    const tipo = Number(tipoRaw || 0);
    const tipoDoc = getTipoDocumentoSeleccionado();

    const $rowMonto = $(".display-descuento-monto");
    const $rowPersonal = $(".display-personal");
    const $rowMotivo = $("#fila_motivo_descuento");
    const $personal = $("#personal_descuento");

    // Estado base
    $rowMonto.hide();
    $rowPersonal.hide();
    $rowMotivo.toggle(tipo !== 0);
    $("#descuento_porcentaje, #descuento_monto_fijo").prop("disabled", true);
    $personal.prop("disabled", true);

    if (tipo === 1 && (tipoDoc === 1 || tipoDoc === 2)) {
      if (opts.showAlerts) {
        mostrarAlerta(
          "warning",
          "Atención",
          "No se puede aplicar cortesía con boleta o factura."
        );
      }
      $("#tipo_descuento_select").val("0");
      return aplicarEstadoDescuentoModal(0, {
        showAlerts: false,
        resetValuesOnNone: true,
      });
    }

    if (tipo === 2) {
      $rowMonto.show();
      $("#descuento_porcentaje, #descuento_monto_fijo").prop("disabled", false);
      return true;
    }

    if (tipo === 3) {
      $rowMonto.show();
      $rowPersonal.show();
      $("#descuento_porcentaje, #descuento_monto_fijo").prop("disabled", false);
      $personal.prop("disabled", false);
      if (!$personal.children().length) {
        listarPersonal();
      }
      return true;
    }

    // Tipo 0 o fallback
    if (opts.resetValuesOnNone) {
      $("#descuento_porcentaje").val("");
      $("#descuento_monto_fijo").val("");
      $("#descuento_motivo").val("");
      $personal.val("");
    }

    $("#descuento_personal_hidden").val("0");
    $("#descuento_tipo_hidden").val("0");
    return true;
  }

  $("#tipo_descuento_select").on("change", function () {
    aplicarEstadoDescuentoModal($(this).val());
  });

  $("#input-buscar-carta").on("keyup", function () {
    const filtro = $(this).val().toLowerCase();
    const idCategoriaSeleccionada = $(
      ".list-categories .card-category.selected"
    ).data("id");

    if (filtro.trim().length > 0) {
      const resultados = Productos.filter((producto) => {
        return (
          producto.pro_nom.toLowerCase().includes(filtro) ||
          producto.pro_pre.toLowerCase().includes(filtro)
        );
      });

      generarProductos(resultados);
      return;
    }

    listarProductos(idCategoriaSeleccionada, modoListaProductos);
  });

  $(".change-mode button").on("click", function () {
    // marcar solo este botón como activo

    const idCategoriaSeleccionada = $(
      ".list-categories .card-category.selected"
    ).data("id");
    $(this)
      .addClass("btn-primary")
      .removeClass("btn-secondary")
      .siblings()
      .removeClass("btn-primary")
      .addClass("btn-secondary");

    // ver qué modo se pidió

    modoListaProductos = $(this).find(".fa-th").length ? "grid" : "list";

    listarProductos(idCategoriaSeleccionada, modoListaProductos);
  });

  $("#list-pedidos")
    .off("click", ".comment-list")
    .on("click", ".comment-list", function (e) {
      if (!selectionMode) return;

      e.stopImmediatePropagation();
      const $orderItemEl = $(this);
      const maxSelectableQty =
        parseInt($orderItemEl.attr("data-quantity"), 10) || 0;
      let selectedQty = parseInt($orderItemEl.attr("data-selected"), 10) || 0;
      const unitPrice = parseFloat($orderItemEl.attr("data-price")) || 0;

      // Toggle de selección
      if (selectedQty < maxSelectableQty) {
        selectedQty++;
        $orderItemEl.addClass("selected");
      } else {
        selectedQty = 0;
        $orderItemEl.removeClass("selected");
      }
      $orderItemEl.attr("data-selected", selectedQty);
      $orderItemEl
        .find(".selection-counter")
        .text(`${selectedQty}/${maxSelectableQty}`);

      // *** 1) Actualiza subtotal de ESTE ítem ***
      const itemSubtotal = selectedQty * unitPrice;
      $orderItemEl
        .find(".price")
        .text(`${moneda} ${formatNumber(itemSubtotal)}`);

      let totalSelectedSubtotal = 0;
      $("#list-pedidos .comment-list").each(function () {
        const cantidad = parseInt($(this).attr("data-selected"), 10) || 0;
        const precio = parseFloat($(this).attr("data-price")) || 0;
        totalSelectedSubtotal += cantidad * precio;
      });

      console.log(totalSelectedSubtotal);
      calcularTotalDividirCuenta(totalSelectedSubtotal);
    });

    $(document).on("input", "#numero_cliente", function () {
    const $this = $(this);
    const val = $this.val().trim();
    const len = val.length;

    if (len === 11) {
      $("#button-addon2").prop("disabled", false); // habilita el boton
    } else {
      $("#button-addon2").prop("disabled", true); // lo deshabilita si no tiene 11
    }

    showWspInlineFeedback("clear", "");
    updateWspStatusDot("idle");
  });

  //   $(document).on("click", ".agregar-precio", function (e) {
  //     e.stopPropagation(); // evita conflicto con el clic general

  //     const $btn  = $(this);
  //     const precio = $(this).data("precio");
  //     const id_pres = $(this).data("id_pres");
  //     const nombre_precio = $(this).data("price-name");
  //     const productoBase = $(this).data("producto");
  //     const $card = $btn.closest(".card-menu-wrapper").find(".card-menu");

  //     const producto = {
  //       ...productoBase,
  //       pro_cos: precio,
  //       id_pres: id_pres,
  //       nombre_precio : nombre_precio,
  //       cantidad: 1
  //     };

  //     if (producto.Stock && producto.Stock.crt_stock == 1 && producto.Stock.ingredientes) {

  //       if (tieneStockDisponible(producto)) {

  //         agregarProducto(producto);
  //         actualizarStockVisual($card[0], producto);
  //       } else {
  //         mostrarAlerta('warning', 'Sin stock disponible', 'No hay stock suficiente para agregar este producto.');
  //       }
  //     } else {
  //       agregarProducto(producto);
  //     }

  //     $btn.closest(".card-menu-wrapper").find(".content").slideUp("fast");

  //   });

  $(document).on("click", ".agregar-precio", function (e) {
    e.stopPropagation();

    const $btn = $(this);
    const precio = $btn.data("precio");
    const id_pres = $btn.data("id_pres");
    const nombre_precio = $btn.data("price-name");

    const productoBase = Productos.find((p) => p.id_pres == id_pres);

    if (!productoBase) {
      console.warn("Producto no encontrado para id_pres:", id_pres);
      return;
    }

    const producto = {
      ...productoBase,
      pro_cos: precio,
      id_pres: id_pres,
      nombre_precio: nombre_precio,
      cantidad: 1,
    };

    const $wrapper = $btn.closest(".card-menu-wrapper");

    //const $card = $btn.closest(".card-menu-wrapper").find(".card-menu");

    if (
      producto.Stock &&
      producto.Stock.crt_stock == 1 &&
      producto.Stock.ingredientes
    ) {
      if (tieneStockDisponible(producto)) {
        agregarProducto(producto);
        actualizarStockVisual($wrapper[0], producto);
        actualizarBadgeDelProducto(producto.id_pres); // 🔥 fuerza re-render del badge
      } else {
        mostrarAlerta(
          "warning",
          "Sin stock disponible",
          "No hay stock suficiente para agregar este producto."
        );
      }
    } else {
      agregarProducto(producto);
    }

    $btn.closest(".card-menu-wrapper").find(".content").slideUp("fast");
  });

  $(".list-categories").on("wheel", function (e) {
    e.preventDefault();
    this.scrollLeft += e.originalEvent.deltaY;
  });

  $(document).on("click", "#btn_registrar_pedido", function (e) {
    e.preventDefault();
    guardarPedido();
  });

  $("#pago_efe, #pago_tar, #pago_yape, #pago_plin, #pago_tran").on("input", calcularPagos);

  $(".por_consumo").on("click", function (e) {
    if ($(e.target).is("input")) {
      return;
    }

    if ($("#order-name-por_consumo").is(":visible")) {
      $("#input_por_consumo")
        .val($("#order-name-por_consumo").text().trim())
        .show()
        .focus()
        .select();
      $("#order-name-por_consumo").hide();
    }
  });

  $("#input_por_consumo").on("blur", function () {
    var nuevoTexto = $(this).val();
    $("#order-name-por_consumo").text(nuevoTexto).show();
    $(this).hide();
  });

  $("#input_por_consumo").on("keydown", function (e) {
    if (e.key === "Enter") {
      // o e.keyCode === 13
      e.preventDefault();
      $(this).blur();
    }
  });

  $(document).on("click", ".po-item .edit_precio", function (e) {
    e.stopPropagation();
    const permisoEditarPrecio = $("#permisoEditarPrecio").val() === "1";

    if (!permisoEditarPrecio) {
      mostrarAlerta(
        "warning",
        "sin permisos",
        "No tienes permiso para editar el precio"
      );
      return;
    }

    const $wrapper = $(this).closest(".po-item-wrapper");
    const product = $wrapper.data("item");
    const $priceSpan = $wrapper.find(".price");
    const oldPrice = parseFloat($priceSpan.text()) || 0;

    if ($wrapper.find(".price-edit-input").length) return;

    const $input = $(`
      <input
        type="number"
        class="price-edit-input form-control form-control-sm"
        style="width:80px; display:inline-block; margin-left:.5rem;"
        step="0.01"
        value="${oldPrice.toFixed(2)}"
      >
    `);

    $priceSpan.replaceWith($input);
    $input.focus().select();

    $input.on("blur keyup", function (evt) {
      if (evt.type === "blur" || evt.key === "Enter") {
        let nv = parseFloat($input.val());
        if (isNaN(nv) || nv < 0) nv = oldPrice;

        product.pro_cos = nv.toFixed(2);
        const $newSpan = $(`<span class="price">${nv.toFixed(2)}</span>`);
        $input.replaceWith($newSpan);

        actualizarTotalesDesdeLista();
      }
    });
  });

  $(document).on("click", ".po-item .comments", function (e) {
    e.stopPropagation();

    const $wrapper = $(this).closest(".po-item-wrapper");
    const product = $wrapper.data("item");
    const $content = $wrapper.find(".content");
    const $checkboxContainer = $wrapper.find(".nota-list .demo-checkbox");

    console.log(product);

    // 1) Calculamos aquí el array de notas originales (si existen)
    const notasOriginal =
      product.notas && product.notas.notas
        ? product.notas.notas
          .split(",")
          .map((n) => n.trim())
          .filter((n) => n)
        : [];

    $content.slideToggle("fast");
    if (!$content.is(":visible")) return;

    // 2) Inicialización de los checkboxes (sólo la primera vez)
    if (!$wrapper.data("initialized")) {
      $checkboxContainer.empty().addClass("row");

      notasOriginal.forEach((nota, idx) => {
        const cbId = `nota-${product.wrapperId}-${idx}`;
        const checked = (product.selectedNotas || []).includes(nota)
          ? "checked"
          : "";
        const html = `
          <div class="col-6 mb-2">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="${cbId}"
                     value="${nota}" ${checked}>
              <label class="form-check-label" for="${cbId}">${nota}</label>
            </div>
          </div>
        `;
        $checkboxContainer.append(html);
      });

      $wrapper.find(".nota-new").toggle(notasOriginal.length === 0);
      $wrapper.find(".nota-list").show();
      $wrapper.data("initialized", true);
    }

    // 3) Manejo de cambios en los checkboxes
    $checkboxContainer
      .off("change")
      .on("change", "input[type=checkbox]", function () {
        // recolectamos seleccionadas
        const seleccionadas = $checkboxContainer
          .find("input:checked")
          .map((i, el) => el.value.trim())
          .get();

        // guardamos en el producto
        product.selectedNotas = seleccionadas;

        // reconstruimos el texto intermedio: notas manuales + seleccionadas
        const $texto = $wrapper.find(".texto-intermedio");
        const actualTexto = $texto.text().trim();
        const manuales = actualTexto
          .split(",")
          .map((t) => t.trim())
          .filter((t) => t && !notasOriginal.includes(t));

        $texto.text([...manuales, ...seleccionadas].join(", "));
      });

    // 4) Al abrir siempre actualizamos el texto según lo guardado
    const prevSel = product.selectedNotas || [];
    const $texto = $wrapper.find(".texto-intermedio");
    const manuales = $texto
      .text()
      .split(",")
      .map((t) => t.trim())
      .filter((t) => t && !notasOriginal.includes(t));

    $texto.text([...manuales, ...prevSel].join(", "));
  });

  $(document).on("click", "#ver_seleccionados", function () {
    setMobileOrderPanel(true);
  });

  $(document).on("click", ".guardar-nota-manual", function () {
    const $clickedWrapper = $(this).closest(".po-item-wrapper");
    const nota = $clickedWrapper.find(".nota_manual_text").val().trim();
    const producto = $clickedWrapper.data("item");

    if (nota === "") {
      alert("Por favor escribe una nota antes de guardar.");
      return;
    }

    $.ajax({
      url: $("#url").val() + "venta/tags_crud",
      method: "POST",
      dataType: "json",
      data: {
        id_prod: producto.notas.id_prod,
        notas: nota.toUpperCase(),
      },
      success: function (response) {
        if (response.success) {
          const cleanNota = nota.toUpperCase();

          // ✅ ACTUALIZA LAS NOTAS EN EL OBJETO PRODUCTO
          producto.notas.notas = producto.notas.notas
            ? `${producto.notas.notas},${cleanNota}`
            : cleanNota;

          if (!Array.isArray(producto.selectedNotas)) {
            producto.selectedNotas = [];
          }

          if (!producto.selectedNotas.includes(cleanNota)) {
            producto.selectedNotas.push(cleanNota);
          }

          // Recorrer todos los productos con el mismo id_pres
          $(".po-item-wrapper").each(function () {
            const $wrapper = $(this);
            const item = $wrapper.data("item");

            if (item.id_pres === producto.id_pres) {
              const $checkboxContainer = $wrapper.find(
                ".nota-list .demo-checkbox"
              );
              const existeCheckbox =
                $checkboxContainer.find(`input[value="${cleanNota}"]`).length >
                0;

              if (!existeCheckbox) {
                const id = `nota-${item.id_pres}-${Date.now()}`;
                const checkboxHtml = `
                <div class="col-md-6 col-sm-12 mb-2">
                  <div class="form-check">
                    <input class="form-check-input checkk chk-col-light-green" type="checkbox" id="${id}" name="checks[]" value="${cleanNota}" checked>
                    <label class="form-check-label" for="${id}">${cleanNota}</label>
                  </div>
                </div>
              `;
                $checkboxContainer.append(checkboxHtml);
                $checkboxContainer.find(`#${id}`).trigger("change");

                if (!$checkboxContainer.data("change-registered")) {
                  $checkboxContainer.on(
                    "change",
                    "input[type='checkbox']",
                    function () {
                      const seleccionadas = $checkboxContainer
                        .find("input:checked")
                        .map(function () {
                          return $(this).val().trim();
                        })
                        .get();

                      const $texto = $wrapper.find(".texto-intermedio");
                      const actualTexto = $texto.text().trim();
                      const partes = actualTexto
                        .split(",")
                        .map((p) => p.trim())
                        .filter((p) => p !== "");

                      const todasLasOpciones = $checkboxContainer
                        .find("input[type='checkbox']")
                        .map(function () {
                          return $(this).val().trim();
                        })
                        .get();

                      const notasManual = partes.filter(
                        (n) => !todasLasOpciones.includes(n)
                      );
                      const combinado = [...notasManual, ...seleccionadas].join(
                        ", "
                      );
                      $texto.text(combinado);

                      $checkboxContainer.data("seleccionadas", seleccionadas);
                    }
                  );

                  $checkboxContainer.data("change-registered", true);
                }
              }
            }
          });

          // Limpiar campo de nota manual
          $clickedWrapper.find(".nota_manual_text").val("").focus();
          $clickedWrapper.find(".nota-new").hide();
        } else {
          mostrarAlerta("Error al guardar nota", "error");
        }
      },
      error: function () {
        mostrarAlerta("Error al conectar con el servidor", "error");
      },
    });
  });

  $(document).on("click", ".po-item .remove-item", function (e) {
    e.stopPropagation();
    var $wrapper = $(this).closest(".po-item-wrapper");
    var prod = $wrapper.data("item");

    if (prod) {
      if (!prod.isNew) {
        anularPedido(
          $("#id_pedido").val(),
          prod.id_pres,
          prod.cantidad,
          prod.pro_nom,
          prod.pro_pre,
          prod.fecha_pedido,
          prod.estado_pedido,
          $wrapper, // Pasar el elemento para eliminarlo después
          prod // Pasar los datos del producto
        );
      } else {
        reponerStockVisual(prod);
        $wrapper
          .find(".demo-checkbox")
          .removeData("initialized")
          .removeData("seleccionadas");
        $wrapper.remove();
        actualizarTotalesDesdeLista();
        actualizarContadorPedidos();
      }
    }
  });

  $(document).on("click", ".agregar-nota-manual", function () {
    const $wrapper = $(this).closest(".po-item-wrapper");
    const nota = $wrapper.find(".nota_manual_text").val().trim();

    if (nota !== "") {
      const $texto = $wrapper.find(".texto-intermedio");
      const actual = $texto.text().trim();

      const combinado = actual ? actual + ", " + nota : nota;

      $texto.text(combinado);
      $wrapper.find(".nota_manual_text").val("").focus();
    }
  });

  $("#form-nuevo-pedido").on("keydown", function (e) {
    //$('#input_por_consumo').blur();
    if (e.key === "Enter") {
      e.preventDefault();
      return false;
    }
  });

  $(document).on("click", ".cantidad .up", function () {
    var $count = $(this).prev();
    var count = parseInt($count.text());
    var $wrapper = $(this).closest(".po-item-wrapper");
    var prod = $wrapper.data("item");
    $count.text(count + 1);
    // Descuenta 1 unidad del insumo base y repinta todas las presentaciones afectadas
    if (prod && prod.Stock && prod.Stock.crt_stock == 1) {
      actualizarStockRuntime(prod, 1, 'restar');
    }
    actualizarTotalesDesdeLista();
  });

  $(document).on("click", ".cantidad .down", function () {
    var $count = $(this).next();
    var count = parseInt($count.text());
    var $wrapper = $(this).closest(".po-item-wrapper");
    var prod = $wrapper.data("item");
    if (count > 1) {
      $count.text(count - 1);
      // Repone 1 unidad al insumo base y repinta todas las presentaciones afectadas
      if (prod && prod.Stock && prod.Stock.crt_stock == 1) {
        actualizarStockRuntime(prod, 1, 'sumar');
      }
    }
    actualizarTotalesDesdeLista();
  });

  const pusher = new Pusher("01c14cdca26db19318e0", {
    cluster: "us2",
    forceTLS: true,
  });

  const channel = pusher.subscribe($("#pusher_channel").val());

  channel.bind("new-notification", async function (data) {
    try {
      mesa_list($("#id_salon").val());
      await getProductosByCategory(); // actualiza Productos + StockRuntime desde servidor
      listarProductos(selectedCategoryId, modoListaProductos); // re-renderiza categoría activa
      refrescarTodosLosBadgesVisibles(); // actualiza badges de TODAS las tarjetas visibles
    } catch (err) {
      console.error("Error actualizando tras la notificación:", err);
    }
  });

  // stock-update: otro terminal hizo una venta → recargar desde servidor y reconstruir runtime
  channel.bind("stock-update", async function () {
    try {
      await getProductosByCategory(); // actualiza Productos + StockRuntime desde servidor
      listarProductos(selectedCategoryId, modoListaProductos);
      refrescarTodosLosBadgesVisibles(); // actualiza badges de TODAS las tarjetas visibles
    } catch (err) {
      console.error("Error actualizando stock por Pusher:", err);
    }
  });

  $(".scroll_list_items_facturar").slimscroll({
    height: "100%",
  });
  var scroll_list_items_facturar = function () {
    var topOffset = 400;
    var height =
      (window.innerHeight > 0 ? window.innerHeight : this.screen.height) - 1;
    height = height - topOffset;
    $(".scroll_list_items_facturar").css("height", height + "px");
  };

  $(window).ready(scroll_list_items_facturar);
  $(window).on("resize", scroll_list_items_facturar);

  var parametro = getUrlParameter("cod");
  if (parametro !== undefined) {
    if (getUrlParameter("tip") == 3) {
      $("#codtipoped").val(3);
      listarPedidosDetalle(3, parametro, 0);
      activaTab("tabp-3");
      $("#form-nuevo-pedido").attr("action", "venta/pedido_create/pc3");
      if (getUrlParameter("est") == "a") {
        $("#codpestdelivery").val(1);
        activaTab("delivery01");
        delivery_list_a();
        editar_pedido(parametro);
      } else if (getUrlParameter("est") == "b") {
        activaTab("delivery02");
        delivery_list_b();
      } else if (getUrlParameter("est") == "c") {
        activaTab("delivery03");
        delivery_list_c();
      } else if (getUrlParameter("est") == "d") {
        activaTab("delivery04");
        delivery_list_d();
      }
      $(".display-estado-mesa").css("display", "none");
      $(".cont01-1").css("display", "none");
      $(".cont01-2").css("display", "block");
    } else if (getUrlParameter("tip") == 2) {
      activaTab("tabp-2");
      if (getUrlParameter("est") == "a") {
        $("#codtipoped").val(2);
        activaTab("mostrador01");
        mostrador_list_a();
        //listarPedidosDetalle(2,parametro,0);
      }
      $("#form-nuevo-pedido").attr("action", "venta/pedido_create/pc2");
      $(".display-estado-mesa").css("display", "none");
      $(".cont01-1").css("display", "none");
      $(".cont01-2").css("display", "block");
    }
  }
  $("#form-nuevo-pedido")
    .formValidation({
      framework: "bootstrap",
      excluded: ":disabled",
      fields: {},
    })
    .on("success.form.fv", function (e) {
      // Prevent form submission
      if ($("#codtipoped").val() == 3 && $("#cliente_id").val() == "") {
        Swal.fire(
          {
            title: "Advertencia",
            text: "Ingrese un cliente al pedido",
            icon: "warning",
            confirmButtonColor: "#34d16e",
            confirmButtonText: "Aceptar",
            allowOutsideClick: false,
            showCancelButton: false,
            showConfirmButton: true,
          },
          function () {
            return false;
          }
        );
        return false;
      } else {
        e.preventDefault();
        var $form = $(e.target);
        var fv = $form.data("formValidation");
        fv.defaultSubmit();
      }
    });
  $("#form-cambiar-mesa")
    .formValidation({
      framework: "bootstrap",
      excluded: ":disabled",
      fields: {},
    })
    .on("success.form.fv", function (e) {
      // Prevent form submission
      e.preventDefault();
      var $form = $(e.target);
      var fv = $form.data("formValidation");
      fv.defaultSubmit();
    });

  $(".opc-01").click(function () {
    $("#pago_efe").val($(".totalPedido").val());
    calculo_efectivo();
  });

  //   $('input[name="tipo_doc"]').on("change", function () {

  //     $tipo_descuento = $("#tipo_descuento_select").val();

  //     value = $('input:radio[name="tipo_doc"]:checked').val();

  //     console.log(value);

  //     if ((value == 2 || value == 1) && $tipo_descuento == 1) {
  //         mostrarAlerta(
  //             "warning",
  //             "Tipo de documento no permitido",
  //             "No se puede aplicar descuento cortesia para boletas o facturas"
  //         );
  //         $(`input[name="tipo_doc"][value="${3}"]`).prop('checked', true);
  //         return;
  //     }

  //     $("#cliente_tipo").val(value);
  //     $("#tipo_cliente").val(value);
  //     $("#id_cliente").val(1);
  //     // console.log(value)
  //     if (value == 3 || value == 1) {
  //       $("#cliente_id").val(1);
  //       $("#cliente_documento").val("");
  //       $("#buscar_cliente").val("DNI: 00000000 | PUBLICO EN GENERAL");
  //     } else {
  //       $("#cliente_id").val(1);
  //       $("#cliente_documento").val("");
  //       $("#buscar_cliente").val("");
  //     }
  //     $(".opcion-cliente").html(
  //       '<a class="input-group-prepend" href="javascript:void(0)"' +
  //         'onclick="nuevoClienteVista();" data-original-title="Registrar nuevo cliente" data-toggle="tooltip"' +
  //         'data-placement="top">' +
  //         '<span class="input-group-text bg-header">' +
  //         '<small><i class="fas fa-user-plus"></i></small>' +
  //         "</span>" +
  //         "</a>"
  //     );
  //   });

  $('input[name="tipo_doc"]').on("change", function () {
    const DEFAULT_TIPO_DOC = 3;

    const tipo_descuento = Number($("#tipo_descuento_select").val() || 0);
    let value = Number($('input[name="tipo_doc"]:checked').val() || 0);

    // Bloquea boleta/factura cuando hay cortesía
    if ((value === 1 || value === 2) && tipo_descuento === 1) {
      mostrarAlerta(
        "warning",
        "Tipo de documento no permitido",
        "No se puede aplicar descuento cortesía para boletas o facturas"
      );
      // Forzar selección a 3 y continuar con esa opción

      $(".btn-tipo-doc-2").removeClass("active");
      $(".btn-tipo-doc-1").removeClass("active");
      $(".btn-tipo-doc-3").addClass("active");
      $("input[name=tipo_doc][value='3']").attr("checked", true);
      return;
    }

    // Actualiza campos dependientes con el valor (posiblemente forzado a 3)
    $("#cliente_tipo").val(value);
    $("#tipo_cliente").val(value);
    $("#id_cliente, #cliente_id").val(1);
    $("#cliente_documento").val("");

    if (value === 1 || value === 3) {
      $("#buscar_cliente").val("DNI: 00000000 | PUBLICO EN GENERAL");
    } else {
      $("#buscar_cliente").val("");
    }

    $(".opcion-cliente").html(
      '<a class="input-group-prepend" href="javascript:void(0)" ' +
      'onclick="nuevoClienteVista();" data-original-title="Registrar nuevo cliente" ' +
      'data-toggle="tooltip" data-placement="top">' +
      '<span class="input-group-text bg-header"><small><i class="fas fa-user-plus"></i></small></span>' +
      "</a>"
    );
  });

  $("#form-mover-pedidos")
    .formValidation({
      framework: "bootstrap",
      excluded: ":disabled",
      fields: {},
    })
    .on("success.form.fv", function (e) {
      // Prevent form submission
      e.preventDefault();
      var $form = $(e.target);
      var fv = $form.data("formValidation");
      fv.defaultSubmit();
    });

  $("#form-editar-pedido")
    .formValidation({
      framework: "bootstrap",
      excluded: ":disabled",
      fields: {},
    })
    .on("success.form.fv", function (e) {
      e.preventDefault();
      var $form = $(e.target),
        fv = $form.data("formValidation");

      var id_repartidor =
        $("#id_repartidor_edit").val() == null
          ? "1"
          : $("#id_repartidor_edit").val();

      id_pedido = $("#id_pedido").val();
      hora_entrega = $("#hora_entrega_edit").val();
      id_repartidor = id_repartidor;
      amortizacion = $("#amortizacion").val();
      tipo_pago = $("#id_tipo_pago").val();
      paga_con = $("#paga_con").val();
      comision_delivery = $("#comision_delivery").val();

      $.ajax({
        dataType: "JSON",
        type: "POST",
        url: $("#url").val() + "venta/pedido_crud",
        data: {
          id_pedido: id_pedido,
          id_repartidor: id_repartidor,
          hora_entrega: hora_entrega,
          amortizacion: amortizacion,
          tipo_pago: tipo_pago,
          paga_con: paga_con,
          comision_delivery: comision_delivery,
        },
        success: function (cod) {
          $("#modal-editar-pedido").modal("hide");
          Swal.fire(
            {
              title: "Proceso Terminado",
              text: "Datos actualizados correctamente",
              icon: "success",
              confirmButtonColor: "#34d16e",
              confirmButtonText: "Aceptar",
              allowOutsideClick: false,
              showCancelButton: false,
              showConfirmButton: true,
            },
            function () {
              return false;
            }
          );
          delivery_list_a();
          delivery_list_b();
          listarPedidosDetalle(3, $("#id_pedido").val(), 0);
        },
        error: function (jqXHR, textStatus, errorThrown) {
          console.log(errorThrown + " " + textStatus);
        },
      });
      return false;
    });

  $("#btnDividirCuenta").on("click", function (event) {
    event.preventDefault();
    var id_pedido = $(this).data("id-pedido");
    var id_mesa = $(this).data("id-mesa");
  });

  $(".venta_por_consumo").on("click", function (event) {
    if ($(this).is(":checked")) {
      $("#venta_por_consumo").val("1");
      $(".lista-producto-facturar").hide();
      $(".lista-venta-por-consumo").show();
      $("#venta_por_consumo_concepto").focus();
      $("#venta_por_consumo_concepto").select();
      $("#static-list-pedidos").show();
      $(".scroll_pedidos").hide();
    } else {
      $("#venta_por_consumo").val("0");
      $("#static-list-pedidos").hide();
      $(".scroll_pedidos").show();
      $(".lista-producto-facturar").show();
      $(".lista-venta-por-consumo").hide();
    }
  });

  $(".comision_tarjeta_venta").on("click", function (event) {
    console.log("Comision Tarjeta Clicked");

    let tipoPagoActual = getTipoPagoActual();
    let comision_tarjeta = 0;
    let total_tarjeta = 0;
    let porcentaje_comision_tarjeta = getPorcentajeComisionTarjetaConfig();

    let subtotal = parseMontoSeguro($(".SubtotalPedido").first().text());
    let descuento = parseMontoSeguro($(".totalDescuento").first().text());
    let delivery = parseMontoSeguro($(".totalDelivery").first().text());
    let total = getTotalPedidoActual();

    console.log(porcentaje_comision_tarjeta);

    if ($(this).is(":checked")) {
      if (tipoPagoActual !== 2) {
        const $tipoPago = $("#tipo_pago");
        const $optTarjeta = $tipoPago.find("option[label='2']").first();
        if ($optTarjeta.length) {
          $tipoPago.val($optTarjeta.val());
        } else {
          $tipoPago.prop("selectedIndex", 1);
        }
        $tipoPago.trigger("change");
        tipoPagoActual = getTipoPagoActual();
      }

      if (
        isNaN(porcentaje_comision_tarjeta) ||
        porcentaje_comision_tarjeta <= 0
      ) {
        swal.fire({
          title: "Advertencia",
          text: "Ingrese un valor v\u00e1lido para la comisi\u00f3n de tarjeta o configure el porcentaje",
          icon: "warning",
          confirmButtonColor: "#34d16e",
          confirmButtonText: "Aceptar",
          allowOutsideClick: false,
          showCancelButton: false,
          showConfirmButton: true,
        });

        return;
      }

      porcentaje_comision_tarjeta = porcentaje_comision_tarjeta / 100;

      console.log(porcentaje_comision_tarjeta);

      comision_tarjeta = (subtotal - descuento) * porcentaje_comision_tarjeta;
      total_tarjeta = subtotal - descuento + delivery + comision_tarjeta;

      $(".comisionTarjeta").text(formatNumber(comision_tarjeta));
      $(".SubtotalPedido").text(formatNumber(subtotal));
      $(".totalDescuento").text(formatNumber(descuento));
      $(".totalDelivery").text(formatNumber(delivery));
      $(".totalPedidoMenosTarjeta").text(formatNumber(total_tarjeta));

      $(".view_comision_tarjeta").show();
      //$("#tipo_pago").prop("selectedIndex", 1).trigger("change");
    } else {
      total_tarjeta = subtotal - descuento + delivery;

      $("#tipo_pago").prop("selectedIndex", 0).trigger("change");
      $(".view_comision_tarjeta").hide();
      $(".comisionTarjeta").text(formatNumber(0));
      $(".SubtotalPedido").text(formatNumber(subtotal));
      $(".totalDescuento").text(formatNumber(descuento));
      $(".totalDelivery").text(formatNumber(delivery));
      $(".totalPedidoMenosTarjeta").text(formatNumber(total_tarjeta));
      $("#pago_efe").val(formatNumber(total_tarjeta));
    }
  });

  $("#tipo_pago").change(function () {
    var value = parseInt($(this).val(), 10) || 1;

    console.log(value);

    var setAutomaticSinglePaymentAmount = function (tipoPagoSeleccionado) {
      const totalActual = getTotalPedidoActual();
      limpiar_pagos_a();

      if (tipoPagoSeleccionado === 2) {
        $("#pago_tar").val(formatNumber(totalActual));
      } else if (tipoPagoSeleccionado === 5) {
        $("#pago_yape").val(formatNumber(totalActual));
      } else if (tipoPagoSeleccionado === 7) {
        $("#pago_tran").val(formatNumber(totalActual));
      } else if (tipoPagoSeleccionado === 8) {
        $("#pago_plin").val(formatNumber(totalActual));
      } else {
        // Fallback para otros pagos no mixtos que se registran como no-efectivo.
        $("#pago_tar").val(formatNumber(totalActual));
      }
    };


    if (value != 2) {
      $(".comision_tarjeta_venta").prop("checked", false);
      $(".view_comision_tarjeta").hide();
      $(".comisionTarjeta").text(formatNumber(0));
      const subtotalBase = parseMontoSeguro($(".SubtotalPedido").first().text());
      const descuentoBase = parseMontoSeguro($(".totalDescuento").first().text());
      const deliveryBase = parseMontoSeguro($(".totalDelivery").first().text());
      const totalSinComision = subtotalBase - descuentoBase + deliveryBase;
      $(".totalPedidoMenosTarjeta").text(formatNumber(totalSinComision));
      TotalPedido = totalSinComision;
    }

    if (value == 1) {

      limpiar_pagos_a();
      $(".mensaje-pago").hide();
      $(".display-pago-efectivo").show();
      $(".display-pago-tarjeta").hide();
      //$(".display-pago-default").show();
      $(".display-cod-voucher").hide();
      $(".display-pago-rapido-efectivo").show();
      $(".display-codigo-operacion").hide();
      $('#fast-cash-container').show(); // Show Fast Cash
      $("#label-voucher").text("COD OP");
      const totalActual = getTotalPedidoActual();
      $("#pago_efe").val(formatNumber(totalActual));
      $(".opc-01").text(formatNumber(totalActual));
      actualizarVuelto();

    } else if (value == 3) {

      limpiar_pagos_a();
      $(".mensaje-pago").hide();
      $(".display-pago-efectivo").show();
      $("#pago_tar, #pago_yape, #pago_plin, #pago_tran").each(function () {
        $(this).show();
        $(this).closest(".input-group").css("display", "flex");
      });
      //$(".display-pago-default").show();
      $(".display-cod-voucher").hide();
      $(".display-pago-rapido-efectivo").show();
      // FORCE HIDE CODIGO OPERACION (Duplicate Handler Fix)
      $('.display-codigo-operacion').each(function () {
        this.style.setProperty('display', 'none', 'important');
      });
      $('#fast-cash-container').show(); // Show Fast Cash
      $("#label-voucher").text("COD OP");

    } else if (value == 4) {
      setAutomaticSinglePaymentAmount(value);
      $(".mensaje-pago").hide();
      //$('.mensaje-pago-text').text(' Ingrese codigo de transferencia');
      $(".display-pago-efectivo").hide();
      $(".display-pago-tarjeta").hide();
      //$(".display-pago-default").hide();
      $(".display-cod-voucher").show();
      $(".display-pago-rapido-efectivo").hide();
      $(".display-codigo-operacion").show();
      $('#fast-cash-container').hide();
      $("#label-voucher").text("COD OP");

    } else if (value == 2) {
      setAutomaticSinglePaymentAmount(value);
      $(".mensaje-pago").hide();
      //$('.mensaje-pago-text').text(' Ingrese codigo de transferencia');
      $(".display-pago-efectivo").hide();
      $(".display-pago-tarjeta").hide();
      //$(".display-pago-default").hide();
      $(".display-cod-voucher").show();
      $(".display-pago-rapido-efectivo").hide();
      $(".display-codigo-operacion").show();
      $('#fast-cash-container').hide();
      $("#label-voucher").text("COD TARJETA");
    } else if (value >= 5) {
      setAutomaticSinglePaymentAmount(value);
      $(".mensaje-pago").hide();
      //$('.mensaje-pago-text').text(' Ingrese codigo de transferencia');
      $(".display-pago-efectivo").hide();
      $(".display-pago-tarjeta").hide();
      if (value === 5) {
        $("#label-voucher").text("COD YAPE");
      } else if (value === 7) {
        $("#label-voucher").text("COD TRANS");
      } else if (value === 8) {
        $("#label-voucher").text("COD PLIN");
      } else {
        $("#label-voucher").text("COD OP");
      }
      //$(".display-pago-default").hide();
      $(".display-cod-voucher").show();
      $(".display-pago-rapido-efectivo").hide();
      $(".display-codigo-operacion").show();
      $('#fast-cash-container').hide();
    }
    calculo_total();
    actualizarVuelto(); // actualizar etiqueta y display al cambiar tipo de pago
  });

  $("#buscar_cliente").autocomplete({
    delay: 4,
    autoFocus: true,
    source: function (request, response) {
      $.ajax({
        url: $("#url").val() + "venta/buscar_cliente",
        type: "post",
        dataType: "json",
        data: {
          cadena: request.term,
          tipo_cliente: $("#cliente_tipo").val(),
        },
        success: function (data) {
          console.log(data);

          // Si no hay data, devolvemos un arreglo vacío.
          if (!data) {
            response([]);
            return;
          }

          // Si data no es un arreglo, lo envolvemos en uno.
          if (!Array.isArray(data)) {
            data = [data];
          }

          // Mapear los items. Se valida la existencia de propiedades y se normaliza el nombre.
          var items = $.map(data, function (item) {
            if (!item) return; // Evita errores si item es null

            // Determina el prefijo según la existencia y valor de 'ruc' o el tipo de cliente.
            // Puedes ajustar la lógica si la validación depende de otras propiedades.
            var tipo_cli =
              typeof item.ruc !== "undefined" && item.ruc
                ? $("#tribAcr").val()
                : $("#diAcr").val();

            // Normalizamos el nombre: Si 'nombre' no existe, se intenta 'nombres', luego 'razonSocial'
            var nombre = item.nombre || item.nombres || item.razonSocial || "";

            return {
              id: item.id_cliente || "",
              dni: item.dni || "",
              ruc: item.ruc || "",
              tipo: item.tipo_cliente || "",
              nombres: nombre,
              fecha_n: item.fecha_nac || "",
              label:
                tipo_cli +
                ": " +
                (item.dni || "") +
                (item.ruc || "") +
                " | " +
                nombre,
              value:
                tipo_cli +
                ": " +
                (item.dni || "") +
                (item.ruc || "") +
                " | " +
                nombre,
            };
          });

          response(items);
        },
      });
    },
    select: function (e, ui) {
      $("#cliente_id").val(ui.item.id);
      $("#cliente_documento").val(ui.item.ruc);
      $(this).blur();
      $("#btn-submit-facturar").removeAttr("disabled").removeClass("disabled");
      $(".opcion-cliente").html(
        '<a class="input-group-prepend" href="javascript:void(0)" ' +
        'onclick="editar_cliente(' +
        ui.item.id +
        ');" data-original-title="Editar cliente" data-toggle="tooltip" ' +
        'data-placement="top">' +
        '<span class="input-group-text bg-header"><small><i class="fas fa-user text-info"></i></small></span>' +
        "</a>"
      );
    },
  });

  $("#buscar_cliente_pedido").autocomplete({
    delay: 4,
    autoFocus: true,
    appendTo: "#modal-super-test",
    source: function (request, response) {
      $.ajax({
        url: $("#url").val() + "venta/buscar_cliente",
        type: "post",
        dataType: "json",
        data: {
          cadena: request.term,
          tipo_cliente: $("#cliente_pedido_tipo").val(),
        },
        success: function (data) {
          console.log(data);

          // Si no hay data, devolvemos un arreglo vacío.
          if (!data || data.length === 0) {
            $("#cliente_pedido_id").val(0); // ← Aquí asignas 0 si no hay resultados
            response([]);
            return;
          }

          // Si data no es un arreglo, lo envolvemos en uno.
          if (!Array.isArray(data)) {
            data = [data];
          }

          // Mapear los items. Se valida la existencia de propiedades y se normaliza el nombre.
          var items = $.map(data, function (item) {
            if (!item) return; // Evita errores si item es null

            // Determina el prefijo según la existencia y valor de 'ruc' o el tipo de cliente.
            // Puedes ajustar la lógica si la validación depende de otras propiedades.
            var tipo_cli =
              typeof item.ruc !== "undefined" && item.ruc
                ? $("#tribAcr").val()
                : $("#diAcr").val();

            // Normalizamos el nombre: Si 'nombre' no existe, se intenta 'nombres', luego 'razonSocial'
            var nombre = item.nombre || item.nombres || item.razonSocial || "";

            return {
              id: item.id_cliente || "",
              dni: item.dni || "",
              ruc: item.ruc || "",
              tipo: item.tipo_cliente || "",
              nombres: nombre,
              fecha_n: item.fecha_nac || "",
              label:
                tipo_cli +
                ": " +
                (item.dni || "") +
                (item.ruc || "") +
                " | " +
                nombre,
              value:
                tipo_cli +
                ": " +
                (item.dni || "") +
                (item.ruc || "") +
                " | " +
                nombre,
            };
          });

          response(items);
        },
      });
    },
    select: function (e, ui) {
      $("#cliente_pedido_id").val(ui.item.id);
      $(this).blur();

      $(".opcion-cliente-pedido").html(
        '<a class="input-group-prepend" href="javascript:void(0)" ' +
        'onclick="editar_cliente(' +
        ui.item.id +
        ');" data-original-title="Editar cliente" data-toggle="tooltip" ' +
        'data-placement="top">' +
        '<span class="input-group-text bg-header"><small><i class="fas fa-user text-info"></i></small></span>' +
        "</a>"
      );
    },
  });

  //$("#buscar_cliente").autocomplete("option", "appendTo", ".form-facturar");

  $("#form-editar-venta-pago")
    .formValidation({
      framework: "bootstrap",
      excluded: ":disabled",
      fields: {},
    })
    .on("success.form.fv", function (e) {
      e.preventDefault();
      var $form = $(e.target),
        fv = $form.data("formValidation");

      tipo_pago = $("#id_venta_tipopago").val();
      id_venta = $("#id_venta").val();
      id_tipo_pago = $("#id_tipo_pago_v").val();

      $.ajax({
        dataType: "JSON",
        type: "POST",
        url: $("#url").val() + "venta/venta_edit_pago",
        data: {
          id_venta: id_venta,
          id_tipo_pago: id_tipo_pago,
          tipo_pago: tipo_pago,
        },
        success: function (cod) {
          if (!cod || cod.status !== "success") {
            Swal.fire({
              title: "No se pudo actualizar",
              text: (cod && cod.message) ? cod.message : "No se pudo editar el tipo de pago.",
              icon: "error",
              confirmButtonColor: "#34d16e",
              confirmButtonText: "Aceptar",
            });
            return;
          }

          $("#modal-editar-venta-pago").modal("hide");
          Swal.fire(
            {
              title: "Proceso Terminado",
              text: "Datos actualizados correctamente",
              icon: "success",
              confirmButtonColor: "#34d16e",
              confirmButtonText: "Aceptar",
              allowOutsideClick: false,
              showCancelButton: false,
              showConfirmButton: true,
            },
            function () {
              return false;
            }
          );
          delivery_list_c();
          listarPedidosDetalle(3, $("#id_pedido").val(), id_venta);
        },
        error: function (jqXHR, textStatus, errorThrown) {
          console.log(errorThrown + " " + textStatus);
        },
      });
      return false;
    });

  $("#telefono_cliente")
    .autocomplete({
      delay: 1,
      autoFocus: true,
      source: function (request, response) {
        $.ajax({
          url: $("#url").val() + "venta/buscar_cliente_telefono",
          type: "post",
          dataType: "json",
          data: {
            cadena: request.term,
          },
          success: function (data) {
            response(
              $.map(data, function (item) {
                tipo_cli =
                  item.tipo_cliente == 1
                    ? $("#diAcr").val()
                    : $("#tribAcr").val();
                // console.log(item)
                return {
                  id_cliente: item.id_cliente,
                  nombre: item.nombre,
                  telefono: item.telefono,
                  direccion: item.direccion,
                  referencia: item.referencia,
                  tipo_cliente: item.tipo_cliente,
                  ruc: item.ruc,
                  dni: item.dni,
                  //label: tipo_cli+': '+item.dni+''+item.ruc,
                  value: item.telefono,
                };
              })
            );
          },
        });
      },
      select: function (e, ui) {
        //$("#documento_cliente").val('');
        $("#cliente_id").val(ui.item.id_cliente);
        /////////////////////////////////////////////
        $(".display-nombre").css("display", "block");
        //$('.display-telefono-cliente').css('display','block');
        $("#nomb_cliente").removeAttr("disabled");
        //$("#telefono_cliente").removeAttr('disabled');
        /////////////////////////////////////////
        if ($("input:radio[name=tipo_entrega]:checked").val() == 1) {
          $(".display-direccion-cliente").css("display", "block");
          $(".display-referencia-cliente").css("display", "block");
          $(".display-repartidor").css("display", "block");
          $("#direccion_cliente").removeAttr("disabled");
          $("#referencia_cliente").removeAttr("disabled");
          $("#id_repartidor").removeAttr("disabled");
        } else {
          $(".display-direccion-cliente").css("display", "none");
          $(".display-referencia-cliente").css("display", "none");
          $(".display-repartidor").css("display", "none");
          $("#direccion_cliente").attr("disabled", "true");
          $("#referencia_cliente").attr("disabled", "true");
          $("#id_repartidor").attr("disabled", "true");
        }
        ////////////////////////////////////////////
        $("#telefono_cliente").val(ui.item.telefono);
        $("#nomb_cliente").val(ui.item.nombre);
        $("#nomb_cliente").val(ui.item.nombre);
        $("#direccion_cliente").val(ui.item.direccion);
        $("#referencia_cliente").val(ui.item.referencia);

        $("#num_cliente").val(
          ui.item.tipo_cliente == 1 ? ui.item.dni : ui.item.ruc
        );
        $("#id_tdoc").selectpicker("val", ui.item.tipo_cliente);
        $("#id_tdoc").selectpicker("refresh");

        $("#form-nuevo-pedido").formValidation(
          "revalidateField",
          "telefono_cliente"
        );
        $("#form-nuevo-pedido").formValidation(
          "revalidateField",
          "nomb_cliente"
        );
        $("#form-nuevo-pedido").formValidation(
          "revalidateField",
          "direccion_cliente"
        );
        $("#form-nuevo-pedido").formValidation(
          "revalidateField",
          "referencia_cliente"
        );
        //$('.btn-opc-nuevo-cliente').html('<button class="btn btn-info" onclick="editar_cliente('+ui.item.id_cliente+');" type="button"><i class="fa fa-user"></i></button>');
      },
      change: function (e, ui) {
        $("#documento_cliente").val("");
      },
    })
    .autocomplete("instance")._renderItem = function (ul, item) {
      return $("<li class='ui-menu-item'></li>")
        .data("item.autocomplete", item)
        .append(
          "<div class='ui-menu-item-wrapper'>" +
          item.nombre +
          "<br>Telefono/Celular: " +
          item.telefono +
          "</div>"
        )
        .appendTo(ul);
    };


  /*
    var minlength = 1;
    $("#telefono_cliente").keyup(function () {
        var that = this,
        value = $(this).val();
        if (value.length < minlength ) {
            //$("#cliente_id").val('');
            //////////////////////////////////////////////
            //$('.display-nombre').css('display','none');
            //$('.display-telefono-cliente').css('display','none');
            //$('.display-direccion-cliente').css('display','none');
            //$('.display-referencia-cliente').css('display','none');
            //$('.display-repartidor').css('display','none');
            //$("#nomb_cliente").attr('disabled','true');
            //$("#telefono_cliente").attr('disabled','true');
            //$("#direccion_cliente").attr('disabled','true');
            //$("#referencia_cliente").attr('disabled','true');
            $('#id_repartidor').selectpicker('refresh');
            $('#id_repartidor').selectpicker('val', '');
            $('#form-nuevo-pedido').formValidation('revalidateField', 'id_repartidor');
            ////////////////////////////////////////////
            $("#telefono_cliente").val('');
            $("#nomb_cliente").val('');
            $("#direccion_cliente").val('');
            $("#referencia_cliente").val('');
            $('#form-nuevo-pedido').formValidation('revalidateField', 'telefono_cliente');
            $('#form-nuevo-pedido').formValidation('revalidateField', 'nomb_cliente');
            $('#form-nuevo-pedido').formValidation('revalidateField', 'direccion_cliente');
            $('#form-nuevo-pedido').formValidation('revalidateField', 'referencia_cliente');
            //$('.btn-opc-nuevo-cliente').html('<button class="btn btn-secondary" onclick="nuevo_cliente();" type="button"><i class="fa fa-user-plus"></i></button>');
        }
    });
    */
});

function closeModalOrder() {
  setMobileOrderPanel(false);
}

function setMobileOrderPanel(showRight) {
  if (!esDispositivoMovil()) return;

  var $modal = $("#modal-super-test");
  if (!$modal.length) return;

  var $rightPanel = $modal.find(".modal-order-right");

  if (showRight) {
    $modal.addClass("mobile-order-right-open");
    $rightPanel.css("display", "block");
  } else {
    $modal.removeClass("mobile-order-right-open");
    $rightPanel.css("display", "none");
  }
}

var mesa_list = function (cod) {
  // 🔥 Si ya está mostrando este salón, no hacer nada
  if (currentSalon === cod && mesaListXHR !== null) {
    console.log("Ya mostrando este salón, ignorando...");
    return;
  }

  console.log("mesa list - Solicitado para salón:", cod);
  currentSalon = cod;

  // Cancelar timeout anterior
  if (mesaListTimeout !== null) {
    clearTimeout(mesaListTimeout);
  }

  // Debounce para clicks rápidos entre tabs
  mesaListTimeout = setTimeout(function () {
    // Cancelar petición anterior
    if (mesaListXHR !== null) {
      mesaListXHR.abort();
    }

    $("#id_salon").val(cod);

    // Mostrar loading solo si el contenido está vacío
    if ($(".list-mesas").is(":empty")) {
      $(".list-mesas").html(`
        <div class="text-center p-3">
          <i class="fa fa-spinner fa-spin"></i>
          <small>Cargando mesas...</small>
        </div>
      `);
    }

    mesaListXHR = $.ajax({
      dataType: "JSON",
      type: "POST",
      url: $("#url").val() + "venta/mesa_list",
      data: { id_salon: cod }, // 🔥 Asegurar que se envía el salón correcto
      success: function (item) {
        // 🔥 VERIFICAR que todavía estamos en el mismo salón
        if (currentSalon !== cod) {
          console.log("Salón cambió durante la carga, ignorando respuesta");
          return;
        }

        $(".list-mesas").empty();

        var count = 0,
          count_disponibles = 0,
          count_ocupadas = 0,
          count_pagos = 0;

        $.each(item["mesa"], function (i, mesa) {
          x = mesa.estado == "a" ? count_disponibles++ : "NINGUNO";
          y = mesa.estado == "p" ? count_pagos++ : "NINGUNO";
          z = mesa.estado == "i" ? count_ocupadas++ : "NINGUNO";

          forma = mesa.forma == 1 ? "" : "rounded-circle";

          if ($("#rol_usr").val() == 5) {
            if (mesa.id_salon == cod && mesa.estado == "a") {
              $(".list-mesas").append(
                $(
                  '<button class="btn btn-green ' +
                  forma +
                  ' dim btn-large-dim"' +
                  'onclick="registrarMesa(' +
                  mesa.id_mesa +
                  ",'" +
                  mesa.nro_mesa +
                  "','" +
                  mesa.desc_salon +
                  "');\">" +
                  mesa.nro_mesa +
                  '<br><img src="public/images/table_empty.png" width="40px" height="40px" class="hidden-sm-down"/><input type="radio" autocomplete="off"></button>'
                )
              );
            } else if (mesa.id_salon == cod && mesa.estado == "p") {
              $(".list-mesas");
              $(".list-mesas").append(
                $(
                  '<input type="hidden" name="tiempo_mesa[]" value="' +
                  mesa.fecha_pedido +
                  '"/>' +
                  '<button class="btn btn-blue ' +
                  forma +
                  ' dim btn-large-dim"' +
                  'onclick="orden(' +
                  mesa.id_pedido +
                  ",'" +
                  mesa.nro_mesa +
                  "','" +
                  mesa.desc_salon +
                  "'," +
                  mesa.id_mesa +
                  "," +
                  mesa.id_salon +
                  ')">' +
                  '<span class="span-a"><i class="far fa-user"></i> ' +
                  mesa.nro_personas +
                  "</span><span>" +
                  mesa.nro_mesa +
                  '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
                  '<span class="span-b"><i class="ti-timer"></i>&nbsp;<span class="hora-mesa' +
                  count++ +
                  '">' +
                  moment(mesa.fecha_pedido).fromNow(true) +
                  '</span></span><input type="radio" autocomplete="off"></button>'
                )
              );
            } else if (mesa.id_salon == cod && mesa.estado == "i") {
              const $listMesas = $(".list-mesas");

              // Desestructura los valores que necesitas
              const {
                fecha_pedido,
                id_pedido,
                nro_personas,
                nro_mesa,
                desc_salon,
              } = mesa;

              // Genera la clase única y el texto "hace X" de Moment.js
              const timerClass = `hora-mesa${count++}`;
              const timeAgo = moment(fecha_pedido).fromNow(true);

              // Construye el <input hidden>
              const hiddenInput = `
              <input 
                type="hidden" 
                name="tiempo_mesa[]" 
                value="${fecha_pedido}"
              />
            `;

              // Construye el <button> completo
              const button = `
              <button
                class="btn btn-reed ${forma} dim btn-large-dim"
                onclick="orden(${id_pedido}, '${nro_mesa}', '${desc_salon}', ${mesa.id_mesa}, ${mesa.id_salon});"
              >
                <span class="span-a">
                  <i class="far fa-user"></i>
                  ${nro_personas}
                </span>
                <span>${nro_mesa}</span>
                <br/>
                <img
                  src="public/images/table_full.png"
                  width="40"
                  height="40"
                  class="hidden-sm-down"
                />
                <span class="span-b">
                  <i class="ti-timer"></i>
                  &nbsp;<span class="${timerClass}">${timeAgo}</span>
                </span>
                <input type="radio" autocomplete="off"/>
              </button>
            `;

              // Finalmente lo añade al DOM
              $listMesas.append($(hiddenInput + button));
            }
          } else {
            if (mesa.id_salon == cod && mesa.estado == "a") {
              $(".list-mesas").append(
                $(
                  '<button class="btn btn-green ' +
                  forma +
                  ' dim btn-large-dim"' +
                  'onclick="nuevoPedidoMesa(' +
                  mesa.id_mesa +
                  ",'" +
                  mesa.nro_mesa +
                  "','" +
                  mesa.desc_salon +
                  "')\">" +
                  mesa.nro_mesa +
                  '<br><img src="public/images/table_empty.png" width="40px" height="40px" class="hidden-sm-down"/><input type="radio" autocomplete="off"></button>'
                )
              );
            } else if (mesa.id_salon == cod && mesa.estado == "p") {
              $(".list-mesas");
              $(".list-mesas").append(
                $(
                  '<input type="hidden" name="tiempo_mesa[]" value="' +
                  mesa.fecha_pedido +
                  '"/>' +
                  '<button class="btn btn-blue ' +
                  forma +
                  ' dim btn-large-dim"' +
                  'onclick="listarPedidos(' +
                  mesa.id_salon +
                  "," +
                  mesa.id_mesa +
                  ",1," +
                  mesa.id_pedido +
                  ",'" +
                  mesa.nro_mesa +
                  "','" +
                  mesa.desc_salon +
                  "','" +
                  mesa.estado +
                  "')\">" +
                  '<span class="span-a"><i class="far fa-user"></i> ' +
                  mesa.nro_personas +
                  "</span><span>" +
                  mesa.nro_mesa +
                  '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
                  '<span class="span-b"><i class="ti-timer"></i> <span class="hora-mesa' +
                  count++ +
                  '">' +
                  moment(mesa.fecha_pedido).fromNow(true) +
                  '</span></span><input type="radio" autocomplete="off"></button>'
                )
              );
            } else if (mesa.id_salon == cod && mesa.estado == "i") {
              $(".list-mesas").append(
                $(
                  '<input type="hidden" name="tiempo_mesa[]" value="' +
                  mesa.fecha_pedido +
                  '"/>' +
                  '<button class="btn btn-reed ' +
                  forma +
                  ' dim btn-large-dim"' +
                  'onclick="listarPedidos(' +
                  mesa.id_salon +
                  "," +
                  mesa.id_mesa +
                  ",1," +
                  mesa.id_pedido +
                  ",'" +
                  mesa.nro_mesa +
                  "','" +
                  mesa.desc_salon +
                  "','" +
                  mesa.estado +
                  "')\">" +
                  '<span class="span-a"><i class="far fa-user"></i> ' +
                  mesa.nro_personas +
                  "</span><span>" +
                  mesa.nro_mesa +
                  '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
                  '<span class="span-b"><i class="ti-timer"></i> <span class="hora-mesa' +
                  count++ +
                  '">' +
                  moment(mesa.fecha_pedido).fromNow(true) +
                  '</span></span><input type="radio" autocomplete="off"></button>'
                )
              );
            }
          }
          console.log(mesa.id_salon);
        });
        $(".mesas-disponibles").attr(
          "data-original-title",
          count_disponibles + " mesas disponibles"
        );
        $("#mesa_libre").text(count_disponibles);
        $(".mesas-ocupadas").attr(
          "data-original-title",
          count_ocupadas + " mesas ocupadas"
        );
        $("#mesa_ocupada").text(count_ocupadas);
        $(".mesas-pago").attr(
          "data-original-title",
          count_pagos + " mesas en proceso de pago"
        );
        $("#mesa_proceso").text(count_pagos);
      },
      error: function (xhr, status, error) {
        if (status !== "abort" && currentSalon === cod) {
          console.error("Error cargando mesas:", error);
          $(".list-mesas").html(`
            <div class="text-center p-3 text-warning">
              <small>No se pudieron cargar las mesas</small>
            </div>
          `);
        }
      },
      complete: function () {
        mesaListXHR = null;
      },
    });
  }, 100); // 🔥 Debounce reducido a 100ms para mejor UX
};

// var mesa_list = function (cod) {
//   console.log("mesa list");

//   $("#id_salon").val(cod);

//   $(".list-mesas").empty();

//   $.ajax({
//     dataType: "JSON",
//     type: "POST",
//     url: $("#url").val() + "venta/mesa_list",
//     success: function (item) {
//       var count = 0,
//         count_disponibles = 0,
//         count_ocupadas = 0,
//         count_pagos = 0;

//       $.each(item["mesa"], function (i, mesa) {
//         x = mesa.estado == "a" ? count_disponibles++ : "NINGUNO";
//         y = mesa.estado == "p" ? count_pagos++ : "NINGUNO";
//         z = mesa.estado == "i" ? count_ocupadas++ : "NINGUNO";

//         forma = mesa.forma == 1 ? "" : "rounded-circle";

//         if ($("#rol_usr").val() == 5) {
//           if (mesa.id_salon == cod && mesa.estado == "a") {
//             $(".list-mesas").append(
//               $(
//                 '<button class="btn btn-green ' +
//                   forma +
//                   ' dim btn-large-dim"' +
//                   'onclick="registrarMesa(' +
//                   mesa.id_mesa +
//                   ",'" +
//                   mesa.nro_mesa +
//                   "','" +
//                   mesa.desc_salon +
//                   "');\">" +
//                   mesa.nro_mesa +
//                   '<br><img src="public/images/table_empty.png" width="40px" height="40px" class="hidden-sm-down"/><input type="radio" autocomplete="off"></button>'
//               )
//             );
//           } else if (mesa.id_salon == cod && mesa.estado == "p") {
//             $(".list-mesas");
//             $(".list-mesas").append(
//               $(
//                 '<input type="hidden" name="tiempo_mesa[]" value="' +
//                   mesa.fecha_pedido +
//                   '"/>' +
//                   '<button class="btn btn-blue ' +
//                   forma +
//                   ' dim btn-large-dim"' +
//                   'onclick="orden(' +
//                   mesa.id_pedido +
//                   ')">' +
//                   '<span class="span-a"><i class="far fa-user"></i> ' +
//                   mesa.nro_personas +
//                   "</span><span>" +
//                   mesa.nro_mesa +
//                   '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
//                   '<span class="span-b"><i class="ti-timer"></i>&nbsp;<span class="hora-mesa' +
//                   count++ +
//                   '">' +
//                   moment(mesa.fecha_pedido).fromNow(true) +
//                   '</span></span><input type="radio" autocomplete="off"></button>'
//               )
//             );
//           } else if (mesa.id_salon == cod && mesa.estado == "i") {
//             const $listMesas = $(".list-mesas");

//             // Desestructura los valores que necesitas
//             const {
//               fecha_pedido,
//               id_pedido,
//               nro_personas,
//               nro_mesa,
//               desc_salon,
//             } = mesa;

//             // Genera la clase única y el texto "hace X" de Moment.js
//             const timerClass = `hora-mesa${count++}`;
//             const timeAgo = moment(fecha_pedido).fromNow(true);

//             // Construye el <input hidden>
//             const hiddenInput = `
//               <input
//                 type="hidden"
//                 name="tiempo_mesa[]"
//                 value="${fecha_pedido}"
//               />
//             `;

//             // Construye el <button> completo
//             const button = `
//               <button
//                 class="btn btn-reed ${forma} dim btn-large-dim"
//                 onclick="orden(${id_pedido}, '${nro_mesa}', '${desc_salon}');"
//               >
//                 <span class="span-a">
//                   <i class="far fa-user"></i>
//                   ${nro_personas}
//                 </span>
//                 <span>${nro_mesa}</span>
//                 <br/>
//                 <img
//                   src="public/images/table_full.png"
//                   width="40"
//                   height="40"
//                   class="hidden-sm-down"
//                 />
//                 <span class="span-b">
//                   <i class="ti-timer"></i>
//                   &nbsp;<span class="${timerClass}">${timeAgo}</span>
//                 </span>
//                 <input type="radio" autocomplete="off"/>
//               </button>
//             `;

//             // Finalmente lo añade al DOM
//             $listMesas.append($(hiddenInput + button));
//           }
//         } else {
//           if (mesa.id_salon == cod && mesa.estado == "a") {
//             $(".list-mesas").append(
//               $(
//                 '<button class="btn btn-green ' +
//                   forma +
//                   ' dim btn-large-dim"' +
//                   'onclick="nuevoPedidoMesa(' +
//                   mesa.id_mesa +
//                   ",'" +
//                   mesa.nro_mesa +
//                   "','" +
//                   mesa.desc_salon +
//                   "')\">" +
//                   mesa.nro_mesa +
//                   '<br><img src="public/images/table_empty.png" width="40px" height="40px" class="hidden-sm-down"/><input type="radio" autocomplete="off"></button>'
//               )
//             );
//           } else if (mesa.id_salon == cod && mesa.estado == "p") {
//             $(".list-mesas");
//             $(".list-mesas").append(
//               $(
//                 '<input type="hidden" name="tiempo_mesa[]" value="' +
//                   mesa.fecha_pedido +
//                   '"/>' +
//                   '<button class="btn btn-blue ' +
//                   forma +
//                   ' dim btn-large-dim"' +
//                   'onclick="listarPedidos(' +
//                   mesa.id_salon +
//                   "," +
//                   mesa.id_mesa +
//                   ",1," +
//                   mesa.id_pedido +
//                   ",'" +
//                   mesa.nro_mesa +
//                   "','" +
//                   mesa.desc_salon +
//                   "','" +
//                   mesa.estado +
//                   "')\">" +
//                   '<span class="span-a"><i class="far fa-user"></i> ' +
//                   mesa.nro_personas +
//                   "</span><span>" +
//                   mesa.nro_mesa +
//                   '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
//                   '<span class="span-b"><i class="ti-timer"></i> <span class="hora-mesa' +
//                   count++ +
//                   '">' +
//                   moment(mesa.fecha_pedido).fromNow(true) +
//                   '</span></span><input type="radio" autocomplete="off"></button>'
//               )
//             );
//           } else if (mesa.id_salon == cod && mesa.estado == "i") {
//             $(".list-mesas").append(
//               $(
//                 '<input type="hidden" name="tiempo_mesa[]" value="' +
//                   mesa.fecha_pedido +
//                   '"/>' +
//                   '<button class="btn btn-reed ' +
//                   forma +
//                   ' dim btn-large-dim"' +
//                   'onclick="listarPedidos(' +
//                   mesa.id_salon +
//                   "," +
//                   mesa.id_mesa +
//                   ",1," +
//                   mesa.id_pedido +
//                   ",'" +
//                   mesa.nro_mesa +
//                   "','" +
//                   mesa.desc_salon +
//                   "','" +
//                   mesa.estado +
//                   "')\">" +
//                   '<span class="span-a"><i class="far fa-user"></i> ' +
//                   mesa.nro_personas +
//                   "</span><span>" +
//                   mesa.nro_mesa +
//                   '</span><br><img src="public/images/table_full.png" width="40px" height="40px" class="hidden-sm-down"/>' +
//                   '<span class="span-b"><i class="ti-timer"></i> <span class="hora-mesa' +
//                   count++ +
//                   '">' +
//                   moment(mesa.fecha_pedido).fromNow(true) +
//                   '</span></span><input type="radio" autocomplete="off"></button>'
//               )
//             );
//           }
//         }
//         console.log(mesa.id_salon);
//       });
//       $(".mesas-disponibles").attr(
//         "data-original-title",
//         count_disponibles + " mesas disponibles"
//       );
//       $("#mesa_libre").text(count_disponibles);
//       $(".mesas-ocupadas").attr(
//         "data-original-title",
//         count_ocupadas + " mesas ocupadas"
//       );
//       $("#mesa_ocupada").text(count_ocupadas);
//       $(".mesas-pago").attr(
//         "data-original-title",
//         count_pagos + " mesas en proceso de pago"
//       );
//       $("#mesa_proceso").text(count_pagos);
//     },
//   });
// };

// function get_json_pedidos() {
//     var pedidos = [];

//     $('#list-pedidos .comment-list').each(function () {
//         var pedido = {};

//         // Extraer información del evento onclick
//         var onclickAttr = $(this).attr('onclick'); // subPedido(1,10,5,'20.00');
//         var matches = onclickAttr.match(/subPedido\((\d+),(\d+),(\d+),'([\d.]+)'\)/);

//         if (matches) {
//             pedido.tipo = parseInt(matches[1]); // 1
//             pedido.id_pedido = parseInt(matches[2]); // 10
//             pedido.id_pres = parseInt(matches[3]); // 5
//             pedido.precio = parseFloat(matches[4]); // 20.00
//         }

//         // Extraer nombre del producto
//         pedido.producto = $(this).find('.r-order-type-label').text().trim();

//         // Extraer presentación del producto
//         pedido.presentacion = $(this).find('.order-name').text().trim();

//         // Extraer cantidad
//         var cantidadText = $(this).find('.order-units').text().match(/(\d+)\s+Unidad/);
//         pedido.cantidad = cantidadText ? parseInt(cantidadText[1]) : 0;

//         // Extraer el precio total
//         var totalText = $(this).find('.price').text().replace(/[^\d.]/g, '');
//         pedido.total = parseFloat(totalText) || 0;

//         pedidos.push(pedido);
//     });

//     return pedidos;
// }

function toggleHotelero(el) {
  const $badge = $(el);
  const idPedido = $badge.data("id");
  const idPres = $badge.data("pres");
  const precio = $badge.data("precio");
  const esHoteleroActual = parseInt($badge.data("hotelero")) === 1;
  const nuevoEstado = esHoteleroActual ? 0 : 1;

  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/marcarDetalleHotelero",
    dataType: "JSON",
    data: { id_pedido: idPedido, id_pres: idPres, precio: precio, es_hotelero: nuevoEstado },
    success: function (resp) {
      if (!resp.success) {
        mostrarAlerta("error", "Error", resp.message || "No se pudo actualizar");
        return;
      }
      const $row = $badge.closest(".comment-list");
      $badge.data("hotelero", nuevoEstado);
      $row.attr("data-hotelero", nuevoEstado);
      if (nuevoEstado === 1) {
        $badge.text("HOTELERO").css({ background: "#f59e0b", color: "#fff" })
          .attr("title", "Producto hotelero - no facturable");
      } else {
        $badge.text("hotel").css({ background: "#e5e7eb", color: "#6b7280" })
          .attr("title", "Marcar como hotelero");
      }
    },
    error: function () {
      mostrarAlerta("error", "Error", "Error de conexión al marcar producto hotelero");
    }
  });
}

function get_json_pedidos() {
  const id_pres_array = [];
  const precios_array = [];
  const cantidades_array = [];

  $("#list-pedidos .comment-list").each(function () {
    const $item = $(this);

    const id_pres = parseInt($item.data("product")); // data-product
    const precio = parseFloat($item.data("price")); // data-price

    let cantidad = 0;
    if (selectionMode) {
      const counterText = $item.find(".selection-counter").text(); // Ej: "2/3"
      const match = counterText.match(/^(\d+)\//);
      cantidad = match ? parseInt(match[1]) : 0;
    } else {
      const qtyText = $item.find(".full-quantity").text(); // Ej: "3"
      cantidad = parseInt(qtyText) || 0;
    }

    id_pres_array.push(id_pres);
    precios_array.push(precio);
    cantidades_array.push(cantidad);
  });

  return {
    id_pres: id_pres_array,
    precios: precios_array,
    cantidades: cantidades_array,
  };
}

var subPedido = function (cod, id_pedido, id_pres, precio) {
  if (selectionMode) {
    return;
  }

  $("#list-subitems").empty();
  var tipo_pedido = $("#codtipoped").val();
  /*
  if($('#rol_usr').val() == 4){
      disp = 'none';
  }else{
      disp = 'block';
  }
  */
  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/subPedido",
    data: {
      tipo_pedido: tipo_pedido,
      id_pedido: id_pedido,
      id_pres: id_pres,
      precio: precio,
    },
    success: function (data) {
      $.each(data.Detalle, function (i, item) {
        $(".title-subitems").html(
          "Detalle por orden de pedido:<br>" +
          item.Producto.pro_nom +
          ' <span class="label label-warning text-uppercase">' +
          item.Producto.pro_pre +
          "</span>"
        );
        var opc = item.estado;
        switch (opc) {
          case "a":
            estado = '<span class="label label-success">PENDIENTE</span>';
            break;
          case "b":
            estado = '<span class="label label-warning">EN PREPARACION</span>';
            break;
          case "c":
            estado = '<span class="label label-info">PREPARADO</span>';
            break;
          case "d":
            estado = '<span class="label label-primary">ENTREGADO</span>';
            break;
          case "z":
            estado = '<span class="label label-danger">ANULADO</span>';
            break;
          case "y":
            estado =
              '<span class="label label-inverse">ESPERANDO CONFIRMACION</span>';
            break;
        }

        if (data.estado_pedido == "a") {
          switch (opc) {
            case "a":
              boton_anular = "block";
              break;
            case "b":
              boton_anular = "block";
              break;
            case "c":
              boton_anular = "block";
              break;
            case "d":
              boton_anular = "block";
              break;
            case "z":
              boton_anular = "none";
              break;
            case "y":
              boton_anular = "block";
              break;
          }
        } else if (data.estado_pedido == "b") {
          if (data.id_tipo_pedido == 2) {
            switch (opc) {
              case "a":
                boton_anular = "block";
                break;
              case "b":
                boton_anular = "block";
                break;
              case "c":
                boton_anular = "block";
                break;
              case "d":
                boton_anular = "block";
                break;
              case "z":
                boton_anular = "none";
                break;
              case "y":
                boton_anular = "block";
                break;
            }
          } else if (data.id_tipo_pedido == 3) {
            switch (opc) {
              case "a":
                boton_anular = "block";
                break;
              case "b":
                boton_anular = "block";
                break;
              case "c":
                boton_anular = "block";
                break;
              case "d":
                boton_anular = "block";
                break;
              case "z":
                boton_anular = "none";
                break;
              case "y":
                boton_anular = "block";
                break;
            }
          }
        } else if (data.estado_pedido == "c") {
          boton_anular = "none";
        } else if (data.estado_pedido == "d") {
          boton_anular = "none";
        }

        var notas_ = "";
        var notas_t = "";

        if (item.comentario.length > 0) {
          var comentarios = item.comentario.trim();
          var arreglo1 = comentarios.split(",");
          $.each(arreglo1, function (ind, elem) {
            console.log(elem);
            if (elem != "") {
              notas_ +=
                '<span class="label label-info ml-1 mr-1 font-13">' +
                elem +
                "</span>";
            }
          });
          var notas_t = "Notas:";
        }

        if (item.estado != "z") {
          $("#list-subitems").append(
            $('<div class="d-flex flex-row comment-row comment-list"/>').append(
              '<div class="comment-text w-100 p-0 m-b-10n"><span style="display: inline-block;">' +
              '<h6 class="m-b-5"><i class="ti-calendar"></i> ' +
              moment(item.fecha_pedido).format("DD-MM-Y") +
              ' <i class="ti-time"></i> ' +
              moment(item.fecha_pedido).format("h:mm:ss A") +
              "</span></h6>" +
              '<p class="m-b-0 font-13">' +
              estado +
              " :: " +
              item.cant +
              " Unidad(es)</p></span>" +
              '<span class="price" style="display: ' +
              boton_anular +
              '">' +
              '<button type="button" class="btn btn-xs btn-danger pull-right"' +
              'onclick="anularPedido(' +
              id_pedido +
              "," +
              item.id_pres +
              "," +
              item.cant +
              ",'" +
              item.Producto.pro_nom +
              "','" +
              item.Producto.pro_pre +
              "','" +
              item.fecha_pedido +
              "','" +
              item.estado +
              "')\">" +
              '<i class="fas fa-trash"></i></button></span>' +
              '<p class="m-b-0 font-13 mt-1">' +
              notas_t +
              " " +
              notas_ +
              " </p></div>"
            )
          );
        } else {
          $("#list-subitems").append(
            $('<div class="d-flex flex-row comment-row comment-list"/>').append(
              '<div class="comment-text w-100 p-0 m-b-10n"><span style="display: inline-block;">' +
              '<h6 class="m-b-5"><i class="ti-calendar"></i> ' +
              moment(item.fecha_pedido).format("DD-MM-Y") +
              ' <i class="ti-time"></i> ' +
              moment(item.fecha_pedido).format("h:mm:ss A") +
              "</span></h6>" +
              '<p class="m-b-0 font-13">' +
              estado +
              " :: " +
              item.cantidad +
              " Unidad(es)</p></span>" +
              '<p class="m-b-0 font-13 mt-1">' +
              notas_t +
              " " +
              notas_ +
              " </p>" +
              "</div>"
            )
          );
        }
      });

      if (data.id_tipo_pedido == 2) {
        console.log("asdasdas");

        listarPedidosDetalle(tipo_pedido, id_pedido);
      }
    },
    error: function (jqXHR, textStatus, errorThrown) {
      console.log(errorThrown + " " + textStatus);
    },
  });
  $("#modal-sub-pedido").modal("show");
};

function procesarData(id_pedido) {
  var current_invoices = parseInt($("#current_invoices").val());
  var limits_invoices = parseInt($("#limits_invoices").val());
  var locked_invoices = parseInt($("#locked_invoices").val());

  const clienteId = $("#cliente_id").val();
  const clienteDoc = $("#cliente_documento").val().trim();
  const descuentoTipo = $("#descuento_tipo_hidden").val();
  const tipoPago = getTipoPagoActual();
  const totalPedido = getTotalPedidoActual();
  const pagoEfe = Number($("#pago_efe").val());
  const tipoDocumento = $("input[name=tipo_doc]:checked").val();
  const tipo_descuento = $("#tipo_descuento_select").val();
  const descuentoTipoNum = Number(descuentoTipo || tipo_descuento || 0);
  const descuentoMonto = parseMontoSeguro(
    $("#descuento_monto_hidden").val() || $("#descuento_monto_fijo").val()
  );
  const descuentoPersonal = parseInt(
    $("#descuento_personal_hidden").val() || $("#personal_descuento").val(),
    10
  ) || 0;
  const comisionTarjetaEnviar =
    tipoPago === 2 && $(".comision_tarjeta_venta").is(":checked")
      ? parseMontoSeguro($(".comisionTarjeta").text())
      : 0;

  var datosSerializados = $("#form-nuevo-pedido").serializeArray();

  const total = Number(
    $(".totalPagar .text span")
      .text()
      .replace(/[^\d.,]/g, "")
  );

  const detalles = get_json_pedidos();

  if (tipoDocumento == undefined || tipoDocumento === "undefined") {
    mostrarAlerta("error", "Advertencia", "Seleccione un tipo de documento");
    return;
  }

  // Validación hotelero: Boleta (1) o Factura (2) no pueden incluir ítems hoteleros.
  if (tipoDocumento == 1 || tipoDocumento == 2) {
    let hayHotelero = false;
    let todosHoteleros = true;
    $("#list-pedidos .comment-list").each(function () {
      const esH = parseInt($(this).attr("data-hotelero")) === 1;
      const qty = selectionMode
        ? parseInt(($(this).find(".selection-counter").text().match(/^(\d+)\//) || [])[1] || 0)
        : parseInt($(this).find(".full-quantity").text()) || 0;
      if (qty > 0 && esH) hayHotelero = true;
      if (qty > 0 && !esH) todosHoteleros = false;
    });

    if (hayHotelero) {
      mostrarAlerta(
        "error",
        "Productos hoteleros",
        "Este comprobante incluye productos hoteleros. Use división de cuentas y seleccione solo los adicionales para emitir boleta/factura."
      );
      return;
    }
    if (todosHoteleros) {
      mostrarAlerta(
        "warning",
        "Solo hoteleros",
        "Los productos hoteleros no pueden emitirse en boleta o factura. Registre la operación como Nota de Venta."
      );
      return;
    }
  }

  if (tipoDocumento == 2 && clienteDoc.length !== 11) {
    mostrarAlerta(
      "warning",
      "Advertencia",
      "Ingrese un RUC valido para su factura"
    );
    return;
  }

  if (clienteId === "") {
    mostrarAlerta(
      "warning",
      "Advertencia",
      "Ingrese un cliente para el comprobante de pago"
    );
    return;
  }

  if (descuentoTipo !== "1" && tipoPago === 1 && totalPedido > pagoEfe) {
    mostrarAlerta(
      "warning",
      "Advertencia",
      "Ingrese un monto mayor o igual al total"
    );
    return;
  }

  if (descuentoTipoNum === 2 && descuentoMonto <= 0) {
    mostrarAlerta(
      "warning",
      "Advertencia",
      "Debe ingresar un monto válido para el descuento."
    );
    return;
  }

  if (descuentoTipoNum === 3) {
    if (descuentoPersonal <= 0) {
      mostrarAlerta(
        "warning",
        "Advertencia",
        "Debe seleccionar el personal para crédito."
      );
      return;
    }
    if (descuentoMonto <= 0) {
      mostrarAlerta(
        "warning",
        "Advertencia",
        "Debe ingresar un monto válido para crédito personal."
      );
      return;
    }
  }

  if (current_invoices >= limits_invoices && locked_invoices == "1") {
    mostrarAlerta(
      "error",
      "Alcanzó el límite",
      "Alcanzó el límite permitido para la emisión de comprobantes"
    );
    return;
  }

  if (TotalPedido == 0 && selectionMode) {
    mostrarAlerta(
      "warning",
      "Pedido Vacio",
      "Debe seleccionar un producto para continuar"
    );
    return;
  }

  // Si está en modo división pero seleccionó TODOS los ítems al 100%,
  // equivale a un cobro completo → dividir_cuenta = 1 para que la mesa se libere.
  const esPagoTotal = selectionMode && (function () {
    var todo = true;
    $("#list-pedidos .comment-list").each(function () {
      var counterText = $(this).find(".selection-counter").text(); // "2/3"
      var parts = counterText.match(/^(\d+)\/(\d+)$/);
      if (!parts || parseInt(parts[1]) < parseInt(parts[2])) {
        todo = false;
        return false; // break
      }
    });
    return todo;
  })();

  const venta = {
    tipo_pedido: $("ul.nav-tabs .nav-link.active")
      .attr("href")
      .replace(/[^0-9]/g, ""),
    tipo_entrega: pedidoSeleccionado.tipo_entrega ?? 0,
    dividir_cuenta: (!selectionMode || esPagoTotal) ? 1 : 2,
    id_pedido: id_pedido,
    cliente_id: clienteId,
    tipo_doc: tipoDocumento,
    tipo_pago: tipoPago,
    id_tipo_pago_real: parseInt($("#tipo_pago").val(), 10) || tipoPago,
    pago_efe: datosSerializados.find((x) => x.name === "pago_efe").value,
    pago_tar: datosSerializados.find((x) => x.name === "pago_tar").value,
    pago_yape: datosSerializados.find((x) => x.name === "pago_yape").value,
    pago_plin: datosSerializados.find((x) => x.name === "pago_plin")?.value ?? 0,
    pago_tran: datosSerializados.find((x) => x.name === "pago_tran")?.value ?? 0,
    ibcper: $("#impuesto_bolsa").val(),
    descuento_tipo: descuentoTipoNum,
    descuento_personal: descuentoPersonal,
    descuento_monto:
      $("#descuento_monto_hidden").val() ||
      $("#descuento_monto_fijo").val() ||
      0,
    descuento_motivo:
      $("#descuento_motivo_hidden").val() || $("#descuento_motivo").val(),
    comision_tarjeta: comisionTarjetaEnviar,
    comision_delivery: $("#comision_delivery").val() || 0,
    codigo_operacion: ($("#cod_voucher_new").val() || "").trim(),
    venta_por_consumo: $(".venta_por_consumo").val(),
    venta_por_consumo_concepto: $("#input_por_consumo").val(),
    observacion: $("#observacion").val(),
    total: totalPedido,
    idProd: detalles.id_pres,
    cantProd: detalles.cantidades,
    precProd: detalles.precios,
  };

  console.log(venta);
  registrarVenta(venta);
}

function registrarVenta(venta) {
  $("#loading-overlay").show(); // antes del $.ajax
  $("#btnCobrar").prop("disabled", true);

  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/RegistrarVenta",
    data: venta,
    success: function (data) {
      console.log(data);

      limpiarDescuentos();
      var cod_ven = data.replace(/['"]+/g, "");
      var urlticketreparto =
        $("#url").val() + "venta/impresion_reparto/" + cod_ven;
      var tipoDocSeleccionado = Number(
        venta.tipo_doc || $('input[name="tipo_doc"]:checked').val() || 0
      );
      var autoImpresionCpeActiva = $("#print_cpe").val() == 1;
      var shouldAutoPrintCpe = autoImpresionCpeActiva && tipoDocSeleccionado !== 3;

      // Construcción del iframe según verpdf
      var Urlpdfiframe, withmodal, cantcolumn;
      console.log($("#verpdf").val());

      if ($("#verpdf").val() == 1) {
        Urlpdfiframe =
          '<div class="col-6 col-md-6 hidden-md-down"><iframe src="' +
          $("#url").val() +
          "informe/venta_all_imp/" +
          cod_ven +
          '#toolbar=0" style="border:none;width: 100%;height: 100%;" /></div>';
        withmodal = 800;
        cantcolumn = 6;
      } else {
        Urlpdfiframe = "";
        withmodal = 400;
        cantcolumn = 12;
      }

      // Construcción de enlaces según print_cpe
      var linkpdf, linkpdff, linkpdfview, linkpdfviewf, linkrep, linkrepp, linkgaveta, linkgavetap;
      if ($("#print_cpe").val() == 1) {
        // imprimir directo
        linkpdf =
          '<a href="' +
          $("#url").val() +
          "informe/venta_all_imp_/" +
          cod_ven +
          '" target="_blank" class="link"><i class="fas fa-print text-muted"></i></a>';
        linkpdff =
          '<a class="link" href="' +
          $("#url").val() +
          "informe/venta_all_imp_/" +
          cod_ven +
          '" target="_blank"><small>Imprimir comprobante</small></a>';
        linkpdfview =
          '<a href="' +
          $("#url").val() +
          "informe/venta_all_imp/" +
          cod_ven +
          '" target="_blank" class="link"><i class="fas fa-file-pdf text-danger"></i></a>';
        linkpdfviewf =
          '<a class="link" href="' +
          $("#url").val() +
          "informe/venta_all_imp/" +
          cod_ven +
          '" target="_blank"><small>Abrir PDF</small></a>';
        linkrep =
          '<a class="link" href="' +
          $("#url").val() +
          "venta/impresion_reparto/" +
          cod_ven +
          '" target="_blank"><i class="fas fa-print text-muted"></i></a>';
        linkrepp =
          '<a class="link" href="' +
          $("#url").val() +
          "venta/impresion_reparto/" +
          cod_ven +
          '" target="_blank"><small>Ticket reparto</small></a>';
        linkgaveta =
          '<a class="link" href="' +
          $("#url").val() +
          'imprimir/gaveta.php" target="_blank"><i class="fas fa-print text-muted"></i></a>';
        linkgavetap =
          '<a class="link" href="' +
          $("#url").val() +
          'imprimir/gaveta.php" target="_blank"><small>GAVETA</small></a>';
      } else {
        console.log("else");

        // vista previa
        linkrep =
          '<a class="link" onclick="printPdf(\'' +
          urlticketreparto +
          '\',true);" href="javascript:void(0)"><i class="fas fa-print text-muted"></i></a>';
        linkrepp =
          '<a class="link" onclick="printPdf(\'' +
          urlticketreparto +
          '\',true);" href="javascript:void(0)"><small>Ticket reparto</small></a>';
        linkpdf =
          '<a href="' +
          $("#url").val() +
          "informe/venta_all_imp_/" +
          cod_ven +
          '" target="_blank" class="link"><i class="fas fa-print text-muted"></i></a>';
        linkpdff =
          '<a class="link" href="' +
          $("#url").val() +
          "informe/venta_all_imp_/" +
          cod_ven +
          '" target="_blank"><small>Imprimir comprobante</small></a>';
        linkpdfview =
          '<a href="' +
          $("#url").val() +
          "informe/venta_all_imp/" +
          cod_ven +
          '" target="_blank" class="link"><i class="fas fa-file-pdf text-danger"></i></a>';
        linkpdfviewf =
          '<a class="link" href="' +
          $("#url").val() +
          "informe/venta_all_imp/" +
          cod_ven +
          '" target="_blank"><small>Abrir PDF</small></a>';
        linkgaveta =
          '<a class="link" href="' +
          $("#url").val() +
          'imprimir/gaveta.php" target="_blank"><i class="fas fa-print text-muted"></i></a>';
        linkgavetap =
          '<a class="link" href="' +
          $("#url").val() +
          'imprimir/gaveta.php" target="_blank"><small>GAVETA</small></a>';
      }

      // Montaje del HTML del modal (tal cual lo tenías)
      var html_confirm;
      if (
        $("ul.nav-tabs .nav-link.active")
          .attr("href")
          .replace(/[^0-9]/g, "") == 3
      ) {
        html_confirm =
          '<div class="row"> <div class="col-' +
          cantcolumn +
          " col-md-" +
          cantcolumn +
          '">' +
          '<div class="text-center p-20"><i class="fas fa-check-circle display-3 text-success"></i>' +
          '<h4 class="m-t-20 font-bold">&iexcl;Venta completada!</h4></div>' +
          '<div class="card-body text-center">' +
          '<div class="row">' +
          '<div class="col-6 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkpdf +
          "</h1>" +
          linkpdff +
          "</div>" +
          '<div class="col-6 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkpdfview +
          "</h1>" +
          linkpdfviewf +
          "</div>" +
          '<div class="col-6 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkgaveta +
          "</h1>" +
          linkgavetap +
          "</div>" +
          '<div class="col-6 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkrep +
          "</h1>" +
          linkrepp +
          "</div>" +
          "</div>" +
          '<div class="row mt-5">' +
          '<div class="col-12 text-center">' +
          '<span class="mb-2 text-center" style="display: block;">Enviar comprobante por WhatsApp</span>' +
          '<div class="input-group">' +
          '<div class="input-group-prepend">' +
          '<span class="input-group-text">N&ordm;</span>' +
          "</div>" +
          '<input type="text" id="numero_cliente" value="51" class="form-control" placeholder="51999999999">' +
          '<div class="input-group-append">' +
          '<button class="btn btn-success" type="button" id="button-addon2" onclick="clickSendWhatsapp(\'' +
          cod_ven +
          '\');">enviar <i class="fab fa-whatsapp"></i></button>' +
          '<span class="input-group-text wsp-status-dot-wrap"><i id="wsp-status" class="fas fa-circle text-secondary" title="No enviado a&uacute;n"></i></span>' +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          Urlpdfiframe +
          "</div>";
      } else {
        html_confirm =
          '<div class="row"> <div class="col-' +
          cantcolumn +
          " col-md-" +
          cantcolumn +
          '">' +
          '<div class="text-center p-20"><i class="fas fa-check-circle display-3 text-success"></i>' +
          '<h4 class="m-t-20 font-bold">&iexcl;Venta completada!</h4></div>' +
          '<div class="card-body text-center">' +
          '<div class="row">' +
          '<div class="col-12 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkpdf +
          "</h1>" +
          linkpdff +
          "</div>" +
          '<div class="col-12 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkpdfview +
          "</h1>" +
          linkpdfviewf +
          "</div>" +
          '<div class="col-12 text-center">' +
          '<h1 class="font-light m-b-0">' +
          linkgaveta +
          "</h1>" +
          linkgavetap +
          "</div>" +
          "</div>" +
          '<div class="row mt-5">' +
          '<div class="col-12 text-center">' +
          '<span class="mb-2 text-center" style="display: block;">Enviar comprobante por WhatsApp</span>' +
          '<div class="input-group">' +
          '<div class="input-group-prepend">' +
          '<span class="input-group-text">N&ordm;</span>' +
          "</div>" +
          '<input type="text" id="numero_cliente" value="51" class="form-control" placeholder="51999999999">' +
          '<div class="input-group-append">' +
          '<button class="btn btn-success" type="button" id="button-addon2" onclick="clickSendWhatsapp(\'' +
          cod_ven +
          '\');">enviar <i class="fab fa-whatsapp"></i></button>' +
          '<span class="input-group-text wsp-status-dot-wrap"><i id="wsp-status" class="fas fa-circle text-secondary" title="No enviado a&uacute;n"></i></span>' +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          "</div>" +
          Urlpdfiframe +
          "</div>";
      }

      Swal.fire({
        html: html_confirm,
        width: withmodal,
        footer:
          '<div><a class="btn btn-orange" href="#" onclick="fin_venta(); Swal.close();">Continuar <i class="fas fa-arrow-right"></i></a></div>',
        allowOutsideClick: false,
        allowEscapeKey: false,
        showCancelButton: false,
        showConfirmButton: false,
      });

      if (shouldAutoPrintCpe) {
        window.open($("#url").val() + "informe/venta_all_imp_/" + cod_ven, "_blank");
      }
      $("#loading-overlay").hide();
      $(".venta_por_consumo").prop("checked", false).triggerHandler("click");
      $("#button-addon2").prop("disabled", true);
      $("#btnCobrar").prop("disabled", false);
    },
    error: function (xhr, status, error) {
      console.error("Error al guardar pedido:", error);
      let mensaje = "No se pudo concretar el cobro. Verifique el pedido y vuelva a intentar.";
      if (xhr && xhr.responseJSON && (xhr.responseJSON.error || xhr.responseJSON.message)) {
        mensaje = xhr.responseJSON.error || xhr.responseJSON.message;
      }
      if (typeof mostrarAlerta === "function") {
        mostrarAlerta("error", "Error al cobrar", mensaje);
      } else if (typeof Swal !== "undefined") {
        Swal.fire("Error", mensaje, "error");
      }
      if (typeof mesa_list === "function" && $("#id_salon").val()) {
        mesa_list($("#id_salon").val());
      }
      $("#btnCobrar").prop("disabled", false);
      $("#loading-overlay").hide();
    },
  });
}

function testVenta(venta) {
  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/TestVenta",
    data: { id_venta: venta },
    success: function (data) {
      console.log(data);
    },
    error: function (xhr, status, error) {
      console.error("Error al guardar pedido:", error);
    },
  });
}

function fin_venta() {
  console.log("fin_venta");

  let tipo_pedido = $("#codtipoped").val();
  if (tipo_pedido == 2) {
    $(".mostrador02").trigger("click");
    return;
  } else if (tipo_pedido == 3) {
    $(".delivery02").trigger("click");
    return;
  }

  reset_default();
  $(".cont01").show();
  $(".cont01-1").show();
  $(".cont01-2").hide();
  $("#viewLivetoast").css("display", "none");
  $("#payment-inputs-top").css("display", "none");

  if ($("#id_salon").val()) {
    mesa_list($("#id_salon").val());
  }
}

var tiempo_mesa = function () {
  moment.locale("es");
  $('input[name^="tiempo_mesa"]').each(function (i) {
    var fechaConvertida = moment($(this).val()).fromNow(true);
    $(".hora-mesa" + i).text(fechaConvertida);
  });
};

var mostrador = function () {
  //mostrador_list_a();
  //mostrador_list_c();
  activaTab("mostrador01");
  mostrador_list_a();
  $(".pedido-mozo").hide();
  // Clean payment UI
  $('#payment-inputs-top').hide();
  $('#fast-cash-container').hide();
  $('.card-footer-right').hide();
};

var delivery = function () {
  activaTab("delivery01");
  delivery_list_a();
  $(".pedido-mozo").hide();
  // Clean payment UI
  $('#payment-inputs-top').hide();
  $('#fast-cash-container').hide();
  $('.card-footer-right').hide();
};

var mostrador_list_a = function () {
  function filterGlobal() {
    $("#list-mostrador-confirmacion")
      .DataTable()
      .search($("#search_filter_e").val())
      .draw();
  }

  var count = 0;
  var table = $("#list-mostrador-confirmacion").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/mostrador_list",
      data: {
        estado: "a",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(2,' +
            data.id_pedido +
            ',0);">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<input type="hidden" name="tiempo_pedido_mostrador[]" value="' +
            data.fecha_pedido +
            '"/><i class="ti-timer"></i> <span class="tiempo-pedido-mostrador' +
            count++ +
            '">' +
            moment(data.fecha_pedido).fromNow(true) +
            "</span>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return '<i class="ti-user"></i> ' + data.nomb_cliente;
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          return moneda + " " + formatNumber(data.Total.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-mostrador-total").text(total);
    },
  });

  $("input.search_filter_e").on("keyup click", function () {
    filterGlobal();
  });
};

var mostrador_list_b = function () {
  function filterGlobal() {
    $("#list-mostrador-preparacion")
      .DataTable()
      .search($("#search_filter_f").val())
      .draw();
  }

  var count = 0;
  var table = $("#list-mostrador-preparacion").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/mostrador_list_c",
      data: {
        estado: "b",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(2,' +
            data.id_pedido +
            ');">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<input type="hidden" name="tiempo_preparacion_mostrador[]" value="' +
            data.fecha_pedido +
            '"/><i class="ti-timer"></i> <span class="tiempo-preparacion-mostrador' +
            count++ +
            '">' +
            moment(data.fecha_pedido).fromNow(true) +
            "</span>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return '<i class="ti-user"></i> ' + data.nomb_cliente;
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          return moneda + " " + formatNumber(data.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-mostrador-total").text(total);
    },
  });

  $("input.search_filter_f").on("keyup click", function () {
    filterGlobal();
  });
};

var mostrador_list_c = function () {
  function filterGlobal() {
    $("#list-mostrador-entregados")
      .DataTable()
      .search($("#search_filter_g").val())
      .draw();
  }

  var table = $("#list-mostrador-entregados").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/mostrador_list_c",
      data: {
        estado: "d",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(2,' +
            data.id_pedido +
            "," +
            data.id_venta +
            ');">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var fecha1 = moment(data.fecha_entrega);
          var fecha2 = moment(data.fecha_pedido);
          var duration = moment.duration(fecha2 - fecha1).humanize();
          return (
            '<i class="ti-arrow-up text-warning"></i> ' +
            moment(data.fecha_pedido).format("h:mm A") +
            '<br><i class="ti-arrow-down text-success"></i> ' +
            moment(data.fecha_entrega).format("h:mm A") +
            '<br><i class="ti-timer"></i> ' +
            duration
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return '<i class="ti-user"></i> ' + data.nomb_cliente;
        },
      },

      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          return moneda + " " + formatNumber(data.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-mostrador-total").text(total);
    },
  });

  $("input.search_filter_g").on("keyup click", function () {
    filterGlobal();
  });
};

var delivery = function () {
  activaTab("delivery01");
  delivery_list_a();
  $(".pedido-mozo").hide();
  // Clean payment UI
  $('#payment-inputs-top').hide();
  $('#fast-cash-container').hide();
  $('.card-footer-right').hide();
};

var count_pedido_delivery = 0;
var countNuevoPedidoDelivery = function () {
  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/delivery_list",
    data: {
      estado: "a",
    },
    success: function (data) {
      $.each(data, function (i, item) {
        if (parseInt(item.length) !== count_pedido_delivery) {
          count_pedido_delivery = 0;
          if ($("#codpestdelivery").val() == 1) {
            delivery_list_a();
          }
          var sound = new buzz.sound(
            $("#url").val() + "public/sound/ding_ding",
            {
              formats: ["ogg", "mp3", "aac"],
            }
          );
          sound.play();
          count_pedido_delivery = item.length + count_pedido_delivery;
          $(".pedidos-total-1").text(count_pedido_delivery);
        }
      });
    },
  });
};

var delivery_list_a = function () {
  function filterGlobal() {
    $("#list-delivery-confirmacion")
      .DataTable()
      .search($("#search_filter_a").val())
      .draw();
  }

  var count = 0;
  var table = $("#list-delivery-confirmacion").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/delivery_list",
      data: {
        estado: "a",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          if (data.pedido_programado == 1) {
            return (
              '<a href="javascript:void(0)"><span class="round round-primary" onclick="listarPedidosDetalle(3,' +
              data.id_pedido +
              ',0);">' +
              data.nro_pedido +
              "</span></a>"
            );
          } else {
            return (
              '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(3,' +
              data.id_pedido +
              ',0);">' +
              data.nro_pedido +
              "</span></a>"
            );
          }
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<input type="hidden" name="tiempo_pedido_delivery[]" value="' +
            data.fecha_pedido +
            '"/><i class="ti-timer"></i> <span class="tiempo-pedido-delivery' +
            count++ +
            '">' +
            moment(data.fecha_pedido).fromNow(true) +
            "</span>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<i class="ti-mobile"></i> ' +
            data.telefono_cliente +
            '<br><i class="ti-user"></i> ' +
            data.nombre_cliente
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var tipo_entrega =
            data.tipo_entrega == 1
              ? '<span class="label label-primary">A DOMICILIO</span>'
              : '<span class="label label-inverse">POR RECOGER</span>';
          return tipo_entrega;
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          //var repartidor = (data.tipo_entrega == 1) ? '<i class="fas fa-bicycle"></i> '+data.Tipopago.nombre : '-';
          if (data.tipo_pago == 1) {
            return (
              '<span class="label label-success">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 2) {
            return (
              '<span class="label label-info">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 3) {
            return (
              '<span class="label label-warning">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 4) {
            return (
              '<span class="label label-danger text-primary font-bold">C</span> <span class="text-primary font-bold">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago >= 5) {
            return (
              '<span class="label label-light-primary">' +
              data.Tipopago.nombre +
              "</span>"
            );
          }
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          var sumatoria =
            Number(data.Total.total) + Number(data.comision_delivery);
          return moneda + " " + sumatoria;
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-total").text(total);
      $(".pedidos-total-1").text(total);
    },
  });

  $("input.search_filter_a").on("keyup click", function () {
    filterGlobal();
  });
};

function listarPersonal() {
  var personal = $("#personal_descuento");

  $.ajax({
    url: $("#url").val() + "venta/Personal",
    type: "POST",
    dataType: "json",
    success: function (data) {
      personal.find("option").remove();
      $(data).each(function (i, v) {
        // indice, valor
        personal.append(
          '<option value="' +
          v.id_usu +
          '">' +
          v.nombres +
          " " +
          v.ape_paterno +
          " " +
          v.ape_materno +
          "</option>"
        );
      });
    },
  });
}

var limpiar_pagos_a = function () {
  $("#pago_efe").val("0.00");
  $("#pago_tar").val("0.00");
  $("#pago_yape").val("0.00");
  $("#pago_plin").val("0.00");
  $("#pago_tran").val("0.00");
  $("#vuelto").text("0.00");
};

var limpiar_resumen_pago = function () {
  TotalPedido = 0;
  $(".totalPagar").html('<div class="text"><span>' + moneda + " 0.00</span>");
  $(".SubtotalPedido").text("0.00");
  $(".totalDescuento").text("0.00");
  $(".totalDelivery").text("0.00");
  $(".totalPedidoMenosTarjeta").text("0.00");
  $(".comisionTarjeta").text("0.00");
  $("#total_venta").val("0.00");
  $("#cod_voucher_new").val("");
  $(".view_comision_tarjeta").hide();
  limpiar_pagos_a();
};

var delivery_list_b = function () {
  function filterGlobal() {
    $("#list-delivery-preparacion")
      .DataTable()
      .search($("#search_filter_b").val())
      .draw();
  }

  var count = 0;
  var table = $("#list-delivery-preparacion").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/delivery_list",
      data: {
        estado: "b",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(3,' +
            data.id_pedido +
            ',0);">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<input type="hidden" name="tiempo_preparacion_delivery[]" value="' +
            data.fecha_preparacion +
            '"/><i class="ti-timer"></i> <span class="tiempo-preparacion-delivery' +
            count++ +
            '">' +
            moment(data.fecha_preparacion).fromNow(true) +
            "</span>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<i class="ti-mobile"></i> ' +
            data.telefono_cliente +
            '<br><i class="ti-user"></i> ' +
            data.nombre_cliente
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var tipo_entrega =
            data.tipo_entrega == 1
              ? '<span class="label label-primary">A DOMICILIO</span>'
              : '<span class="label label-inverse">POR RECOGER</span>';
          return tipo_entrega;
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          //var repartidor = (data.tipo_entrega == 1) ? '<i class="fas fa-bicycle"></i> '+data.Tipopago.nombre : '-';
          if (data.tipo_pago == 1) {
            return (
              '<span class="label label-success">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 2) {
            return (
              '<span class="label label-info">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 3) {
            return (
              '<span class="label label-warning">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago == 4) {
            return (
              '<span class="label label-danger text-primary font-bold">C</span> <span class="text-primary font-bold">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago >= 5) {
            return (
              '<span class="label label-light-primary">' +
              data.Tipopago.nombre +
              "</span>"
            );
          }
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          var sumatoria =
            Number(data.Total.total) + Number(data.comision_delivery);
          return moneda + " " + sumatoria;
          // return moneda+' '+formatNumber(data.Total.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-total").text(total);
    },
  });

  $("input.search_filter_b").on("keyup click", function () {
    filterGlobal();
  });
};

var delivery_list_c = function () {
  function filterGlobal() {
    $("#list-delivery-enviados")
      .DataTable()
      .search($("#search_filter_c").val())
      .draw();
  }

  var table = $("#list-delivery-enviados").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/delivery_list_c",
      data: {
        estado: "c",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(3,' +
            data.id_pedido +
            "," +
            data.id_venta +
            ');">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var fecha1 = moment(data.fecha_envio);
          var fecha2 = moment(data.fecha_pedido);
          var duration = moment.duration(fecha2 - fecha1).humanize();
          return (
            '<i class="ti-arrow-up text-warning"></i> ' +
            moment(data.fecha_pedido).format("h:mm A") +
            '<br><i class="ti-arrow-down text-info"></i> ' +
            moment(data.fecha_envio).format("h:mm A") +
            '<br><i class="ti-timer"></i> ' +
            duration
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<i class="ti-mobile"></i> ' +
            data.telefono_cliente +
            '<br><i class="ti-user"></i> ' +
            data.nombre_cliente
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var tipo_entrega =
            data.tipo_entrega == 1
              ? '<span class="label label-primary">A DOMICILIO</span>'
              : '<span class="label label-inverse">POR RECOGER</span>';
          return tipo_entrega;
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          //var repartidor = (data.tipo_entrega == 1) ? '<i class="fas fa-bicycle"></i> '+data.Tipopago.nombre : '-';
          if (data.tipo_pago_new == 1) {
            return (
              '<span class="label label-success">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 2) {
            return (
              '<span class="label label-info">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 3) {
            return (
              '<span class="label label-warning">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 4) {
            return (
              '<span class="label label-danger text-primary font-bold">C</span> <span class="text-primary font-bold">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new >= 5) {
            return (
              '<span class="label label-light-primary">' +
              data.Tipopago.nombre +
              "</span>"
            );
          }
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          return moneda + " " + formatNumber(data.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-total").text(total);
      //$('#idventa').val(idventa);
    },
  });

  $("input.search_filter_c").on("keyup click", function () {
    filterGlobal();
  });
};

var delivery_list_d = function () {
  function filterGlobal() {
    $("#list-delivery-entregados")
      .DataTable()
      .search($("#search_filter_d").val())
      .draw();
  }

  var table = $("#list-delivery-entregados").DataTable({
    destroy: true,
    dom: "tip",
    bSort: true,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/delivery_list_c",
      data: {
        estado: "d",
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<a href="javascript:void(0)"><span class="round round-warning" onclick="listarPedidosDetalle(3,' +
            data.id_pedido +
            ',0);">' +
            data.nro_pedido +
            "</span></a>"
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var fecha1 = moment(data.fecha_entrega);
          var fecha2 = moment(data.fecha_envio);
          var fecha3 = moment(data.fecha_preparacion);
          if (data.fecha_envio == "0000-00-00 00:00:00") {
            var fecha_i = fecha3;
          } else {
            var fecha_i = fecha2;
          }
          var duration = moment.duration(fecha_i - fecha1).humanize();
          return (
            '<i class="ti-arrow-up text-info"></i> ' +
            fecha_i.format("h:mm A") +
            '<br><i class="ti-arrow-down text-success"></i> ' +
            moment(data.fecha_entrega).format("h:mm A") +
            '<br><i class="ti-timer"></i> ' +
            duration
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          return (
            '<i class="ti-mobile"></i> ' +
            data.telefono_cliente +
            '<br><i class="ti-user"></i> ' +
            data.nombre_cliente
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var tipo_entrega =
            data.tipo_entrega == 1
              ? '<span class="label label-primary">A DOMICILIO</span>'
              : '<span class="label label-inverse">POR RECOGER</span>';
          return tipo_entrega;
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          //var repartidor = (data.tipo_entrega == 1) ? '<i class="fas fa-bicycle"></i> '+data.Tipopago.nombre : '-';
          if (data.tipo_pago_new == 1) {
            return (
              '<span class="label label-success">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 2) {
            return (
              '<span class="label label-info">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 3) {
            return (
              '<span class="label label-warning">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new == 4) {
            return (
              '<span class="label label-danger text-primary font-bold">C</span> <span class="text-primary font-bold">' +
              data.Tipopago.nombre +
              "</span>"
            );
          } else if (data.tipo_pago_new >= 5) {
            return (
              '<span class="label label-light-primary">' +
              data.Tipopago.nombre +
              "</span>"
            );
          }
        },
      },
      {
        data: null,
        className: "text-right",
        render: function (data, type, row) {
          return moneda + " " + formatNumber(data.total);
        },
      },
    ],
    footerCallback: function (row, data, start, end, display) {
      var api = this.api(),
        data;

      total = api.rows().data().count();

      $(".pedidos-total").text(total);
    },
  });

  $("input.search_filter_d").on("keyup click", function () {
    filterGlobal();
  });
};

function listarComandas(id_pedido) {
  console.log("ID Pedido:", id_pedido);

  const $menu =
    $("#rol_usr").val() == 5
      ? $("#imprimir_comandas_mozo")
      : $("#imprimir_comandas");
  $menu.empty(); // Limpiar el contenido actual

  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/listarComandas",
    data: { id_pedido: id_pedido },
    success: function (data) {
      if (data.length !== 0) {
        let comandasList = "";

        $.each(data, function (i, v) {
          comandasList += `
            <a class="dropdown-item" href="javascript:void(0)" onclick="reimpresion_comanda('${v.id_key}')">
              <i class="fas fa-print mr-2"></i> ${v.fecha_pedido}
            </a>`;
        });

        $menu.html(comandasList);
      } else {
        $menu.html(`
          <div class="dropdown-item text-muted text-center">
            <i class="fas fa-exclamation-circle"></i> No existe registro
          </div>
        `);
      }
    },
    error: function (xhr, status, error) {
      console.error("Error al listar comandas:", error);
      $menu.html(`
        <div class="dropdown-item text-danger text-center">
          Error de conexión
        </div>
      `);
    },
  });
}

var tiempo_pedido = function () {
  moment.locale("es");
  $('input[name^="tiempo_pedido_mostrador"]').each(function (i) {
    var fechaConvertida_mostrador_a = moment($(this).val()).fromNow(true);
    $(".tiempo-pedido-mostrador" + i).text(fechaConvertida_mostrador_a);
  });
  $('input[name^="tiempo_pedido_delivery"]').each(function (i) {
    var fechaConvertida_delivery_a = moment($(this).val()).fromNow(true);
    $(".tiempo-pedido-delivery" + i).text(fechaConvertida_delivery_a);
  });
};

var tiempo_preparacion = function () {
  moment.locale("es");
  $('input[name^="tiempo_preparacion_mostrador"]').each(function (i) {
    var fechaConvertida_mostrador_b = moment($(this).val()).fromNow(true);
    $(".tiempo-preparacion-mostrador" + i).text(fechaConvertida_mostrador_b);
  });
  $('input[name^="tiempo_preparacion_delivery"]').each(function (i) {
    var fechaConvertida_delivery_b = moment($(this).val()).fromNow(true);
    $(".tiempo-preparacion-delivery" + i).text(fechaConvertida_delivery_b);
  });
};
function docDefecto(doc_defecto) {
  const $input = $(`input[name="tipo_doc"][value="${doc_defecto}"]`);
  const $label = $input.closest("label");

  if (!$input.length) {
    console.error("No encontré el input tipo_doc con value=" + doc_defecto);
    return;
  }

  $('input[name="tipo_doc"]').prop("checked", false);
  $("label.btn-tipo-doc-" + doc_defecto)
    .closest("label")
    .siblings("label")
    .removeClass("active");

  $input.prop("checked", true);
  $label.addClass("active");
  $input.trigger("click").trigger("change");
}

// Método que muestra la información en el aside de la venta.
// var listarPedidos = function (
//   cod_salon,
//   cod_mesa,
//   id_tipo_pedido,
//   id_pedido,
//   mesa,
//   salon,
//   estado
// ) {

//   $("#codsalonorigen").val(cod_salon);
//   $("#codmesaorigen").val(cod_mesa);
//   $("#salon").val(salon);
//   $("#mesa").val(mesa);

//   selectionMode = false;

//   reset_default();
//   $(".card_height").css("background", "#ffffff");
//   $(".card-body-right").css("display", "block");
//   $(".display-opciones-pedido").hide();
//   $(".static-list-pedidos").hide();
//   $("#content_pagos").show();
//   if (id_tipo_pedido == 1) {
//     $(".pedido-numero-icono").html("");
//     // $('.pedido-numero').html(salon+' - Mesa: '+mesa);
//     $(".pedido-numero").html(
//       `${salon} - Mesa: <span class="ml-2">${mesa}</span>`
//     );
//   }
//   $(".cont03").css("display", "block");

//   $(".imprimir_precuenta").off("click").on("click", function () {
//     impPreCuenta(id_pedido, cod_mesa, estado, true);
//   });

//   const doc_defecto = $('#tipo_doc_defecto').val().trim();
//   docDefecto(doc_defecto);

//   $("#tipo_pago").prop("selectedIndex", 0).trigger("change");

//   $("#list-pedidos").empty();

//   //$('.venta_por_consumo').prop('checked', false).trigger('click').trigger('change');

//   $('.venta_por_consumo').prop('checked', false).triggerHandler('click');

//   $.ajax({
//     dataType: "JSON",
//     type: "POST",
//     url: $("#url").val() + "venta/listarPedidos",
//     data: {
//       id_pedido: id_pedido,
//       codpagina: $("#codpagina").val(),
//     },
//     success: function (data) {
//       var totPed = 0,
//         total = 0;
//       if (data.length != 0) {
//         $.each(data, function (i, item) {
//           $("#nombre_mozo").val(item.nombre_mozo);
//           $(".pedido-mozo").show();
//           $(".pedido-mozo").attr(
//             "data-original-title",
//             "Mozo: " + item.nombre_mozo
//           );
//           totPed = item.cantidad * item.precio;

//           let selectionCounter = `
//             <span class="selection-counter ${selectionMode ? '' : 'd-none'}">0/${item.cantidad}</span>
//             <span class="full-quantity ${selectionMode ? 'd-none' : ''}">${item.cantidad}</span>
//           `;

//           const html = `
//             <div class="d-flex flex-row comment-list" data-id="${item.id_pedido}" data-quantity="${item.cantidad}" data-product="${item.id_pres}" data-price="${item.precio}"
//                 onclick="subPedido(1, ${item.id_pedido}, ${item.id_pres}, '${item.precio}');">
//               <div class="w-100 d-flex justify-content-between align-items-end r-order-item">
//                 <div class="r-details">
//                   <p class="order-name mb-0">
//                     ${item.Producto.pro_pre}
//                     <span class="r-order-type-label" style="margin-left:.6rem">
//                       ${item.Producto.pro_nom}
//                     </span>
//                   </p>
//                   <p class="order-units m-b-0 font-13">
//                     ${selectionCounter} Unidad(es) en ${moneda} ${formatNumber(item.precio)} | Unidad
//                   </p>
//                 </div>
//                 <div class="price">
//                   ${moneda} ${formatNumber(totPed)}
//                 </div>
//               </div>
//             </div>
//           `;

//           $("#list-pedidos").append(html);
//           total = totPed + total;
//         });

//         TotalPedido = total;

//         $(".totalPagar").html(
//           '<div class="text"><span>' +
//             moneda +
//             " " +
//             formatNumber(total) +
//             "</span>"
//         );

//         $(".totalDelivery").text(formatNumber(0));
//         $(".totalDescuento").text(formatNumber(0));
//         $(".SubtotalPedido").text(formatNumber(total));
//         $("#pago_efe").val(formatNumber(total));

//         $(".totalPedidoMenosTarjeta").text(formatNumber(total));
//       } else {
//         $("#list-pedidos").html(
//           '<div class="justify-center" style="height: 100%;"><div class="text-center"><h2><i class="fas fa-shopping-basket display-4" style="color: #d3d3d3;"></i></h2><h4 style="color: #d3d3d3;">Agregue productos</h4><h6 style="color: #d3d3d3;">No se encontraron productos</h6></div></div>'
//         );
//         $(".totalPagar").html(
//           '<div class="text"><span>' +
//             moneda +
//             " " +
//             formatNumber(total) +
//             "</span>"
//         );
//       }
//     },
//   });
//   $(".card-footer-right").css("display", "block");
//   //$('.btn-submit-nuevo-pedido').html('<a class="btn btn-orange" href="'+$('#url').val()+'venta/orden/'+id_pedido+'">Continuar <i class="fas fa-arrow-right"></i></a>');
//   $(".btn-submit-dividir-cuenta").html(
//     '<a class="btn btn-blue btnDividirCuenta" id="btnDividirCuenta" data-id-pedido="' +
//       id_pedido +
//       '" data-id-mesa="' +
//       cod_mesa +
//       '" href="javascript:void(0);"><i class="far fa-file-alt"></i></a>'
//   );

//   $(".btn-agregar-productos").html(
//     '<a class="btn btn-blue btnAgregarProdcuto" id="btnAgregarProdcuto" data-id-pedido="' +
//       id_pedido +
//       '" data-id-mesa="' +
//       cod_mesa +
//       '" href="javascript:void(0);"><i class="icon-plus"></i></a>'
//   );

//   $(".btn_cancelar_pedido").html(
//     '<a class="btn btn-danger btnCancelarPedido" id="btnCancelarPedido" data-id-pedido="' +
//       id_pedido +
//       '" data-id-mesa="' +
//       cod_mesa +
//       '" href="javascript:void(0);"><i class="fas fa-times-circle"></i></a>'
//   );

//   $("#btnDividirCuenta").on("click", function (event) {
//   event.preventDefault();

//   selectionMode = !selectionMode;

//   if (selectionMode) {

//     $(this).text("Desactivar");
//     $("#list-pedidos").addClass("selection-mode");
//     $(".selection-counter").removeClass("d-none");
//     $(".full-quantity").addClass("d-none");

//     $("#list-pedidos .comment-list").each(function () {
//       const $item = $(this);
//       const maxQty = $item.data("quantity") || 0;

//       $item.attr("data-selected", 0);
//       $item.find(".selection-counter").text(`0/${maxQty}`);

//       $item.find(".price").text(`${moneda} ${formatNumber(0)}`);
//     });

//     let monto_descuento = $("#descuento_monto_fijo").val();
//     let monto_delivery = $("#comision_delivery").val();

//     $("#pago_efe").val(formatNumber(0));
//     $(".SubtotalPedido").text(`${formatNumber(0)}`);
//     $(".totalDelivery").text(`${formatNumber(monto_delivery)}`);
//     $(".totalDescuento").text(`${formatNumber(monto_descuento)}`);
//     $(".totalPedidoMenosTarjeta").text(`${formatNumber(0)}`);
//     TotalPedido = 0;

//   } else {
//     // Salir de modo selección: restaurar valores originales
//     $(this).text("Activar selección");
//     $("#list-pedidos").removeClass("selection-mode");
//     $(".selection-counter").addClass("d-none");
//     $(".full-quantity").removeClass("d-none");

//     let globalTotal = 0;

//     $("#list-pedidos .comment-list").each(function () {
//       const $item     = $(this);
//       const maxQty    = $item.data("quantity")    || 0;
//       const unitPrice = parseFloat($item.data("price")) || 0;

//       // limpia selección
//       $item.removeClass("selected");
//       $item.attr("data-selected", 0);

//       // restaura cantidad mostrada
//       $item.find(".full-quantity").text(maxQty);

//       // calcula y restaura precio total por ítem
//       const itemTotal = maxQty * unitPrice;
//       $item.find(".price").text(`${moneda} ${formatNumber(itemTotal)}`);

//       // acumula para subtotal global
//       globalTotal += itemTotal;
//     });

//     let monto_descuento = $("#descuento_monto_fijo").val();
//     let monto_delivery = $("#comision_delivery").val();

//     total_pedido = globalTotal - monto_descuento + parseFloat(monto_delivery);

//     $("#pago_efe").val(formatNumber(globalTotal));
//     $(".totalPedidoMenosTarjeta").text(formatNumber(globalTotal));

//     $("#pago_efe").val(formatNumber(0));
//     $(".SubtotalPedido").text(`${formatNumber(globalTotal)}`);
//     $(".totalDelivery").text(`${formatNumber(monto_delivery)}`);
//     $(".totalDescuento").text(`${formatNumber(monto_descuento)}`);
//     $(".totalPedidoMenosTarjeta").text(`${formatNumber(total_pedido)}`);

//     TotalPedido = globalTotal;

//   }
// });

//   $("#btnAgregarProdcuto").on("click", function (event) {
//     event.preventDefault();
//     var id_pedido = $(this).data("id-pedido");

//     listarPedidosMozo(id_pedido);
//   });

//   $("#btnCancelarPedido").on("click", function (event) {
//     event.preventDefault(); // Evitar redirección
//     var id_pedido = $(this).data("id-pedido");

//     cancelarPedido(id_pedido, cod_mesa, id_tipo_pedido);

//   });

//   $(".btn-submit-cobrar").html(
//     '<a class="btn btn-green btnCobrar" id="btnCobrar" data-id-pedido="' +
//       id_pedido +
//       '" data-id-mesa="' +
//       cod_mesa +
//       '" href="javascript:void(0);">Cobrar <i class="far fa-money-bill-alt"></i></a>'
//   );
//   $("#btnCobrar").on("click", function (event) {
//     event.preventDefault(); // Evitar redirección
//     var id_pedido = $(this).data("id-pedido");
//     //facturar(id_pedido, 1, id_tipo_pedido);
//     procesarData(id_pedido);
//   });

//   if(id_tipo_pedido !== 3){
//     $("#openDialogBtnDelivery").hide();
//   }

//   $("#openDialog").show();

//   listarComandas(id_pedido);

// };

var listarPedidos = function (
  cod_salon,
  cod_mesa,
  id_tipo_pedido,
  id_pedido,
  mesa,
  salon,
  estado
) {
  if (isLoadingPedidos) return;
  isLoadingPedidos = true;

  if (ajaxListarPedidos && ajaxListarPedidos.readyState !== 4) {
    ajaxListarPedidos.abort();
  }

  console.log("ID Pedido:", id_pedido);
  $(".ticket_reparto").hide();
  $("#cliente_documento").val("");

  selectionMode = false;

  reset_default();
  setPedidoContexto({
    tipoPedido: id_tipo_pedido,
    idPedido: id_pedido,
    idMesa: cod_mesa,
    mesa: mesa,
    salon: salon,
    idSalon: cod_salon,
    codSalonOrigen: cod_salon,
    codMesaOrigen: cod_mesa,
  });
  $(".card_height").css("background", "#ffffff");
  $(".card-body-right").css("display", "block");
  $(".display-opciones-pedido").hide();
  $(".static-list-pedidos").hide();
  $("#content_pagos").show();
  $("#payment-inputs-top").show();
  $(".card-footer-right").show();
  $("#tipo_pago").trigger("change");

  if (id_tipo_pedido == 1) {
    $(".pedido-numero-icono").html("");
    $(".pedido-numero").html(
      `${salon} - Mesa: <span class="ml-2">${mesa}</span>`
    );
  }

  $(".cont03").css("display", "block");

  $(".imprimir_precuenta")
    .off("click")
    .on("click", function () {
      impPreCuenta(id_pedido, cod_mesa, estado, true);
    });

  const doc_defecto = $("#tipo_doc_defecto").val().trim();
  docDefecto(doc_defecto);

  $("#tipo_pago").prop("selectedIndex", 0).trigger("change");
  $("#list-pedidos").empty();
  $(".venta_por_consumo").prop("checked", false).triggerHandler("click");
  limpiarComisionTarjeta();
  limpiarDescuentos();

  ajaxListarPedidos = $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/listarPedidos",
    data: {
      id_pedido: id_pedido,
      codpagina: $("#codpagina").val(),
    },
    success: function (data) {
      var totPed = 0,
        total = 0;

      if (data.length != 0) {
        $.each(data, function (i, item) {
          const id = item.id_pedido;
          const pres = item.id_pres;

          //   const exists =
          //     $("#list-pedidos").find(`[data-id='${id}'][data-product='${pres}']`).length > 0;
          //   if (exists) return;

          $("#nombre_mozo").val(item.nombre_mozo);
          $(".pedido-mozo")
            .show()
            .attr("data-original-title", "Mozo: " + item.nombre_mozo);

          totPed = item.cantidad * item.precio;

          let selectionCounter = `
            <span class="selection-counter ${selectionMode ? "" : "d-none"
            }">0/${item.cantidad}</span>
            <span class="full-quantity ${selectionMode ? "d-none" : ""}">${item.cantidad
            }</span>
          `;

          const esHotelero = parseInt(item.es_hotelero) === 1 || parseInt(item.Producto.prod_es_hotelero) === 1;
          const badgeHotelero = esHotelero
            ? `<span class="badge-hotelero" title="Producto hotelero - no facturable" style="background:#f59e0b;color:#fff;border-radius:4px;font-size:10px;padding:1px 5px;margin-left:4px;cursor:pointer;" data-id="${id}" data-pres="${pres}" data-precio="${item.precio}" data-hotelero="1" onclick="event.stopPropagation();toggleHotelero(this)">HOTELERO</span>`
            : `<span class="badge-hotelero" title="Marcar como hotelero" style="background:#e5e7eb;color:#6b7280;border-radius:4px;font-size:10px;padding:1px 5px;margin-left:4px;cursor:pointer;" data-id="${id}" data-pres="${pres}" data-precio="${item.precio}" data-hotelero="0" onclick="event.stopPropagation();toggleHotelero(this)">hotel</span>`;

          const html = `
            <div class="d-flex flex-row comment-list" data-id="${id}" data-quantity="${item.cantidad
            }" data-product="${pres}" data-price="${item.precio}" data-hotelero="${esHotelero ? 1 : 0}"
                onclick="subPedido(1, ${id}, ${pres}, '${item.precio}');">
              <div class="w-100 d-flex justify-content-between align-items-end r-order-item">
                <div class="r-details">
                  <p class="order-name mb-0">
                    ${item.Producto.pro_pre}
                    <span class="r-order-type-label" style="margin-left:.6rem">${item.Producto.pro_nom
            }</span>
                    ${badgeHotelero}
                  </p>
                  <p class="order-units m-b-0 font-13">
                    ${selectionCounter} Unidad(es) en ${moneda} ${formatNumber(
              item.precio
            )} | Unidad
                  </p>
                </div>
                <div class="price">${moneda} ${formatNumber(totPed)}</div>
              </div>
            </div>
          `;

          $("#list-pedidos").append(html);
          total += totPed;

          // if (item.tipo_cliente != null) {
          //  if(item.tipo_cliente == 1){
          //     let clienteInfo = `DNI: ${item.cliente_dni} | ${item.cliente_nombres}`;
          //     $("#buscar_cliente").val(clienteInfo);
          //   }else{
          //     let clienteInfo = `RUC: ${item.cliente_ruc} | ${item.cliente_razon_social}`;
          //     $("#buscar_cliente").val(clienteInfo);
          //   }

          //   $("#cliente_id").val(item.cliente_id);
          // }
        });

        TotalPedido = total;

        $(".totalPagar").html(
          `<div class="text"><span>${moneda} ${formatNumber(total)}</span>`
        );

        $(".totalDelivery").text(formatNumber(0));
        $(".totalDescuento").text(formatNumber(0));
        $(".SubtotalPedido").text(formatNumber(total));
        $("#pago_efe").val(formatNumber(total));
        $(".totalPedidoMenosTarjeta").text(formatNumber(total));
      } else {
        $("#list-pedidos").html(`
          <div class="justify-center" style="height: 100%;">
            <div class="text-center">
              <h2><i class="fas fa-shopping-basket display-4" style="color: #d3d3d3;"></i></h2>
              <h4 style="color: #d3d3d3;">Agregue productos</h4>
              <h6 style="color: #d3d3d3;">No se encontraron productos</h6>
            </div>
          </div>
        `);
        limpiar_resumen_pago();
      }
    },
    complete: function () {
      isLoadingPedidos = false;
    },
  });

  $(".card-footer-right").css("display", "block");

  $(".btn-submit-dividir-cuenta").html(
    `<a class="btn btn-blue btnDividirCuenta" id="btnDividirCuenta" data-id-pedido="${id_pedido}" data-id-mesa="${cod_mesa}" href="javascript:void(0);"><i class="far fa-file-alt"></i></a>`
  );

  $(".btn-agregar-productos").html(
    `<a class="btn btn-blue btnAgregarProdcuto" id="btnAgregarProdcuto" data-id-pedido="${id_pedido}" data-id-mesa="${cod_mesa}" href="javascript:void(0);"><i class="icon-plus"></i></a>`
  );

  $(".btn_cancelar_pedido").html(
    `<a class="btn btn-danger btnCancelarPedido" id="btnCancelarPedido" data-id-pedido="${id_pedido}" data-id-mesa="${cod_mesa}" href="javascript:void(0);"><i class="fas fa-times-circle"></i></a>`
  );

  $("#btnDividirCuenta").on("click", function (event) {
    event.preventDefault();
    selectionMode = !selectionMode;

    if (selectionMode) {
      $(this).text("Desactivar");
      $("#list-pedidos").addClass("selection-mode");
      $(".selection-counter").removeClass("d-none");
      $(".full-quantity").addClass("d-none");

      $("#list-pedidos .comment-list").each(function () {
        const $item = $(this);
        const maxQty = $item.data("quantity") || 0;
        $item.attr("data-selected", 0);
        $item.find(".selection-counter").text(`0/${maxQty}`);
        $item.find(".price").text(`${moneda} ${formatNumber(0)}`);
      });

      let monto_descuento = $("#descuento_monto_fijo").val();
      let monto_delivery = $("#comision_delivery").val();
      $("#pago_efe").val(formatNumber(0));
      $(".SubtotalPedido").text(`${formatNumber(0)}`);
      $(".totalDelivery").text(`${formatNumber(monto_delivery)}`);
      $(".totalDescuento").text(`${formatNumber(monto_descuento)}`);
      $(".totalPedidoMenosTarjeta").text(`${formatNumber(0)}`);
      TotalPedido = 0;
    } else {
      $(this).html('<i class="far fa-file-alt"></i>');
      $("#list-pedidos").removeClass("selection-mode");
      $(".selection-counter").addClass("d-none");
      $(".full-quantity").removeClass("d-none");

      let globalTotal = 0;
      $("#list-pedidos .comment-list").each(function () {
        const $item = $(this);
        const maxQty = $item.data("quantity") || 0;
        const unitPrice = parseFloat($item.data("price")) || 0;
        $item.removeClass("selected").attr("data-selected", 0);
        $item.find(".full-quantity").text(maxQty);
        const itemTotal = maxQty * unitPrice;
        $item.find(".price").text(`${moneda} ${formatNumber(itemTotal)}`);
        globalTotal += itemTotal;
      });

      let monto_descuento = $("#descuento_monto_fijo").val();
      let monto_delivery = $("#comision_delivery").val();
      total_pedido = globalTotal - monto_descuento + parseFloat(monto_delivery);

      $("#pago_efe").val(formatNumber(globalTotal));
      $(".totalPedidoMenosTarjeta").text(formatNumber(globalTotal));
      $("#pago_efe").val(formatNumber(0));
      $(".SubtotalPedido").text(`${formatNumber(globalTotal)}`);
      $(".totalDelivery").text(`${formatNumber(monto_delivery)}`);
      $(".totalDescuento").text(`${formatNumber(monto_descuento)}`);
      $(".totalPedidoMenosTarjeta").text(`${formatNumber(total_pedido)}`);
      TotalPedido = globalTotal;
    }
  });

  $(".btn-agregar-productos").show();

  $("#btnAgregarProdcuto").on("click", function (event) {
    event.preventDefault();
    listarPedidosMozo(id_pedido, mesa, salon, cod_mesa, cod_salon);
  });

  $("#btnCancelarPedido").on("click", function (event) {
    event.preventDefault();
    cancelarPedido($(this).data("id-pedido"), cod_mesa, id_tipo_pedido);
  });

  $(".btn-submit-cobrar").html(
    `<a class="btn btn-green btnCobrar" id="btnCobrar" data-id-pedido="${id_pedido}" data-id-mesa="${cod_mesa}" href="javascript:void(0);">Cobrar <i class="far fa-money-bill-alt"></i></a>`
  );

  $("#btnCobrar").on("click", function (event) {
    event.preventDefault();
    if ($(this).hasClass('disabled-proc')) return;
    $(this).addClass('disabled-proc');
    // Re-enable after 2 seconds just in case it was just opening a modal
    setTimeout(() => { $(".btnCobrar").removeClass('disabled-proc'); }, 2000);
    procesarData($(this).data("id-pedido"));
  });

  if (id_tipo_pedido !== 3) {
    $("#openDialogBtnDelivery").hide();
  }

  $("#openDialog").show();
  listarComandas(id_pedido);
};

function esDispositivoMovil() {
  return /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
    navigator.userAgent
  );
}

function limpiarComisionTarjeta() {
  $(".comision_tarjeta_venta").prop("checked", false).triggerHandler("click");
  $(".comisionTarjeta").text(formatNumber(0));
}

function listarPedidosMozo(id_pedido, mesa, salon, id_mesa, id_salon) {
  const contextoPrevio = getPedidoContextoActual();
  const contextoMesa = setPedidoContexto({
    tipoPedido: 1,
    idPedido: id_pedido,
    idMesa:
      id_mesa != null && id_mesa !== ""
        ? id_mesa
        : contextoPrevio.idMesa || contextoPrevio.codMesaOrigen,
    mesa: mesa != null ? mesa : contextoPrevio.mesa,
    salon: salon != null ? salon : contextoPrevio.salon,
    idSalon:
      id_salon != null && id_salon !== ""
        ? id_salon
        : contextoPrevio.idSalon || contextoPrevio.codSalonOrigen,
    codSalonOrigen:
      id_salon != null && id_salon !== ""
        ? id_salon
        : contextoPrevio.codSalonOrigen || contextoPrevio.idSalon,
    codMesaOrigen:
      id_mesa != null && id_mesa !== ""
        ? id_mesa
        : contextoPrevio.codMesaOrigen || contextoPrevio.idMesa,
  });

  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/listarPedidos",
    data: {
      id_pedido: id_pedido,
      codpagina: $("#codpagina").val(),
    },
    success: function (data) {
      pedidoSeleccionado = data;

      if (data.length != 0) {
        const arregloExtraido = data.map((item) => {
          const {
            Producto,
            cantidad,
            precio,
            id_pres,
            fecha_pedido,
            estado_pedido,
            id_pedido,
          } = item;
          const total = parseFloat(cantidad) * parseFloat(precio);
          const pro_img = "default.png";

          return {
            ...Producto,
            id_pedido,
            fecha_pedido,
            estado_pedido,
            cantidad,
            id_pres,
            pro_cos: precio,
            pro_img,
            total,
          };
        });

        $(".po-items").empty();
        setPedidoContexto({
          tipoPedido: 1,
          idPedido: id_pedido,
          idMesa: contextoMesa.idMesa,
          mesa: contextoMesa.mesa,
          salon: contextoMesa.salon,
          idSalon: contextoMesa.idSalon,
          codSalonOrigen: contextoMesa.codSalonOrigen,
          codMesaOrigen: contextoMesa.codMesaOrigen,
        });

        arregloExtraido.forEach((producto) => {
          agregarProducto(producto, false, id_pedido);
        });

        if ($("#rol_usr").val() == 5) {
          $(".card_height ").css("display", "none");
        }

        if (esDispositivoMovil()) {
          setMobileOrderPanel(true);
        }

        // Restore payment UI (Ensures visibility after async load)
        $('#content_pagos').show();
        $('#payment-inputs-top').show();
        $('.card-footer-right').show();
        $('#tipo_pago').trigger('change');

        $("#btn_cancelar_pedido_mozo")
          .off("click")
          .on("click", function (event) {
          event.preventDefault();

          console.log(pedidoSeleccionado);

          cancelarPedido(
            pedidoSeleccionado[0].id_pedido,
            contextoMesa.idMesa,
            1
          );
        });

        listarComandas(id_pedido);

        $("#modal-super-test").modal("show");
      }
    },
  });
}
// inicio: MODAL DIALOG - comisiones, descuentos y promociones
const dialog = document.querySelector(".dialogBtn");
const showButton = document.querySelector(".openDialogBtn");
const closeButton = document.querySelector(".closeDialogBtn");

if (showButton && dialog) {
  showButton.addEventListener("click", () => {
    if (typeof aplicarEstadoDescuentoModal === "function") {
      aplicarEstadoDescuentoModal($("#tipo_descuento_select").val(), {
        showAlerts: false,
      });
    }
    dialog.showModal();
  });
}

if (closeButton && dialog) {
  closeButton.addEventListener("click", () => {
    dialog.close();
  });
}
// fin: MODAL DIALOG - comisiones, descuentos y promociones

// inicio: MODAL DIALOG - delivery
// const dialogDelivery = document.querySelector(".dialogBtnDelivery");
// const showButtonDelivery = document.querySelector(".openDialogBtnDelivery");
// const closeButtonDelivery = document.querySelector(".closeDialogBtnDelivery");

// showButtonDelivery.addEventListener("click", () => {
//   dialogDelivery.showModal();
// });

// closeButtonDelivery.addEventListener("click", () => {
//   dialogDelivery.close();
// });
// fin: MODAL DIALOG - delivery

var conf_dividir = function (id_pedido, dividir_cuenta) {
  Swal.fire({
    title: "Confirmación",
    html: "¿Desea dividir cuenta?",
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
  }).then((result) => {
    if (result.value) {
      facturar(id_pedido, dividir_cuenta);
    } else if (result.dismiss === Swal.DismissReason.cancel) {
      return false;
    }
  });
};

var facturar = function (id_pedido, dividir_cuenta, id_tipo_pedido) {
  $("#btn-submit-facturar").removeAttr("disabled");
  $("#list-items-facturar").empty();
  $("#id_pedido").val(id_pedido);
  $("#dividir_cuenta").val(dividir_cuenta);
  var tipo_pedido = $("#codtipoped").val();
  var moneda = $("#moneda").val();

  defaultdata(id_pedido, id_tipo_pedido);

  $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/ListarDetallePed",
    data: {
      id_pedido: id_pedido,
      tipo_pedido: tipo_pedido,
    },
    success: function (data) {
      var sub_total = 0;
      var total = 0;
      var precio_imp_bol = 0;

      $.each(data.Detalle, function (i, item) {
        var totped = $("#total_pedido").val();
        var imp_bol = $("#imp_icbper").val();

        if (item.Producto.impuesto_icbper == "1") {
          precio_imp_bol =
            parseFloat(item.cantidad * imp_bol) + parseFloat(precio_imp_bol);
        } else {
          precio_imp_bol = parseFloat(precio_imp_bol);
        }

        var calc = (item.cantidad * item.precio).toFixed(2);
        sub_total =
          parseFloat(item.cantidad * precio_imp_bol) + parseFloat(sub_total);

        total = parseFloat(sub_total) + parseFloat(total);

        if (1 == dividir_cuenta && item.cantidad > 0) {
          $(".icbper").text(formatNumber(imp_bol));
          $(".totalPedido").val(totped);
          $(".totalPedido").text(formatNumber(totped));
          $(".subtotal").text(formatNumber(totped));
          $("#total_venta").val(totped);
          $(".btn-cancel-facturar-1").show();
          $(".btn-cancel-facturar-2").hide();
          calculo_total();
          calculo_efectivo();
          $("#list-items-facturar").append(
            $('<tr class="comment-list"/>')
              .append(
                $('<td width="20%"/>').html(
                  '<input type="hidden" name="cantProd[]" value="' +
                  item.cantidad +
                  '"/>' +
                  '<input type="hidden" name="precProd[]" value="' +
                  item.precio +
                  '"/>' +
                  item.cantidad
                )
              )
              .append(
                $('<td width="60%"/>').html(
                  '<input type="hidden" name="idProd[]" value="' +
                  item.id_pres +
                  '"/>' +
                  item.Producto.pro_nom +
                  ' <span class="label label-warning text-uppercase">' +
                  item.Producto.pro_pre +
                  "</span>"
                )
              )
              .append(
                $('<td width="20%" class="text-right"/>').html(
                  moneda + " " + formatNumber(calc)
                )
              )
          );
        } else if (2 == dividir_cuenta && item.cantidad > 0) {
          limpiar_datos_add();
          $(".display-pago-rapido-efectivo").show();
          $(".totalPedido").val("0.00");
          $(".totalPedido").text("0.00");
          $("#total_venta").val("0.00");
          $(".subtotal").text("0.00");
          $(".btn-cancel-facturar-1").hide();
          $(".btn-cancel-facturar-2").show();
          calculo_total();
          $(".opc-01").text("0.00");
          $("#list-items-facturar").append(
            $(
              '<tr class="comment-list priceU" data-price="' +
              item.precio +
              '" style="cursor: pointer;"/>'
            )
              .append(
                $('<td width="20%"/>').html(
                  '<input type="hidden" class="cantidad" name="cantProd[]" value="0"/>' +
                  '<input type="hidden" name="precProd[]" value="' +
                  item.precio +
                  '"/>' +
                  '<input type="hidden" value="' +
                  item.cantidad +
                  '" class="cantOrg"/>' +
                  '<input type="hidden" value="1" class="cantTemp"/>' +
                  "<b></b> " +
                  item.cantidad
                )
              )
              .append(
                $('<td width="60%"/>').html(
                  '<input type="hidden" name="idProd[]" value="' +
                  item.id_pres +
                  '"/>' +
                  item.Producto.pro_nom +
                  ' <p class="label label-warning text-uppercase">' +
                  item.Producto.pro_pre +
                  "</p>"
                )
              )
              .append(
                $('<td width="20%" class="text-right"/>').html(
                  moneda + " <span>0.00</span>"
                )
              )
          );
        }
      });

      $(".subtotal").text(formatNumber(sub_total));
      $(".icbper").text(formatNumber(precio_imp_bol));
      $("#monto_icbper").val(parseFloat(precio_imp_bol));

      $(".priceU").on("click", function () {
        var totalTemp = $(this).find(".cantTemp").val();
        $(this).css(
          "cssText",
          "background: #e9f1f8 !important; color: #2f4f74 !important; cursor: pointer;"
        );
        $(this)
          .find(".cantTemp")
          .val(parseInt(totalTemp) + 1);
        var totalCant = $(this).find(".cantOrg").val();
        var cantB = parseInt(totalCant) - 1;
        $(this)
          .find("b")
          .text(totalTemp + " /");
        var valorItem = $(this).find("span").text();
        var valorPrice = $(this).attr("data-price");
        var totalItem = (
          parseFloat(valorItem) + parseFloat(valorPrice)
        ).toFixed(2);
        $(this).find("span").text(totalItem);
        var totalGneral = 0;
        $(this).find(".cantidad").val(totalTemp);
        if (parseInt(totalCant) < parseInt(totalTemp)) {
          $(this).find(".cantTemp").val(1);
          $(this).css(
            "cssText",
            "background: transparent !important; cursor:pointer;"
          );
          $(this).find("span").text("0.00");
          $(this).find("b").text("");
          $(this).find(".cantidad").val(0);
        }
        $(".priceU").each(function () {
          totalGneral += parseFloat($(this).find("span").text());
        });
        $(".totalPedido").val(totalGneral.toFixed(2));
        $(".totalPedido").text(formatNumber(totalGneral));
        $(".totalPedidoMenosTarjeta").text(formatNumber(totalGneral));
        $("#total_venta").val(totalGneral);
        $(".subtotal").text(formatNumber(totalGneral));
        $("#btn-submit-facturar").removeAttr("disabled");
        $("#btn-submit-facturar").removeClass("disabled");
        limpiar_datos_add();
        $("#pago_efe").val(totalGneral.toFixed(2));
        $(".opc-01").text(totalGneral.toFixed(2));
      });
    },
    error: function (jqXHR, textStatus, errorThrown) {
      console.log(errorThrown + " " + textStatus);
    },
  });
  $("#modal-facturar").modal("show");
};

var defaultdata = function (id_pedido, id_tipo_pedido) {
  $.ajax({
    async: false,
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/defaultdata",
    data: {
      id_pedido: id_pedido,
      tipo_pedido: id_tipo_pedido,
    },
    success: function (data) {
      var sbtot = 0;
      var total = 0;

      var imp_bol = $("#imp_icbper").val();
      $.each(data.Detalle, function (i, item) {
        var precio_imp_bol = 0;

        if (item.impuesto_icbper == "1") {
          precio_imp_bol = parseFloat(item.precio) + parseFloat(imp_bol);
        } else {
          precio_imp_bol = item.precio;
        }

        var importe = parseFloat(item.cantidad * precio_imp_bol);
        if (item.estado != "i" && item.cantidad > 0) {
          sbtot = parseFloat(importe) + parseFloat(sbtot);
        }
      });

      total = parseFloat(sbtot) + parseFloat(total);

      $("#totalPagar").text(moneda + " " + formatNumber(total));
      $(".totalPagar").text(moneda + " " + formatNumber(total));
      $("#total_pedido").val(total.toFixed(2));
      $("#pago_efe").val(formatNumber(total));
      $(".opc-01").text(formatNumber(total));
      $(".totalPedidoMenosTarjeta").text(formatNumber(total));

      $(".opcion-cliente").html(
        '<a class="input-group-prepend" href="javascript:void(0)"' +
        'onclick="nuevoClienteVista();" data-original-title="Registrar nuevo cliente" data-toggle="tooltip"' +
        'data-placement="top">' +
        '<span class="input-group-text bg-header">' +
        '<small><i class="fas fa-user-plus"></i></small>' +
        "</span>" +
        "</a>"
      );

      if (total != "0.00") {
        if (data.id_tipo_pedido == 3) {
          // if(data.estado_pedido != 'a'){
          //     $('#list-productos').css('visibility','hidden');
          //     $('.opc1').css('display','block');
          //     $('.opc2').css('display','none');
          // } else {
          $(".opc1").css("display", "none");
          $(".opc2").css("display", "none");
          $(".opc3").css("display", "block");
          if ($("#rol_usr").val() == 5) {
            $(".opc1").css("display", "block");
          }
          // }
        } else {
          $(".opc1").css("display", "block");
          $(".opc2").css("display", "none");
        }
      } else {
        $(".opc1").css("display", "none");
        $(".opc2").css("display", "block");
      }

      if (data.id_tipo_pedido == 1) {
        $(".pedido-numero-icono").text("");
        $(".pedido-cliente-icono").removeClass("far fa-user");
        $(".pedido-numero").text(data.desc_salon);
        $("#nombre_salon").val(data.desc_salon);
        $("#nombre_mozo").val(data.nombre_mozo);
        $(".pedido-cliente").text("MESA: " + data.nro_mesa);
        // if($("#print_pre").val() == 1){ // impresion por comanda
        //     $('.btn-imp').html('<a href="'+$("#url").val()+'venta" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de mesas"><i class="fas fa-desktop"></i></a> <button onclick="impPreCuenta('+data.id_pedido+','+data.id_mesa+',\''+data.estado_mesa+'\')" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Imprimir pre cuenta"><i class="fas fa-print"></i></button>');
        // }else{ // impresion por view print
        //     $('.btn-imp').html('<a href="'+$("#url").val()+'venta" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de mesas"><i class="fas fa-desktop"></i></a> <button  onclick="impPreCuenta('+data.id_pedido+','+data.id_mesa+',\''+data.estado_mesa+'\',true)" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Imprimir pre cuenta"><i class="fas fa-print"></i></button>');
        // }
        if ($("#print_pre").val() == 1) {
          // impresion por comanda
          $(".btn-imp").html(
            '<a href="' +
            $("#url").val() +
            'venta" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de mesas"><i class="fas fa-desktop"></i></a> <button onclick="impPreCuenta(' +
            data.id_pedido +
            "," +
            data.id_mesa +
            ",'" +
            data.estado_mesa +
            '\')" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Imprimir pre cuenta"><i class="fas fa-print"></i></button> <div class="btn-group" data-toggle="tooltip" title="Imprimir Comanda"><button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-print"></i></button><div class="dropdown-menu" id="list-comandas"></div></div>'
          );
        } else {
          // impresion por view print
          $(".btn-imp").html(
            '<a href="' +
            $("#url").val() +
            'venta" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de mesas"><i class="fas fa-desktop"></i></a> <button  onclick="impPreCuenta(' +
            data.id_pedido +
            "," +
            data.id_mesa +
            ",'" +
            data.estado_mesa +
            '\',true)" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Imprimir pre cuenta"><i class="fas fa-print"></i></button> <div class="btn-group" data-toggle="tooltip" title="Imprimir Comanda"><button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-print"></i></button><div class="dropdown-menu" id="list-comandas"></div></div>'
          );
        }
        $("#cliente_id").val(1);
        $("#cliente_documento").val("");
        $("#buscar_cliente").val("DNI: 00000000 | PUBLICO EN GENERAL");
      } else if (data.id_tipo_pedido == 2 || data.id_tipo_pedido == 3) {
        $(".pedido-numero-icono").text("Pedido: ");
        $(".pedido-cliente-icono").addClass("far fa-user");
        $(".pedido-numero").text(data.nro_pedido);
        $("#btn-confirmar").text("AÑADIR");
        if (data.id_tipo_pedido == 2) {
          $(".pedido-cliente").text(data.nombre_cliente);
          $(".btn-imp").html(
            '<a href="' +
            $("#url").val() +
            "venta?tip=2&cod=" +
            $("#codped").val() +
            "&est=" +
            data.estado_pedido +
            '" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de ventas"><i class="fas fa-desktop"></i></a>'
          );
          $("#cliente_id").val(1);
          $("#cliente_documento").val("");
          $("#buscar_cliente").val("DNI: 00000000 | PUBLICO EN GENERAL");
        } else if (data.id_tipo_pedido == 3) {
          //$('.mensaje-pago-2-text').html('PAGA CON: S/'+data.paga_con+'<br>COMISION DELIVERY: S/'+data.comision_delivery);

          $(".comision_delivery").val(data.comision_delivery);
          $(".comision_delivery").text(formatNumber(data.comision_delivery));
          $("#pago_efe").val(formatNumber(data.paga_con));
          $(".opc-01").text(
            formatNumber(parseFloat(total) + parseFloat(data.comision_delivery))
          );
          var tipo_entrega = data.tipo_entrega == 1 ? "c" : "d";
          $("#codtipopedentrega").val(tipo_entrega);
          if (data.estado_pedido == "a") {
            $(".btn-imp").html(
              '<a href="' +
              $("#url").val() +
              "venta?tip=3&cod=" +
              $("#codped").val() +
              "&est=" +
              data.estado_pedido +
              '" class="btn btn-orange" data-toggle="tooltip" data-placement="top" data-original-title="Continuar">Continuar <i class="fas fa-arrow-right"></i></a>'
            );
          } else if (data.estado_pedido == "b") {
            $(".btn-imp").html(
              '<a href="' +
              $("#url").val() +
              "venta?tip=3&cod=" +
              $("#codped").val() +
              "&est=" +
              data.estado_pedido +
              '" class="btn btn-inverse" data-toggle="tooltip" data-placement="top" data-original-title="Monitor de ventas"><i class="fas fa-desktop"></i></a>'
            );
          } else {
            $("#list-productos").css("visibility", "hidden");
          }
          //$('.pedido-cliente').text(data.desc_repartidor);
          $(".pedido-cliente").text(data.nombre_cliente.substr(0, 13));
          $("#cliente_id").val(data.id_cliente);
          $("#cliente_tipo").val(data.tipo_cliente);
          $("#tipo_cliente").val(data.tipo_cliente);
          var tipo =
            data.tipo_cliente == 1 ? $("#diAcr").val() : $("#tribAcr").val();
          $("#buscar_cliente").val(
            tipo +
            ": " +
            data.dni_cliente +
            "" +
            data.ruc_cliente +
            " | " +
            data.nombre_cliente
          );
          //$('#buscar_cliente').val('PUBLICO EN GENERAL');
          $(".opcion-cliente").html(
            '<a class="input-group-prepend" href="javascript:void(0)"' +
            'onclick="editar_cliente(' +
            data.id_cliente +
            ');" data-original-title="Editar cliente" data-toggle="tooltip"' +
            'data-placement="top">' +
            '<span class="input-group-text bg-header">' +
            '<small><i class="fas fa-user text-info"></i></small>' +
            "</span>" +
            "</a>"
          );
        }
      }

      if (data.tipo_cliente == 2) {
        $(".btn-tipo-doc-2").addClass("active");
        $("input[name=tipo_doc][value='2']").attr("checked", true);
      } else {
        $(".btn-tipo-doc-1").addClass("active");
        $("input[name=tipo_doc][value='1']").attr("checked", true);

        if ($("input[name=tipo_doc][value='1']").length == false) {
          $(".btn-tipo-doc-3").addClass("active");
          $("input[name=tipo_doc][value='3']").attr("checked", true);
        }
      }

      // $('.btn-tipo-doc-3').addClass('disabled');
      // $("input[name=tipo_doc][value='2']").attr("disabled",false);

      if (data.tipo_pago == 1) {
        $("#tipo_pago").selectpicker("val", data.tipo_pago);
        $(".mensaje-pago").hide();
        $(".display-pago-efectivo").show();
        $(".display-pago-tarjeta").hide();
        $(".display-pago-default").show();
        $(".display-pago-rapido-efectivo").show();
        $(".display-codigo-operacion").hide();
      } else if (
        data.tipo_pago != 3 &&
        (data.tipo_pago == 2 || data.tipo_pago >= 4)
      ) {
        $("#tipo_pago").selectpicker("val", data.tipo_pago);
        $(".mensaje-pago").hide();
        $(".display-pago-efectivo").hide();
        $(".display-pago-tarjeta").hide();
        $(".display-pago-default").hide();
        $(".display-pago-rapido-efectivo").hide();
        $(".display-descuento").show();
        $(".display-codigo-operacion").show();
      } else {
        $("#tipo_pago").selectpicker("val", 1);
        $(".mensaje-pago").hide();
        $(".display-pago-efectivo").show();
        $(".display-pago-tarjeta").hide();
        $(".display-pago-default").show();
        $(".display-pago-rapido-efectivo").show();
        $(".display-codigo-operacion").hide();
      }

      if (data.amortizacion > 0) {
        $(".mensaje-amortizacion").show();
        $(".mensaje-amortizacion-text").html(
          "Existe una amortizaci&oacute;n de pago con un monto de " +
          moneda +
          " " +
          formatNumber(data.amortizacion)
        );
      } else {
        $(".mensaje-amortizacion").hide();
      }

      /*
            if(data.id_repartidor == 1){
                if (data.tipo_pago == 4) {
                    $('.display-comision-delivery').hide();
                } else {
                    $('.display-comision-delivery').show();
                }
            } else {
                $('.display-comision-delivery').hide();
            }
            */
      if (data.tipo_pago == 4) {
        $(".display-comision-delivery").hide();
      } else {
        $(".display-comision-delivery").show();
      }
      $("#codtipoped").val(data.id_tipo_pedido);
      $(".display-comision-tarjeta").hide();

      if (
        data.id_repartidor == 2222 ||
        data.id_repartidor == 3333 ||
        data.id_repartidor == 4444
      ) {
        $("#codrepartidor").val(2);
      } else {
        $("#codrepartidor").val(1);
      }
    },
  });
};

function calcularPagos() {
  actualizarVuelto();
}

var limpiar_datos_add = function () {
  $("#pago_efe").val("0.00");
  $("#pago_tar").val("0.00");
  $("#pago_yape").val("0.00");
  $("#pago_plin").val("0.00");
  $("#pago_tran").val("0.00");
  $("#vuelto").text("0.00");
  $(".descuento").val("0.00");
  $(".descuento").text("0.00");
  $(".comision_delivery").val("0.00");
  $(".comision_delivery").text("0.00");
  $("#observacion").val("");
  $(".comision_tarjeta").val("0.00");
  $(".comision_tarjeta").text("0.00");
  $(".display-pago-efectivo").show();
  $(".display-pago-default").show();
  $(".display-pago-tarjeta").hide();
  $("#descuento_tipo_hidden").val("");
  $("#descuento_monto_hidden").val("0.00");
  $("#descuento_motivo_hidden").val("");
  $("#tipo_pago").selectpicker("val", 1);
  $(".mensaje-pago").hide();
  $(".display-codigo-operacion").hide();
  $(".display-pago-rapido-efectivo").show();
};

var calculo_total = function () {
  if ($("#descuento_monto_hidden").val() == "") {
    $("#descuento_monto_hidden").val("0.00");
  }
  if ($("#comision_delivery").val() == "") {
    $("#comision_delivery").val("0.00");
  }

  var descuento = parseFloat($("#descuento_monto_hidden").val()) || 0.0;
  var comision_delivery = parseFloat($("#comision_delivery").val()) || 0.0;
  var comision_tarjeta = parseFloat($(".comision_tarjeta").val()) || 0.0;

  // #total_venta sólo existe en orden.php; en index.php no está en el DOM.
  // Usamos SubtotalPedido como fallback para que el cálculo funcione en ambas vistas.
  var total_venta = parseFloat($("#total_venta").val()) ||
                    parseMontoSeguro($(".SubtotalPedido").first().text());

  var calculo = total_venta + comision_delivery + comision_tarjeta - descuento;

  $(".totalPedido").val(formatNumber(calculo));
  $(".totalPedido").text(formatNumber(calculo));
  $(".totalPedidoMenosTarjeta").text(formatNumber(calculo));
  if (typeof calculo_efectivo === "function") {
    calculo_efectivo();
  }
};

var calculo_efectivo = function () {
  actualizarVuelto();
};

var opcion_pago_efectivo = function (monto) {
  $("#pago_efe").val(formatNumber(monto));
  calculo_efectivo();
};

var listarPedidosDetalle = function (
  cod_atencion,
  id_pedido,
  id_venta,
  tipo = "manual"
) {
  if (ajaxListarPedidosDetalle && ajaxListarPedidosDetalle.readyState !== 4) {
    ajaxListarPedidosDetalle.abort();
  }

  reset_default();
  limpiarComisionTarjeta();
  limpiarDescuentos();
  //$(".display-delivery").hide();
  $(".card_height").css("background", "#ffffff");
  $(".card-body-right").css("display", "block");
  $(".pedido-numero-icono").html('<i class="ti-arrow-circle-right"></i> ');
  $(".cont03").css("display", "block");
  $('input[name="tipo_doc"]:checked').trigger("change");
  $("#tipo_pago").trigger("change");
  $("#cliente_documento").val("");
  $("#list-pedidos").empty();
  $("#content_pagos").show();
  $("#payment-inputs-top").show();
  $(".card-footer-right").show();

  const doc_defecto = $("#tipo_doc_defecto").val().trim();
  docDefecto(doc_defecto);
  //$("#list-pedidos-detalle").empty();

  selectionMode = false;
  setPedidoContexto({
    tipoPedido: cod_atencion,
    idPedido: id_pedido,
  });

  ajaxListarPedidosDetalle = $.ajax({
    dataType: "JSON",
    type: "POST",
    url: $("#url").val() + "venta/listarPedidosDetalle",
    data: {
      cod_atencion: cod_atencion,
      id_pedido: id_pedido,
    },
    success: function (data) {
      let totPed = 0;
      let total = 0;
      $(".pedido-numero").html(data.nro_pedido);
      $(".pedido-cliente").text(data.nombre_cliente);

      // if(cod_atencion == 3){
      //   console.log("delivery");

      //   $(".ticket_reparto").show();
      // }else{
      //   console.log("no delivery");
      //   $(".ticket_reparto").hide();
      // }

      cod_atencion == 3
        ? $(".ticket_reparto").show()
        : $(".ticket_reparto").hide();

      $(".imprimir_ticket_reparto")
        .off("click")
        .on("click", function () {
          imprimirTickeReparto(id_pedido);
        });

      pedidoSeleccionado = data;

      $.each(data.Detalle, function (i, item) {
        totPed = item.cant * item.precio;

        let selectionCounter = `
          <span class="selection-counter ${selectionMode ? "" : "d-none"}">0/${item.cant
          }</span>
          <span class="full-quantity ${selectionMode ? "d-none" : ""}">${item.cant
          }</span>
        `;

        // Solo si el tipo de pedido es 2, se agrega el onclick
        let onClickAttr = "";
        // if (data.id_tipo_pedido == 2) {
        //   onClickAttr = `onclick="subPedido(1, ${item.id_pedido}, ${item.id_pres}, '${item.precio}');"`;
        // }
        onClickAttr = `onclick="subPedido(1, ${item.id_pedido}, ${item.id_pres}, '${item.precio}');"`;

        const html = `
          <div class="d-flex flex-row comment-list" 
              data-id="${item.id_pedido}" 
              data-quantity="${item.cant}" 
              data-product="${item.id_pres}" 
              data-price="${item.precio}" 
              ${onClickAttr}>
            <div class="w-100 d-flex justify-content-between align-items-end r-order-item">
              <div class="r-details">
                <p class="order-name mb-0">
                  ${item.Producto.pro_pre}
                  <span class="r-order-type-label" style="margin-left:.6rem">
                    ${item.Producto.pro_nom}
                  </span>
                </p>
                <p class="order-units m-b-0 font-13">
                  ${selectionCounter} Unidad(es) en ${moneda} ${formatNumber(
          item.precio
        )} | Unidad
                </p>
              </div>
              <div class="price">
                ${moneda} ${formatNumber(totPed)}
              </div>
            </div>
          </div>
        `;

        $("#list-pedidos").append(html);
        total = totPed + total;
      });

      $(".totalPagar").html(
        '<div class="text"><span>' +
        moneda +
        " " +
        formatNumber(total) +
        "</span>"
      );
      $(".SubtotalPedido").text(formatNumber(total));
      let descuento = $("#comision_delivery").val();
      TotalPedido = total;
      //total += parseFloat(data.comision_delivery) - descuento;

      $("#descuento_monto_fijo").val();

      $(".totalDelivery").text(formatNumber(0));
      $(".totalDescuento").text(formatNumber(0));

      if (data.comision_delivery > 0) {
        $(".totalDelivery").text(formatNumber(data.comision_delivery));
        $("#comision_delivery").val(formatNumber(data.comision_delivery));
        total += parseFloat(data.comision_delivery);
      }

      $(".totalPedidoMenosTarjeta").text(formatNumber(total));
      // #total_venta es el subtotal de productos (sin delivery); calculo_total() suma delivery encima.
      $("#total_venta").val(formatNumber(TotalPedido));
      $("#pago_efe").val(formatNumber(total));

      if ((pedidoSeleccionado.id_tipo_pedido == 2 || pedidoSeleccionado.id_tipo_pedido == 3) && pedidoSeleccionado.estado_pedido == "d") {
        $(".card-footer-right").hide();
        $("#payment-inputs-top").hide();
      } else {
        $(".card-footer-right").show();
        $("#payment-inputs-top").show();
        // Force refresh payment inputs state after items load (fixes TOTAL/VUELTO display for non-cash payments).
        $('#tipo_pago').trigger('change');
      }

      if (
        (pedidoSeleccionado.id_tipo_pedido == 3 &&
          data.estado_pedido != "c" &&
          data.estado_pedido != "d") ||
        (pedidoSeleccionado.id_tipo_pedido == 2 &&
          pedidoSeleccionado.estado_pedido == "a")
      ) {
        $(".btn-submit-dividir-cuenta").html(
          '<a class="btn btn-blue btnDividirCuenta" id="btnDividirCuenta" data-id-pedido="' +
          id_pedido +
          '" href="javascript:void(0);"><i class="far fa-file-alt"></i></a>'
        );
        $("#btnDividirCuenta").on("click", function (event) {
          event.preventDefault();
          limpiarDescuentos();
          selectionMode = !selectionMode;
          if (selectionMode) {
            $(this).text("Desactivar");
            $("#list-pedidos").addClass("selection-mode");
            $(".selection-counter").removeClass("d-none");
            $(".full-quantity").addClass("d-none");
          } else {
            $(this).html('<i class="far fa-file-alt"></i>');
            $("#list-pedidos").removeClass("selection-mode");
            $(".selection-counter").addClass("d-none");
            $(".full-quantity").removeClass("d-none");
            $("#list-pedidos .comment-list").removeClass("selected");
          }
        });
      }

      $(".btn-agregar-productos").html(
        '<a class="btn btn-blue btnAgregarProdcuto" id="btnAgregarProdcuto" data-id-pedido="' +
        id_pedido +
        '" href="javascript:void(0);"><i class="icon-plus"></i></a>'
      );

      $(".btn_cancelar_pedido").html(
        '<a class="btn btn-danger btnCancelarPedido" id="btnCancelarPedido" data-id-pedido="' +
        id_pedido +
        '" href="javascript:void(0);"><i class="fas fa-times-circle"></i></a>'
      );

      $("#btnAgregarProdcuto").on("click", function (event) {
        event.preventDefault();
        var id_pedido = $(this).data("id-pedido");

        addPedido(id_pedido);
      });

      $("#btnCancelarPedido").on("click", function (event) {
        event.preventDefault(); // Evitar redirección
        var id_pedido = $(this).data("id-pedido");

        anular_pedido(id_pedido);
      });

      if (
        pedidoSeleccionado.id_tipo_pedido == 3 &&
        pedidoSeleccionado.estado_pedido == "c"
      ) {
        $("#openDialog").hide();

        $(".btn-submit-cobrar").html(
          '<a class="btn btn-green btnEntregado" id="btnEntregado" data-id-pedido="' +
          id_pedido +
          '" href="javascript:void(0);">Entregado</a>'
        );

        $("#btnEntregado").on("click", function (event) {
          event.preventDefault(); // Evitar redirección
          var id_pedido = $(this).data("id-pedido");
          //facturar(id_pedido, 1, id_tipo_pedido);
          pedidoAccion(3, 2, data.estado_pedido, id_pedido);
        });

        $(".btn-agregar-productos").hide();
        $(".btn_cancelar_pedido").hide();
      } else if (
        pedidoSeleccionado.id_tipo_pedido == 3 &&
        pedidoSeleccionado.estado_pedido == "b"
      ) {
        $("#openDialog").show();
        $(".btn-submit-cobrar").html(
          '<a class="btn btn-green btnCobrar" id="btnCobrar" data-id-pedido="' +
          id_pedido +
          '" href="javascript:void(0);">Cobrar <i class="far fa-money-bill-alt"></i></a>'
        );

        $("#btnCobrar").on("click", function (event) {
          event.preventDefault(); // Evitar redirección
          if ($(this).hasClass('disabled-proc')) return;
          $(this).addClass('disabled-proc');
          setTimeout(() => { $(".btnCobrar").removeClass('disabled-proc'); }, 2000);
          var id_pedido = $(this).data("id-pedido");
          //facturar(id_pedido, 1, id_tipo_pedido);
          procesarData(id_pedido);
        });
        $(".btn-agregar-productos").show();
        $(".btn_cancelar_pedido").show();
      }

      if (pedidoSeleccionado.id_tipo_pedido == 2 && data.estado_pedido == "c") {
        $("#openDialog").hide();

        $(".btn-submit-cobrar").html(
          '<a class="btn btn-green btnEntregado" id="btnEntregado" data-id-pedido="' +
          id_pedido +
          '" href="javascript:void(0);">Entregado</a>'
        );

        $("#btnEntregado").on("click", function (event) {
          event.preventDefault(); // Evitar redirección
          var id_pedido = $(this).data("id-pedido");
          //facturar(id_pedido, 1, id_tipo_pedido);
          pedidoAccion(2, 2, data.estado_pedido, id_pedido);
        });

        $(".btn-agregar-productos").hide();
        $(".btn_cancelar_pedido").hide();
      } else if (
        pedidoSeleccionado.id_tipo_pedido == 2 &&
        data.estado_pedido == "b"
      ) {
        $("#openDialog").show();
        $(".btn-submit-cobrar").html(
          '<a class="btn btn-green btnCobrar" id="btnCobrar" data-id-pedido="' +
          id_pedido +
          '" href="javascript:void(0);">Cobrar <i class="far fa-money-bill-alt"></i></a>'
        );

        $("#btnCobrar").on("click", function (event) {
          event.preventDefault(); // Evitar redirección
          if ($(this).hasClass('disabled-proc')) return;
          $(this).addClass('disabled-proc');
          setTimeout(() => { $(".btnCobrar").removeClass('disabled-proc'); }, 2000);
          var id_pedido = $(this).data("id-pedido");
          //facturar(id_pedido, 1, id_tipo_pedido);
          procesarData(id_pedido);
        });

        $(".btn-agregar-productos").show();
        $(".btn_cancelar_pedido").show();
      }

      if (
        cod_atencion == 3 &&
        data.estado_pedido != "c" &&
        data.estado_pedido != "d"
      ) {
        const $dialog = $(".dialogBtnDelivery");
        $("#openDialogDelivery").show();
        $("#openDialogDelivery").on("click", function (event) {
          event.preventDefault(); // Evitar redirección
          llenarModalDelivery(pedidoSeleccionado);
          $dialog[0].showModal();
          console.log(id_pedido);
        });
        $(".closeDialogBtnDelivery").on("click", function () {
          $dialog[0].close();
        });
      }
    },
    error: function (jqXHR, textStatus, errorThrown) {
      console.log(errorThrown + " " + textStatus);
    },
    complete: function () {
      ajaxListarPedidosDetalle = null;
      if (cod_atencion == 3 && tipo == "automatico") {
        $("#openDialogDelivery").trigger("click");
      }
    },
  });
};

function llenarModalDelivery(data) {
  if (!data) {
    console.error("No hay datos para llenar el modal de delivery.");
    return;
  }

  // Tipo de entrega (radio visual)
  $(".btn-group-toggle .btn").removeClass("active");
  $("#tipo_entrega_" + data.tipo_entrega).prop("checked", true);
  $(".btn-tipo-entrega-" + data.tipo_entrega)
    .closest("label")
    .addClass("active");

  // Hora de entrega
  const $horaSelect = $("#hora_entrega_modal");
  if (
    data.hora_entrega &&
    $horaSelect.find("option[value='" + data.hora_entrega + "']").length > 0
  ) {
    $horaSelect.val(data.hora_entrega);
  } else {
    $horaSelect.val(null);
  }
  $horaSelect.selectpicker("refresh");

  // Inputs normales con trigger para floating labels
  $("#comision_delivery_modal")
    .val(data.comision_delivery || "")
    .trigger("input");
  $("#nomb_cliente_modal")
    .val(data.nombre_cliente || "")
    .trigger("input");
  $("#telefono_cliente_modal")
    .val(data.telefono_cliente || "")
    .trigger("input");
  $("#num_cliente_modal")
    .val(data.tipo_cliente == "1" ? data.dni_cliente : data.ruc_cliente)
    .trigger("input");
  $("#direccion_cliente_modal")
    .val(data.direccion_cliente || "")
    .trigger("input");
  $("#referencia_cliente_modal")
    .val(data.referencia_cliente || "")
    .trigger("input");

  // Selects con selectpicker
  $("#id_tdoc_modal").val(data.tipo_cliente).selectpicker("refresh");
  $("#id_repartidor_modal").val(data.id_repartidor).selectpicker("refresh");
  //$("#id_mozo").val(data.id_usu).selectpicker('refresh');
}

function imprimirTickeReparto(id_pedido) {
  var url = $("#url").val() + "venta/impresion_reparto_pedido/" + id_pedido;
  window.open(url, "_blank");
}

function obtenerDataDeliveryModal() {
  const tipo_entrega = $("input[name='tipo_entrega_modal']:checked").val();
  const tipo_cliente = $("#id_tdoc_modal").val();

  return {
    tipo_entrega: tipo_entrega,
    hora_entrega: $("#hora_entrega_modal").val(),
    comision_delivery: $("#comision_delivery_modal").val(),
    nombre_cliente: $("#nomb_cliente_modal").val(),
    telefono_cliente: $("#telefono_cliente_modal").val(),
    tipo_cliente: tipo_cliente,
    tipo_documento: $("#id_tdoc_modal").val(),
    numero_documento: $("#num_cliente_modal").val(),
    id_cliente: pedidoSeleccionado.id_cliente,
    direccion_cliente: $("#direccion_cliente_modal").val(),
    referencia_cliente: $("#referencia_cliente_modal").val(),
    id_repartidor: $("#id_repartidor_modal").val(),
    desc_respartidor: $("#id_repartidor_modal option:selected").text(),
  };
}

function actualizarDataDelivery() {
  data = obtenerDataDeliveryModal();
  id_pedido = pedidoSeleccionado.id_pedido;
  console.log(data);
  console.log(id_pedido);

  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/actualizarDataDelivery",
    dataType: "json",
    data: {
      id_pedido: id_pedido,
      data: data,
    },
    success: function (request) {
      console.log(request);
      if (request.success) {
        const $dialog = $(".dialogBtnDelivery");
        $dialog[0].close();

        $("#comision_delivery_modal").val("").trigger("input");
        $("#nomb_cliente_modal").val("").trigger("input");
        $("#telefono_cliente_modal").val("").trigger("input");
        $("#num_cliente_modal").val("").trigger("input");
        $("#direccion_cliente_modal").val("").trigger("input");
        $("#referencia_cliente_modal").val("").trigger("input");

        delivery_list_b();
        listarPedidosDetalle(3, id_pedido);
        imprimirTickeReparto(id_pedido);
      }
    },
  });
}

function addPedido(id_pedido) {
  if (pedidoSeleccionado.Detalle.length != 0) {
    setPedidoContexto({
      tipoPedido:
        pedidoSeleccionado.id_tipo_pedido || normalizarNumeroContexto($("#codtipoped").val()),
      idPedido: id_pedido,
    });

    const arregloExtraido = pedidoSeleccionado.Detalle.map((item) => {
      const { Producto, cant, precio, id_pres, fecha_pedido, estado_pedido } =
        item;
      const total = parseFloat(cant) * parseFloat(precio);
      const pro_img = "default.png";

      return {
        ...Producto,
        fecha_pedido,
        estado_pedido,
        cantidad: cant,
        id_pres,
        pro_cos: precio,
        pro_img,
        total,
      };
    });

    $(".po-items").empty();
    $("#id_pedido").val(id_pedido);

    arregloExtraido.forEach((producto) => {
      agregarProducto(producto, false, id_pedido);
    });

    $("#modal-super-test").modal("show");
  }
}

var pedidoAccion = function (
  tipo_pedido,
  cod_accion,
  estado_pedido,
  id_pedido
) {
  /* cod_accion
        1 = enviar delivery, 2 = entregado delivery, 3 = entregado mostrador
    */
  if (cod_accion == 1) {
    var accion = "PREPARADO";
  } else if (cod_accion == 2 || cod_accion == 3) {
    var accion = "ENTREGADO";
  }
  var html_confirm =
    '<div><br>\
        <div style="width: 100% !important; float: none !important;">\
            <table class="table m-b-0">\
                <tr><td class="text-left">Pedido: </td><td class="text-right">' +
    $(".pedido-numero").text() +
    '</td></tr>\
            </table>\
        </div><br>\
        Ingrese código de vaucher</div>\
        <form><input class="form-control text-center w-100" type="text" id="codigo_vaucher" autocomplete="off"/></form><br>\
        <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';

  Swal.fire({
    title: "Necesitamos de tu Confirmación",
    html: html_confirm,
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
    preConfirm: function () {
      return new Promise(function (resolve) {
        $.ajax({
          url: $("#url").val() + "venta/pedidoAccion",
          type: "POST",
          data: {
            tipo_pedido: tipo_pedido,
            cod_accion: cod_accion,
            id_pedido: id_pedido,
            codigo_operacion: $("#codigo_vaucher").val(),
          },
          dataType: "json",
        })
          .done(function (response) {
            Swal.fire({
              title: "Proceso Terminado",
              text: "El pedido ha sido " + accion,
              icon: "success",
              confirmButtonColor: "#34d16e",
              confirmButtonText: "Aceptar",
            });
            reset_default();
            $(".cont01").css("display", "flex");
            if (cod_accion == 1) {
              // Enviar delivery: b → c (en camino)
              if (estado_pedido == "b") {
                activaTab("delivery03");
                delivery_list_c();
              } else if (estado_pedido == "c") {
                tipo_pedido == 2 ? mostrador_list_b() : delivery_list_c();
              }
            } else if (cod_accion == 2) {
              // Entregado: c → d
              if (estado_pedido == "c") {
                if (tipo_pedido == 2) {
                  mostrador_list_b();
                } else {
                  activaTab("delivery04");
                  delivery_list_d();
                }
              } else if (estado_pedido == "b") {
                activaTab("delivery03");
                delivery_list_c();
              }
            } else if (cod_accion == 3) {
              mostrador();
            }
          })
          .fail(function () {
            Swal.fire(
              "Oops...",
              "Problemas con la conexión a internet!",
              "error"
            );
          });
      });
    },
    allowOutsideClick: false,
  });
};

// var registrarMesa = function (id_mesa, nro_mesa, salon) {
//   var html_confirm =
//     '<div>Se procederá aperturar la siguiente mesa:</div><br>\
//     <table class="table m-b-0">\
//     <tr><td class="text-left">Salon: </td><td class="text-right">' +
//     salon +
//     '</td></tr>\
//     <tr><td class="text-left">Mesa: </td><td class="text-right">' +
//     nro_mesa +
//     '</td></tr>\
//     </table>\
//     <label>Nro personas</label>\
//     <input class="form-control numero-personas text-center" type="text" value="1" id="nro_personas"/><br>\
//     <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';

//   Swal.fire({
//     title: "Necesitamos de tu Confirmación",
//     html: html_confirm,
//     icon: "warning",
//     showCancelButton: true,
//     confirmButtonColor: "#34d16e",
//     confirmButtonText: "Si, Adelante!",
//     cancelButtonText: "No!",
//     showLoaderOnConfirm: true,
//     preConfirm: function () {
//       return new Promise(function (resolve) {
//         $.ajax({
//           url: $("#url").val() + "venta/pedido_create/pc1",
//           type: "POST",
//           data: {
//             id_mesa: id_mesa,
//             nomb_cliente: "Mesa " + nro_mesa,
//             nro_personas: $("#nro_personas").val(),
//           },
//           dataType: "json",
//           success: function (data) {
//             if (data["fil"] == 1) {
//               window.open(
//                 $("#url").val() + "venta/orden/" + data["id_pedido"],
//                 "_self"
//               );
//             } else {
//               window.open($("#url").val() + "venta", "_self");
//             }
//           },
//         }).fail(function () {
//           Swal.fire(
//             "Oops...",
//             "Problemas con la conexión a internet!",
//             "error"
//           );
//         });
//       });
//     },
//     allowOutsideClick: false,
//   });
//   $(".numero-personas").TouchSpin({
//     buttondown_class: "btn btn-secondary",
//     buttonup_class: "btn btn-secondary",
//     min: 1,
//     mousewheel: false,
//   });
// };

function registrarMesa(id_mesa, nro_mesa, salon) {
  $(".po-items").empty();
  setPedidoContexto({
    tipoPedido: 1,
    idPedido: 0,
    idMesa: id_mesa,
    mesa: nro_mesa,
    salon: salon,
    codSalonOrigen: 0,
    codMesaOrigen: 0,
  });
  if (esDispositivoMovil()) {
    setMobileOrderPanel(false);
  }

  $("#imprimir_comandas_mozo").empty();

  $("#btn_dropdown_comandas_mozo").prop("disabled", true);

  $("#btn_cancelar_pedido_mozo").prop("disabled", true);

  $("#modal-super-test").modal("show");
}

var orden = function (id_pedido, mesa, salon, id_mesa, id_salon) {
  // Restore payment UI
  $('#content_pagos').show();
  $('#payment-inputs-top').show();
  $('.card-footer-right').show();
  // Force update button logic
  $('#tipo_pago').trigger('change');

  //window.open($("#url").val() + "venta/orden/" + id_pedido, "_self");

  $("#imprimir_comandas_mozo").empty();

  $("#btn_dropdown_comandas_mozo").prop("disabled", false);

  $("#btn_cancelar_pedido_mozo").prop("disabled", false);

  const contextoPrevio = getPedidoContextoActual();
  const contextoMesa = setPedidoContexto({
    tipoPedido: 1,
    idPedido: id_pedido,
    idMesa:
      id_mesa != null && id_mesa !== ""
        ? id_mesa
        : contextoPrevio.idMesa || contextoPrevio.codMesaOrigen,
    mesa: mesa != null ? mesa : contextoPrevio.mesa,
    salon: salon != null ? salon : contextoPrevio.salon,
    idSalon:
      id_salon != null && id_salon !== ""
        ? id_salon
        : contextoPrevio.idSalon || contextoPrevio.codSalonOrigen,
    codSalonOrigen:
      id_salon != null && id_salon !== ""
        ? id_salon
        : contextoPrevio.codSalonOrigen || contextoPrevio.idSalon,
    codMesaOrigen:
      id_mesa != null && id_mesa !== ""
        ? id_mesa
        : contextoPrevio.codMesaOrigen || contextoPrevio.idMesa,
  });

  listarPedidosMozo(
    id_pedido,
    contextoMesa.mesa,
    contextoMesa.salon,
    contextoMesa.idMesa,
    contextoMesa.idSalon
  );
};

var list_categorias_menu = function () {
  $(".categoriamenu").css("display", "block");
  $("#categoriamenu").css("display", "none");
  $("#modal-lista-menu").modal("show");
  $(".list_categorias_menu").empty();
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/menu_categoria_list",
    dataType: "json",
    success: function (item) {
      if (item.data.length > 0) {
        $.each(item.data, function (i, item) {
          var categoria_nombre =
            item.descripcion.substr(0, 1).toUpperCase() +
            item.descripcion.substr(1).toLowerCase();
          $(".list_categorias_menu").append(
            $('<li class="nav-item m-t-10"/>').html(
              '<a class="nav-link bg-header" data-toggle="tab" href="#categoriamenu" onclick="list_platos_menu(' +
              item.id_catg +
              ');" role="tab">' +
              '<span class="hidden-sm-up">' +
              categoria_nombre +
              "</span>" +
              '<span class="hidden-xs-down font-14">' +
              categoria_nombre +
              "</span> </a>"
            )
          );
        });
      } else {
        $(".list_categorias_menu").html("");
      }
    },
  });
};

var list_platos_menu = function (id_catg) {
  $(".categoriamenu").css("display", "none");
  $("#categoriamenu").css("display", "block");

  function filterGlobal() {
    $("#list_platos_menu")
      .DataTable()
      .search($("#search_filter_menu").val())
      .draw();
  }

  var count = 0;
  var table = $("#list_platos_menu").DataTable({
    destroy: true,
    dom: "tp",
    bSort: false,
    ajax: {
      method: "POST",
      url: $("#url").val() + "venta/menu_plato_list",
      data: {
        id_catg: id_catg,
      },
    },
    columns: [
      {
        data: null,
        render: function (data, type, row) {
          var pro_nom =
            data.pro_nom.substr(0, 1).toUpperCase() +
            data.pro_nom.substr(1).toLowerCase();
          var pro_pre =
            data.pro_pre.substr(0, 1).toUpperCase() +
            data.pro_pre.substr(1).toLowerCase();
          return (
            pro_nom +
            " | " +
            pro_pre +
            " | " +
            $("#moneda").val() +
            " " +
            data.pro_cos
          );
        },
      },
      {
        data: null,
        render: function (data, type, row) {
          var checked = data.est_c == "a" ? "checked" : "";
          return (
            '<div class="switch text-right" onclick="estado_plato_menu(' +
            data.id_catg +
            "," +
            data.id_pres +
            ",'" +
            data.est_c +
            '\');"><label class="m-b-0"><input type="checkbox" ' +
            checked +
            '><span class="lever switch-col-light-green"></span></label></div>'
          );
        },
      },
    ],
  });

  $("input.search_filter_menu").on("keyup click", function () {
    filterGlobal();
  });
};

var estado_plato_menu = function (id_catg, id_pres, estado) {
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/menu_plato_estado",
    dataType: "json",
    data: {
      id_pres: id_pres,
      estado: estado,
    },
    success: function (request) {
      list_platos_menu(id_catg);
    },
  });
};

var nuevoPedidoMesa = function (id_mesa, mesa, salon) {
  $("#cliente_pedido_id").val(1);
  $("#buscar_cliente_pedido").val("DNI: 00000000 | PUBLICO EN GENERAL");

  $("#modal-super-test").modal("show");

  if (esDispositivoMovil()) {
    setMobileOrderPanel(false);
  }
  $("#openDialog").hide();
  $("#list-pedidos").empty();
  $(".po-items").empty();
  //////////////////////////////////////
  reset_default();
  setPedidoContexto({
    tipoPedido: 1,
    idPedido: 0,
    idMesa: id_mesa,
    mesa: mesa,
    salon: salon,
    codSalonOrigen: 0,
    codMesaOrigen: 0,
  });
  $(".display-mozo").css("display", "block");
  if (isMozoSesionBloqueado()) {
    applyLockedMozoSelection();
  } else {
    $("#id_mozo").removeAttr("disabled");
    $("#id_mozo").selectpicker("refresh");
    $("#id_mozo").selectpicker("val", "" + id_mozo_ + "");
    $("#select_mozo_input").val("" + id_mozo_ + "").prop("disabled", false);
  }
  $("#nomb_cliente").removeAttr("disabled");
  $(".pedido-mozo").hide();
  $("#content_pagos").hide();
  $("#payment-inputs-top").hide();
  $(".display-personas").css("display", "block");
  $(".numero-personas").TouchSpin({
    buttondown_class: "btn btn-link text-success",
    buttonup_class: "btn btn-link text-success",
    min: 1,
    mousewheel: false,
  });
  ///////////////////////////////////////////
  // $('.card_height').css('background','#fffde3');
  $(".card_height").css("background", "#ffffff");
  $(".card-body-right").css("display", "block");
  $(".card-settings").hide();
  $(".cont02").css("display", "block");
  $(".pedido-numero-icono").html("");
  $(".pedido-numero").html(salon + " - Mesa: " + mesa);
  $(".card-footer-right").css("display", "block");
  $(".display-opciones-pedido").hide();
  /////////////////////////////////////////////
  $("#nomb_cliente").val("Mesa: " + mesa);
  $("#payment-inputs-top").css("display", "none");
};

var tab01 = function () {
  $(".topbar").css("width", "100%");
  $(".display-estado-mesa").css("display", "block");
  $('input[name^="codtipoped"]').val(1);
  $("#list-pedidos").empty();
  /////////////////////
  reset_default();
  $(".cont01").css("display", "flex");
  $(".cont01-1").css("display", "block");
  $(".cont01-2").css("display", "none");
  $("#payment-inputs-top").css("display", "none");
  $(".nomPed").html("una mesa");
  $(".dim").removeClass("active");
  $("#codpestdelivery").val(0);
  $("#pago_efe").val(0);
  $("#payment-inputs-top").css("display", "none");
};

var tab02 = function () {
  $(".venta_por_consumo").prop("checked", false).triggerHandler("click");
  $(".topbar").css("width", "100%");
  $("#form-nuevo-pedido").attr("action", "venta/pedido_create/pc2");
  $(".display-estado-mesa").css("display", "none");
  $('input[name^="codtipoped"]').val(2);
  /////////////////////////////
  reset_default();
  $(".cont01").css("display", "flex");
  $(".cont01-1").css("display", "none");
  $(".cont01-2").css("display", "block");
  $(".nomPed").html("un pedido");
  $("#codpestdelivery").val(0);
  $("#payment-inputs-top").css("display", "none");
};

var tab03 = function () {
  $(".venta_por_consumo").prop("checked", false).triggerHandler("click");
  $(".topbar").css("width", "100%");
  $("#form-nuevo-pedido").attr("action", "venta/pedido_create/pc3");
  $(".display-estado-mesa").css("display", "none");
  $('input[name^="codtipoped"]').val(3);
  ///////////////////////
  reset_default();
  $(".cont01").css("display", "flex");
  $(".cont01-1").css("display", "none");
  $(".cont01-2").css("display", "block");
  $(".nomPed").html("un pedido");
  $("#codpestdelivery").val(1);
  $("#payment-inputs-top").css("display", "none");
  //$('#cliente_id').val('');
};

$(".tab01,.list-salones").click(function () {
  tab01();
});

$(".tab02").click(function () {
  tab02();
});

$(".tab03").click(function () {
  tab03();
});

$(".btn-nuevo-pedido").click(function () {
  $("#modal-super-test").modal("show");
  reset_default();
  $("#id_pedido").val(0);
  $(".card_height").css("background", "#fffde3");
  //$('.card_height').css('background','#FFFFF0');
  //$(".card-body-right").css("display", "block");
  $(".pedido-numero-icono").html("");
  $(".pedido-numero").show();
  $(".pedido-numero").html("Nuevo pedido:");
  $(".cont02").css("display", "block");

  if ($("#codtipoped").val() == 2) {
    $(".display-nombre").css("display", "block");
    $("#nomb_cliente").removeAttr("disabled");
    $("#nomb_cliente").val("PUBLICO GENERAL");
    $("#nomb_cliente").select();
    $("#form-nuevo-pedido").formValidation("revalidateField", "nomb_cliente");
    $("#id_tdoc").selectpicker("val", "1");
    $("#id_repartidor").selectpicker("refresh");

    $("#num_cliente").attr("maxlength", 8);
    $("#num_cliente").val("00000000");
  } else if ($("#codtipoped").val() == 3) {
    //$('#cliente_id').val('');
    $(".display-pedido-programado").css("display", "block");
    $("#tipo_entrega_1").prop("checked", true);
    $("#tipo_entrega_2").prop("checked", false);
    $(".display-tipo-entrega").css("display", "block");
    $(".btn-tipo-entrega-1").addClass("active");
    $(".btn-tipo-entrega-2").removeClass("active");
    $(".display-telefono-cliente").css("display", "block");
    $("#telefono_cliente").removeAttr("disabled");
    $("#telefono_cliente").val("0000");
    $(".display-nombre").css("display", "block");
    $("#nomb_cliente").removeAttr("disabled");
    $("#nomb_cliente").val("GENERAL");
    $(".display-direccion-cliente").css("display", "block");
    $("#direccion_cliente").removeAttr("disabled");
    $("#direccion_cliente").val("-");
    $("#referencia_cliente").val("-");
    $(".display-referencia-cliente").css("display", "block");
    $("#referencia_cliente").removeAttr("disabled");
    $(".display-repartidor").css("display", "block");
    $("#id_repartidor").removeAttr("disabled");

    $("#id_tdoc").selectpicker("val", "1");
    $("#id_repartidor").selectpicker("refresh");

    $("#num_cliente").attr("maxlength", 8);
    $("#num_cliente").val("00000000");

    $("#id_repartidor").selectpicker("val", "" + id_repartidor_ + "");
    $("#id_repartidor").selectpicker("refresh");

    $("#form-nuevo-pedido").formValidation("revalidateField", "id_repartidor");
    $("#form-nuevo-pedido").formValidation(
      "revalidateField",
      "telefono_cliente"
    );
    $("#form-nuevo-pedido").formValidation("revalidateField", "nomb_cliente");
    $("#form-nuevo-pedido").formValidation(
      "revalidateField",
      "direccion_cliente"
    );
    $("#form-nuevo-pedido").formValidation(
      "revalidateField",
      "referencia_cliente"
    );
    //$('.btn-opc-nuevo-cliente').html('<button class="btn btn-secondary" onclick="nuevo_cliente();" type="button"><i class="fa fa-user-plus"></i></button>');
    setTimeout(() => {
      $("#telefono_cliente").focus();
    }, 500);
  }
  //$(".card-footer-right").css("display", "block");
  $(".display-opciones-pedido").hide();

  $("#cliente_pedido_id").val(1);
  $("#buscar_cliente_pedido").val("DNI: 00000000 | PUBLICO EN GENERAL");
});

$(".btn-cancelar-pedido").click(function () {
  if ($("#codtipoped").val() == 1) {
    tab01();
  } else if ($("#codtipoped").val() == 2) {
    tab02();
  } else if ($("#codtipoped").val() == 3) {
    tab03();
  }
});

$(".btn-tipo-entrega-1").on("click", function (event) {
  $(".display-nombre").css("display", "block");
  $("#nomb_cliente").prop("disabled", false);
  $(".display-direccion-cliente").css("display", "block");
  $("#direccion_cliente").prop("disabled", false);
  $(".display-referencia-cliente").css("display", "block");
  $("#referencia_cliente").prop("disabled", false);
  $(".display-repartidor").css("display", "block");
  $("#id_repartidor").prop("disabled", false);
  $("#id_repartidor").selectpicker("refresh");
  $("#id_repartidor").selectpicker("val", "");
  $("#form-nuevo-pedido").formValidation("revalidateField", "id_repartidor");
  $("#form-nuevo-pedido").formValidation("revalidateField", "telefono_cliente");
  $("#form-nuevo-pedido").formValidation("revalidateField", "nomb_cliente");
  $("#form-nuevo-pedido").formValidation(
    "revalidateField",
    "direccion_cliente"
  );
  $("#form-nuevo-pedido").formValidation(
    "revalidateField",
    "referencia_cliente"
  );
});

$(".btn-tipo-entrega-2").on("click", function (event) {
  $(".display-nombre").css("display", "block");
  $("#nomb_cliente").prop("disabled", false);
  $(".display-direccion-cliente").css("display", "none");
  $("#direccion_cliente").prop("disabled", true);
  $(".display-referencia-cliente").css("display", "none");
  $("#referencia_cliente").prop("disabled", true);
  $(".display-repartidor").css("display", "none");
  $("#id_repartidor").prop("disabled", true);
  $("#form-nuevo-pedido").formValidation("revalidateField", "telefono_cliente");
  $("#form-nuevo-pedido").formValidation("revalidateField", "nomb_cliente");
});

/* INICIO - OPCION DE MESAS */
/* 1.- OPCION CAMBIAR MESA  */
/* Combo mesa origen */
var comboMesaOrigenOpc01 = function (cod_salon_origen_opc01) {
  $("#cod_mesa_origen_opc01").find("option").remove();
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/ComboMesaOri",
    data: {
      cod_salon_origen: cod_salon_origen_opc01,
    },
    success: function (response) {
      $("#cod_mesa_origen_opc01").html(response);
      $("#cod_mesa_origen_opc01").selectpicker();
      $("#cod_mesa_origen_opc01").selectpicker("refresh");
      $("#cod_mesa_origen_opc01")
        .val($("#codmesaorigen").val())
        .selectpicker("refresh");
    },
    error: function () {
      $("#cod_mesa_origen_opc01").html("There was an error!");
    },
  });
};

/* Combo mesa destino */
var comboMesaDestinoOpc01 = function (cod_salon_destino_opc01) {
  $("#cod_mesa_destino_opc01").find("option").remove();
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/ComboMesaDes",
    data: {
      cod_salon_destino: cod_salon_destino_opc01,
      estado: "a",
    },
    success: function (response) {
      $("#cod_mesa_destino_opc01").html(response);
      $("#cod_mesa_destino_opc01").selectpicker();
      $("#cod_mesa_destino_opc01").selectpicker("refresh");
    },
    error: function () {
      $("#cod_mesa_destino_opc01").html("There was an error!");
    },
  });
};

/* Combo salon origen */
$("#cod_salon_origen_opc01").change(function () {
  var cod_salon_origen_opc01 = $("#cod_salon_origen_opc01").val();
  comboMesaOrigenOpc01(cod_salon_origen_opc01);
  $("#form-cambiar-mesa").formValidation(
    "revalidateField",
    "cod_mesa_origen_opc01"
  );
});

/* Combo salon destino */
$("#cod_salon_destino_opc01").change(function () {
  var cod_salon_destino_opc01 = $("#cod_salon_destino_opc01").val();
  comboMesaDestinoOpc01(cod_salon_destino_opc01);
});

/* Boton cambiar mesa */
$(".opc-cambiar-mesa").click(function () {
  $("#cod_salon_origen_opc01")
    .val($("#codsalonorigen").val())
    .selectpicker("refresh");
  var cod_salon_destino_opc01 = $("#cod_salon_destino_opc01").val();
  comboMesaOrigenOpc01($("#codsalonorigen").val());
  comboMesaDestinoOpc01(cod_salon_destino_opc01);
});

$("#modal-cambiar-mesa").on("hidden.bs.modal", function () {
  $(this).find("form")[0].reset();
  $("#form-cambiar-mesa").formValidation("resetForm", true);
  $("#cod_salon_origen_opc01").val("").selectpicker("refresh");
  $("#cod_salon_destino_opc01").val("").selectpicker("refresh");
});
/* OPCION CAMBIAR MESA  */

/* 2.- OPCION MOVER PEDIDOS  */
/* Combo mesa origen */
var comboMesaOrigenOpc02 = function (cod_salon_origen_opc02) {
  $("#cod_mesa_origen_opc02").find("option").remove();
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/ComboMesaOri",
    data: {
      cod_salon_origen: cod_salon_origen_opc02,
    },
    success: function (response) {
      $("#cod_mesa_origen_opc02").html(response);
      $("#cod_mesa_origen_opc02").selectpicker();
      $("#cod_mesa_origen_opc02").selectpicker("refresh");
      $("#cod_mesa_origen_opc02")
        .val($("#codmesaorigen").val())
        .selectpicker("refresh");
    },
    error: function () {
      $("#cod_mesa_origen_opc02").html("There was an error!");
    },
  });
};

/* Combo mesa destino */
var comboMesaDestinoOpc02 = function (cod_salon_destino_opc02) {
  $("#cod_mesa_destino_opc02").find("option").remove();
  $.ajax({
    type: "POST",
    url: $("#url").val() + "venta/ComboMesaDes",
    data: {
      cod_salon_destino: cod_salon_destino_opc02,
      estado: "i",
    },
    success: function (response) {
      $("#cod_mesa_destino_opc02").html(response);
      $("#cod_mesa_destino_opc02").selectpicker();
      $("#cod_mesa_destino_opc02").selectpicker("refresh");
    },
    error: function () {
      $("#cod_mesa_destino_opc02").html("There was an error!");
    },
  });
};

/* Combo salon origen */
$("#cod_salon_origen_opc02").change(function () {
  var cod_salon_origen_opc02 = $("#cod_salon_origen_opc02").val();
  comboMesaOrigenOpc02(cod_salon_origen_opc02);
  $("#form-mover-pedidos").formValidation(
    "revalidateField",
    "cod_mesa_origen_opc02"
  );
});

/* Combo salon destino */
$("#cod_salon_destino_opc02").change(function () {
  var cod_salon_destino_opc02 = $("#cod_salon_destino_opc02").val();
  comboMesaDestinoOpc02(cod_salon_destino_opc02);
});

/* Boton cambiar mesa */
$(".opc-mover-pedidos").click(function () {
  $("#cod_salon_origen_opc02")
    .val($("#codsalonorigen").val())
    .selectpicker("refresh");
  var cod_salon_destino_opc02 = $("#cod_salon_destino_opc02").val();
  comboMesaOrigenOpc02($("#codsalonorigen").val());
  comboMesaDestinoOpc02(cod_salon_destino_opc02);
});

$("#modal-mover-pedidos").on("hidden.bs.modal", function () {
  $(this).find("form")[0].reset();
  $("#form-mover-pedidos").formValidation("resetForm", true);
  $("#cod_salon_origen_opc02").val("").selectpicker("refresh");
  $("#cod_salon_destino_opc02").val("").selectpicker("refresh");
});
/* OPCION MOVER PEDIDOS  */

/* FIN OPCION DE MESAS */

/************  */

var reset_default = function () {
  if (ajaxListarPedidos && ajaxListarPedidos.readyState !== 4) {
    ajaxListarPedidos.abort();
  }
  if (ajaxListarPedidosDetalle && ajaxListarPedidosDetalle.readyState !== 4) {
    ajaxListarPedidosDetalle.abort();
  }

  isLoadingPedidos = false;
  selectionMode = false;
  pedidoSeleccionado = [];
  clearPedidoContexto();

  $("#list-pedidos").empty();
  $(".cont01").css("display", "none");
  $(".cont02").css("display", "none");
  $(".cont03").css("display", "none");
  $(".cont04").css("display", "none");
  $(".card-body-right").css("display", "none");
  $(".card-footer-right").css("display", "none");
  $("#content_pagos").hide();
  $(".card_height").css("background", "#666");
  $(".totalPagar").html("");
  $(".pedido-numero-icono").html("");
  $(".pedido-numero").html("Detalle:");
  // NONE DISPLAY
  $(".display-pedido-programado").css("display", "none");
  $(".pedido_programado").prop("checked", false);
  $(".pedido_programado").val("0");
  $(".display-tipo-entrega").css("display", "none");
  $(".display-hora-entrega").css("display", "none");
  $(".display-pedido-total-amortizado").css("display", "none");
  $(".display-busqueda-cliente").css("display", "none");
  $(".display-nombre").css("display", "none");
  $(".display-telefono-cliente").css("display", "none");
  $(".display-direccion-cliente").css("display", "none");
  $(".display-referencia-cliente").css("display", "none");
  $(".display-repartidor").css("display", "none");
  $(".display-personas").css("display", "none");
  $(".display-mozo").css("display", "none");
  //DISABLED INPUT
  $("#hora_entrega").attr("disabled", "true");
  $("#nomb_cliente").attr("disabled", "true");
  $("#telefono_cliente").attr("disabled", "true");
  $("#direccion_cliente").attr("disabled", "true");
  $("#referencia_cliente").attr("disabled", "true");
  $("#id_repartidor").attr("disabled", "true");
  $("#id_mozo").attr("disabled", "true");
  $(".btn-submit-dividir-cuenta").html("");
  $(".btn-submit-cobrar").html("");
  $(".btn_cancelar_pedido").html("");
  $(".btn-agregar-productos").html("");
  $("#openDialogDelivery").hide();
  $("#payment-inputs-top").css("display", "none");
  $("#fast-cash-container").hide();
  limpiar_resumen_pago();
  vaciarListaProductos();
};

$(".mostrador01").click(function () {
  mostrador_list_a();
  reset_default();
  $(".cont01").css("display", "flex");
});

$(".mostrador02").click(function () {
  console.log("mostrador02");

  mostrador_list_b();
  reset_default();
  $(".cont01").css("display", "flex");
});

$(".mostrador03").click(function () {
  mostrador_list_c();
  reset_default();
  $(".cont01").css("display", "flex");
});

$(".delivery01").click(function () {
  delivery_list_a();
  reset_default();
  $(".cont01").css("display", "flex");
  $("#codpestdelivery").val(1);
});

$(".delivery02").click(function () {
  delivery_list_b();
  reset_default();
  $(".cont01").css("display", "flex");
  $("#codpestdelivery").val(0);
});

$(".delivery03").click(function () {
  delivery_list_c();
  reset_default();
  $(".cont01").css("display", "flex");
  $("#codpestdelivery").val(0);
});

$(".delivery04").click(function () {
  delivery_list_d();
  reset_default();
  $(".cont01").css("display", "flex");
  $("#codpestdelivery").val(0);
});

var enviar_whatsapp_pago = function (
  nro_pedido,
  total_pedido,
  cliente,
  telefono
) {
  var html_confirm =
    '<div>Enviar mensaje:</div>\
    <div class="font-18 font-bold">Pedido N° ' +
    nro_pedido +
    '</div><br>\
    <div><form><textarea id="textarea" class="form-control" rows="8">Hola ' +
    cliente +
    ": Ya aceptamos tu solicitud de tu pedido por un monto de " +
    $("#moneda").val() +
    " " +
    formatNumber(total_pedido) +
    '. Gracias por confiar en nosotros</textarea><input class="form-control text-center w-100" type="text" id="num_cliente" value="51' +
    telefono +
    '" autocomplete="off"/></div><div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';
  window.setTimeout(function () {
    var obj = $("#num_cliente"),
      val = obj.val();
    obj.focus().val("").val(val);
    obj.scrollTop(obj[0].scrollHeight);
  }, 300);

  Swal.fire({
    title: "",
    html: html_confirm,
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
    preConfirm: function () {
      if ($("#api_wsp").val() == 1) {
        $.ajax({
          url: $("#url").val() + "whatsapp/send_wsp_txt",
          type: "POST",
          data: {
            num_cliente: $("#num_cliente").val(),
            mensaje: $("#textarea").val(),
          },
          dataType: "json",
        })
          .done(function (response) {
            if (response.status == true) {
              Swal.fire({
                title: "Proceso Terminado",
                html: "Whatsapp enviado correctamente <br><br> <strong>Respuesta server: </strong>Mensaje enviado con éxito",
                icon: "success",
                confirmButtonColor: "#34d16e",
                confirmButtonText: "OK",
              });
            } else {
              Swal.fire({
                title: "Proceso No Culminado",
                html:
                  "" + response.msg + "<br>" + response.errors
                    ? response.errors
                    : "" + "",
                icon: "error",
                confirmButtonColor: "#34d16e",
                confirmButtonText: "OK",
              });
            }
          })
          .fail(function (error) {
            // console.log(error)
            console.log(error.responseText);
            Swal.fire(
              "Oops...",
              "Error: " + error.responseText.msg + "",
              "error"
            );
          });
      } else {
        window.open(
          "https://api.whatsapp.com/send?phone=51" +
          telefono +
          "&text=" +
          $("#textarea").val(),
          "_blank"
        );
      }
    },
  });
};

var anular_pedido = function (id_pedido) {
  var html_confirm =
    '<div>Se procederá a anular este pedido</div><br>\
    <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';
  Swal.fire({
    title: "Necesitamos de tu Confirmación",
    html: html_confirm,
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
    preConfirm: function () {
      return new Promise(function (resolve) {
        $.ajax({
          url: $("#url").val() + "venta/anular_pedido",
          type: "POST",
          data: {
            id_pedido: id_pedido,
            tipo_pedido: $("#codtipoped").val(),
          },
          dataType: "json",
        })
          .done(function (response) {
            let tipo_pedido = $("#codtipoped").val();
            if (tipo_pedido == 2) {
              $(".mostrador02").trigger("click");
            } else if (tipo_pedido == 3) {
              $(".delivery02").trigger("click");
            }

            resolve();
          })
          .fail(function () {
            Swal.fire(
              "Oops...",
              "Problemas con la conexión a internet!",
              "error"
            );
          });
      });
    },
    allowOutsideClick: false,
  });
};

var anular_venta = function (id_pedido, nro_pedido, id_venta) {
  var html_confirm =
    '<div>Se procederá a anular el siguiente pedido:</div>\
    <div class="font-18 font-bold">Pedido N° ' +
    nro_pedido +
    '</div><br>\
    Ingrese código de seguridad</div><br>\
    <form><input class="form-control text-center w-50" type="password" id="codigo_anular_venta_" autocomplete="off"/></form><br>\
    <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';
  Swal.fire({
    title: "Necesitamos de tu Confirmación",
    html: html_confirm,
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
    preConfirm: function () {
      return new Promise(function (resolve) {
        if (
          $("#codigo_anular_venta").val() == $("#codigo_anular_venta_").val()
        ) {
          $.ajax({
            url: $("#url").val() + "venta/anular_venta",
            type: "POST",
            data: {
              id_venta: id_venta,
              id_pedido: id_pedido,
            },
            dataType: "json",
          })
            .done(function (response) {
              window.open($("#url").val() + "venta", "_self");
            })
            .fail(function () {
              Swal.fire(
                "Oops...",
                "Problemas con la conexión a internet!",
                "error"
              );
            });
        } else {
          Swal.fire({
            title: "Proceso No Culminado",
            text: "El código ingresado es incorrecto",
            icon: "error",
            confirmButtonColor: "#34d16e",
            confirmButtonText: "Aceptar",
          });
        }
      });
    },
  });
};

var editar_pedido = function (id_pedido) {
  $("#modal-editar-pedido").modal("show");
  $.ajax({
    type: "post",
    dataType: "json",
    data: {
      id_pedido: id_pedido,
    },
    url: $("#url").val() + "venta/pedido_edit",
    success: function (item) {
      $.each(item.data, function (i, campo) {
        $("#id_pedido").val(id_pedido);
        $("#id_repartidor_edit").selectpicker("val", campo.id_repartidor);
        $("#hora_entrega_edit").selectpicker("val", campo.hora_entrega);
        $("#amortizacion").val(campo.amortizacion);
        $("#id_tipo_pago").selectpicker("val", campo.tipo_pago);

        if (campo.paga_con === "0.00") {
          setTimeout(function () {
            $("#paga_con").val(formatNumber($("#total_pagar_").val()));
          }, 500);
        } else {
          $("#paga_con").val(campo.paga_con);
        }

        $("#comision_delivery").val(campo.comision_delivery);
        if (campo.tipo_pago == 1) {
          $(".display-paga-con").show();
        } else {
          $(".display-paga-con").hide();
        }
      });
    },
  });
};

$("#id_tipo_pago").change(function () {
  if (this.value == 1) {
    $(".display-paga-con").show();
  } else {
    $(".display-paga-con").hide();
  }
});

var editar_venta_pago = function (id_venta) {
  $("#modal-editar-venta-pago").modal("show");
  $.ajax({
    type: "post",
    dataType: "json",
    data: {
      id_venta: id_venta,
    },
    url: $("#url").val() + "venta/venta_edit",
    success: function (item) {
      $.each(item.data, function (i, campo) {
        $("#id_pedido").val(campo.id_pedido);
        $("#id_venta").val(campo.id_venta);
        $("#id_venta_tipopago").val(campo.id_tipo_pago);
        $("#id_tipo_pago_v").selectpicker("val", campo.id_tipo_pago);
      });
    },
  });
};

confirmar_pedido = function (id_pedido, estado_pedido) {
  var html_confirm =
    '<div>Enviar los productos para su preparación, a su área de producción correspondiente</div><br>\
    <div style="width: 100% !important; float: none !important;">\
        <table class="table m-b-0">\
            <tr><td class="text-left">Pedido: </td><td class="text-right">' +
    $(".pedido-numero").text() +
    '</td></tr>\
            <tr><td class="text-left">Cliente: </td><td class="text-right">' +
    $(".pedido-cliente").text() +
    '</td></tr>\
        </table>\
    </div><br>\
    <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';
  Swal.fire({
    title: "Necesitamos de tu Confirmación",
    html: html_confirm,
    icon: "warning",
    showCancelButton: true,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Si, Adelante!",
    cancelButtonText: "No!",
    showLoaderOnConfirm: true,
    preConfirm: function () {
      return new Promise(function (resolve) {
        impresion_comanda(id_pedido, estado_pedido);
        printPdf(
          $("#url").val() + "venta/impresion_reparto_pedido/" + id_pedido
        );

        delivery_list_a();
        reset_default();
        $(".cont01").css("display", "flex");
        swal.close();
      });
    },
  });
};

var alert_pedidos_programados = function () {
  $.ajax({
    type: "post",
    dataType: "json",
    url: $("#url").val() + "venta/alert_pedidos_programados",
    success: function (data) {
      var fecha1 = moment($("#hora").val(), "HH:mm:ss");
      var fecha2 = moment(data.hora_entrega, "HH:mm:ss");
      var duration = moment.duration(fecha2 - fecha1).humanize();
      var minutos = fecha2.diff(fecha1, "minutes");
      if (minutos < 30) {
        html = "";
        var html_confirm =
          '<div class="font-16">Hay un pedido para las <strong>' +
          moment(fecha2).format("hh:mm A") +
          '</strong> esperando ser enviado a <strong>PREPARACIÓN</strong></div>\
                <br><div style="width: 100% !important; float: none !important;">\
                    <table class="table m-b-0">\
                    <tr><td class="text-left">Pedido: </td><td class="text-right">' +
          data.nro_pedido +
          '</td></tr>\
                    <tr><td class="text-left">Cliente: </td><td class="text-right">' +
          data.nombre_cliente +
          '</td></tr>\
                    </table>\
                </div><br>\
                <div><span class="text-success" style="font-size: 17px;">¿Continuar ahora?</span></div>';
        Swal.fire({
          title: "",
          html: html_confirm,
          icon: "info",
          position: "top-end",
          showCancelButton: true,
          confirmButtonColor: "#34d16e",
          confirmButtonText: "Si, Adelante!",
          cancelButtonText: "No!",
          showLoaderOnConfirm: true,
          preConfirm: function () {
            return new Promise(function (resolve) {
              $("#codtipoped").val(3);
              listarPedidosDetalle(3, data.id_pedido, 0);
              activaTab("tabp-3");
              activaTab("delivery01");
              delivery_list_a();
              $(".display-estado-mesa").css("display", "none");
              $(".cont01-1").css("display", "none");
              $(".cont01-2").css("display", "block");
              Swal.close();
            });
          },
        });
        var sound = new buzz.sound($("#url").val() + "public/sound/alert02", {
          formats: ["ogg", "mp3", "aac"],
        });
        sound.play();
      }
    },
  });
};

var validarApertura = function () {
  if ($("#cod_ape").val() == 0 && $("#rol_usr").val() != 1) {
    var html_confirm =
      '<div>Para poder realizar esta operación es necesario Aperturar Caja</div>\
            <br>\
            <div><span class="text-success" style="font-size: 18px;">¿Está Usted de Acuerdo?</span></div><br>\
            <a href="' +
      $("#url").val() +
      'caja/apercie" class="btn btn-success">Si, Adelante!</a>';

    Swal.fire({
      title: "Advertencia",
      html: html_confirm,
      icon: "warning",
      allowOutsideClick: false,
      allowEscapeKey: false,
      showCancelButton: false,
      showConfirmButton: false,
      closeOnConfirm: false,
      closeOnCancel: false,
    });
  }
};

$(".pedido_programado").on("click", function (event) {
  if ($(this).is(":checked")) {
    $("#pedido_programado").val("1");
    $(".display-hora-entrega").css("display", "block");
    $("#hora_entrega").removeAttr("disabled");
    $("#hora_entrega").selectpicker("refresh");
    $("#hora_entrega").selectpicker("val", "");
    $("#form-nuevo-pedido").formValidation("revalidateField", "hora_entrega");
  } else {
    $("#pedido_programado").val("0");
    $("#hora_entrega").prop("disabled", true);
    $(".display-hora-entrega").css("display", "none");
  }
});

/*
var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = window.location.search.substring(1),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
        }
    }
};
*/

function activaTab(tab) {
  $('.nav-tabs a[href="#' + tab + '"]').tab("show");
}

var impPreCuenta = function (id_pedido, id_mesa, estado, wiew) {
  $.ajax({
    url: $("#url").val() + "venta/pedido_estado_update",
    type: "post",
    dataType: "json",
    data: {
      id_mesa: id_mesa,
      estado: estado,
    },
    success: function (r) {
      return true;
    },
  }).done(function () {
    if (wiew) {
      printPdf(
        $("#url").val() + "venta/impresion_precuenta/" + id_pedido,
        true
      );
    } else {
      window.open(
        $("#url").val() + "venta/impresion_precuenta/" + id_pedido,
        "_blank"
      );
    }
  });
};

var printPdf = function (url, condicional) {
  var userAgent = navigator.userAgent || navigator.vendor || window.opera;

  window.open(url, "_blank");

  // if ((/android/i.test(userAgent)) || (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) ) {
  //     // if(condicional){
  //         var Urlpdf = url;
  //     // }else{
  //     //     var Urlpdf = $("#url").val()+'informe/venta_all_imp/'+url;
  //     // }
  //     window.open(Urlpdf, '_blank');
  // }else{
  //     if(condicional){
  //         var Urlpdf = url;
  //     }else{
  //          var Urlpdf = $("#url").val()+'informe/venta_all_imp/'+url;
  //     }

  //     var iframe = document.createElement('iframe');
  //     iframe.className='pdfIframe'
  //     document.body.appendChild(iframe);
  //     iframe.style.display = 'none';
  //     iframe.onload = function () {
  //         setTimeout(function () {
  //             iframe.focus();
  //             iframe.contentWindow.print();
  //             URL.revokeObjectURL(Urlpdf)
  //         }, 0);
  //     };
  //     iframe.src = Urlpdf;
  //     URL.revokeObjectURL(Urlpdf)
  // }
};

var nuevo_cliente_vista = function () {
  if ($("#codcomision").val() == 1) {
    $("#td_dni").attr("checked", false);
    $("#td_ruc").attr("checked", false);
    $(".block01").css("display", "none");
    $(".block02").css("display", "none");
    $(".block03").css("display", "none");
    $(".block04").css("display", "none");
    $(".block05").css("display", "none");
    $(".block06").css("display", "none");
    $(".block07").css("display", "none");
    $(".block08").css("display", "none");
  }

  if ($("#cliente_tipo").val() != "") {
    if ($("#cliente_tipo").val() == 1) {
      $("#tipo_cliente").val(1);
      $(".block01").css("display", "block");
      $(".block02").css("display", "none");
      $(".block03").css("display", "block");
      $(".block04").css("display", "none");
      $(".block05").css("display", "block");
      $(".block06").css("display", "block");
      $(".block07").css("display", "none");
      $(".dni").prop("disabled", false);
      $(".ruc").prop("disabled", true);
      $("#form-cliente").formValidation("resetForm", true);
      $("#dni").val(
        $("#buscar_cliente")
          .val()
          .replace(/[^0-9]/g, "")
      );
      setTimeout(() => {
        $("#dni").select();
      }, 200);
      $("#seleccionar").select();
      $("#modal-cliente").modal("show");
    } else if ($("#cliente_tipo").val() == 2) {
      $("#tipo_cliente").val(2);
      $(".block01").css("display", "none");
      $(".block02").css("display", "block");
      $(".block03").css("display", "none");
      $(".block04").css("display", "none");
      $(".block05").css("display", "none");
      $(".block06").css("display", "none");
      $(".block07").css("display", "block");
      $(".dni").prop("disabled", true);
      $(".ruc").prop("disabled", false);
      $("#form-cliente").formValidation("resetForm", true);
      $("#ruc").val($("#buscar_cliente").val());
      $("#modal-cliente").modal("show");
    } else if ($("#cliente_tipo").val() == 3) {
      $("#tipo_cliente").val(1);
      $(".block01").css("display", "block");
      $(".block02").css("display", "none");
      $(".block03").css("display", "block");
      $(".block04").css("display", "block");
      $(".block05").css("display", "block");
      $(".block06").css("display", "block");
      $(".block07").css("display", "none");
      $(".dni").prop("disabled", false);
      $(".ruc").prop("disabled", true);
      $("#form-cliente").formValidation("resetForm", true);
      $("#dni").val(
        $("#buscar_cliente")
          .val()
          .replace(/[^0-9]/g, "")
      );
      setTimeout(() => {
        $("#dni").select();
      }, 200);
      $("#modal-cliente").modal("show");
    } else {
      //$('#modal-cliente').modal('show');
    }
  }
};

/* Nuevo Cliente */
var nuevoClienteVista = function () {
  console.log("adasd");

  //nuevo_cliente_vista();
};

$("#id_tdoc").change(function () {
  if ($("#id_tdoc").val() == 1) {
    $("#num_cliente").attr("maxlength", 8);
    $("#num_cliente").val("00000000");
  }
  if ($("#id_tdoc").val() == 2) {
    $("#num_cliente").attr("maxlength", 11);
    $("#num_cliente").val("");
  }
});

var listarCategorias = function () {
  $.ajax({
    dataType: "JSON",
    type: "POST",
    data: {
      codtipoped: $("#codtipoped").val(),
    },
    url: $("#url").val() + "venta/listarCategorias",
    success: function (data) {
      listarProdsMasVend();
      Categorias = data;
      Categorias.forEach((categoria) => {
        const idCategoria = categoria.id_catg;

        categoria.productos.forEach((producto) => {
          producto.id_catg = idCategoria;
          Productos.push(producto);
        });
      });

      generarCategorias(Categorias);
    },
    error: function (xhr, status, error) {
      console.error("Error al obtener categorías:", error);
    },
  });
};

// function generarCategorias(categorias) {
//   var container = $(".list-categories");

//   categoryHTML = "";

//   if (!categorias || categorias.length === 0) {
//     categoryHTML += '<p class="text-muted">No hay categorías disponibles.</p>';
//   } else {
//     var categoryHTML = `
//             <div class="card-category selected" data-id="favoritos">
//                 <div class="card-category-header hidden-xs-down">
//                     <span class="icon"><i class="far fa-heart"></i></span>
//                 </div>
//                 <div class="description">
//                     <span class="title">Favoritos</span>
//                     <span class="paragraph">Productos destacados</span>
//                 </div>
//             </div>
//         `;

//     categoryHTML += categorias
//       .map(
//         (categoria) => `
//             <div class="card-category" data-id="${categoria.id_catg}">
//                 <div class="card-category-header hidden-xs-down">
//                     <span class="icon"><i class="far fa-star"></i></span>
//                 </div>
//                 <div class="description">
//                     <span class="title">${categoria.descripcion}</span>
//                     <span class="paragraph">${
//                       categoria.cantidad
//                         ? categoria.cantidad + " items"
//                         : "Sin datos"
//                     }</span>
//                 </div>
//                 <span class="button-close" onclick="removeCategory(this)"><i class="fas fa-times"></i></span>
//             </div>
//         `
//       )
//       .join(""); // Convertimos el array en un string sin usar múltiples `.append()`
//   }

//   container.html(categoryHTML);

//   $(".card-category").on("click", function (e) {
//     $(".card-category").removeClass("selected");
//     $(this).addClass("selected");

//     var id = $(this).data("id");

//     id == "favoritos" ? listarProdsMasVend() : listarProductos(id);
//   });
// }

function generarCategorias(categorias) {
  var container = $(".list-categories");

  let categoryHTML = "";

  console.log(Productos);

  if (!categorias || categorias.length === 0) {
    categoryHTML += '<p class="text-muted">No hay categorías disponibles.</p>';
  } else {
    // Favoritos (fijo)
    categoryHTML += `
      <div class="card-category selected" data-id="favoritos">
        <span class="icon"><i class="far fa-heart"></i></span>
        <span class="title">Favoritos</span>
        <span class="close" onclick="removeCategory(this)">✖</span>
        <span class="badge">0</span>
      </div>
    `;

    // Categorías dinámicas
    categoryHTML += categorias
      .map((categoria) => {
        // Filtra productos con el mismo id_catg (comparando como string)
        const cantidad = Productos.filter(
          (p) => p.id_catg === String(categoria.id_catg)
        ).length;

        return `
        <div class="card-category" data-id="${categoria.id_catg}">
          <span class="icon"><i class="fas fa-th"></i></span>
          <span class="title">${categoria.descripcion}</span>
          <span class="badge">${cantidad}</span>
        </div>
      `;
      })
      .join("");
  }

  // Insertar en el DOM
  container.html(categoryHTML);

  // Asignar eventos de selección
  $(".card-category").on("click", function (e) {
    $(".card-category").removeClass("selected");
    $(this).addClass("selected");
    if (this.scrollIntoView) {
      try {
        this.scrollIntoView({ behavior: "smooth", inline: "center", block: "nearest" });
      } catch (err) {
        this.scrollIntoView(false);
      }
    }

    var id = $(this).data("id");

    console.log(id, "id categoria");

    selectedCategoryId = id;

    console.log(selectedCategoryId, "id categoriaGlobal");

    // id == "favoritos"
    //   ? listarProdsMasVend()
    //   : listarProductos(id, modoListaProductos);

    selectedCategoryId == null
      ? listarProductos(id, modoListaProductos)
      : listarProductos(selectedCategoryId, modoListaProductos);
  });
}

function getProductosByCategory() {
  // Devuelve la promesa de $.ajax
  return $.ajax({
    url: $("#url").val() + "venta/listarCategorias",
    dataType: "json",
    type: "POST",
    data: { codtipoped: $("#codtipoped").val() },
  }).then((data) => {
    // Limpia y carga
    Productos = [];
    (data || []).forEach((categoria) => {
      const idCategoria = categoria.id_catg;
      (categoria.productos || []).forEach((p) => {
        p.id_catg = idCategoria;
        Productos.push(p);
      });
    });
    buildStockRuntime(Productos); // reconstruye el runtime desde datos frescos del servidor
    return Productos; // útil si quieres encadenar datos
  });
}

var listarProductos = function (id_catg, tipe_view = "grid") {
  console.log("listar prodcutos", id_catg);
  console.log(Productos);

  const productosFiltrados = Productos.filter(
    (producto) => producto.id_catg == id_catg
  );

  generarProductos(productosFiltrados, tipe_view);
};

var listarProdsMasVend = function (side = false) {
  $.ajax({
    dataType: "JSON",
    type: "POST",
    data: {
      codtipoped: $("#codtipoped").val(),
      codrepartidor: $("#codrepartidor").val(),
    },
    url: $("#url").val() + "venta/listarProdsMasVend",
    success: function (data) {
      generarProductos(data);
    },
    error: function (xhr, status, error) {
      console.error("Error al obtener categorías:", error);
    },
  });
};

function limpiarDescuentos() {
  $("#tipo_descuento_select").prop("selectedIndex", 0).trigger("change");
  $("#descuento_porcentaje").val("");
  $("#descuento_monto_fijo").val("");
  $("#impuesto_bolsa").val("");
  $("#comision_delivery").val("");
  $("#comision_delivery_input").val(""); // Clear modal input
  $("#descuento_monto_hidden").val("0.00");
  $("#descuento_tipo_hidden").val("0");
  $("#descuento_motivo_hidden").val("");
  $("#descuento_personal_hidden").val("0");
  $("#personal_descuento").val("");
  $(".totalDescuento").text("0.00");
  $(".totalDelivery").text("0.00");
  $("#observacion").val("");
}

// function generarProductos(items) {
//   var url = $("#url").val();
//   var container = $(".section-list");
//   var html = "";

//   if (items.length == 0) {
//     html = `
//     <div style="
//       display: flex;
//       flex-direction: column;
//       align-items: center;
//       justify-content: center;
//       height: 100%;
//       min-height: 400px;
//       text-align: center;
//     ">
//       <div style="margin-bottom: 10px;">
//         <svg xmlns="http://www.w3.org/2000/svg" width="120" height="120" viewBox="0 0 24 24" fill="none">
//           <path d="M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 .001 3.999A2 2 0 0 0 17 18Zm3.21-13H5.21l-.94-2H1v2h2l3.6 7.59-1.35 2.45A2.003 2.003 0 0 0 7 17h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12L8.1 13h7.45a2 2 0 0 0 1.79-1.11L21 4.6a.5.5 0 0 0-.45-.6h-.34Z" fill="#aaa"/>
//         </svg>
//       </div>
//       <p style="color: #aaa;">Parece que esta categoría aún está vacía</p>
//     </div>
//   `;
//   } else {
//     html = items
//       .map(function (item) {
//         let preciosHtml = "";
//         let tienePrecios = false;

//         if (item.precios) {
//           try {
//             var preciosArray = JSON.parse(item.precios);
//             if (preciosArray.length > 0) {
//               tienePrecios = true;
//               preciosHtml = `
//               <div class="content" style="display:none;">
//                 <div class="modal-content animated bounceInTop" style="padding:2px 4px;display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem;justify-content:space-evenly">
//             `;

//               preciosHtml += `
//               <div style="display:flex;flex-direction:column;align-items:center;gap:.3rem">
//                 <span>Precio base</span>
//                 <button
//                   class="btn btn-outline-primary btn-sm agregar-precio"
//                   data-precio="${item.pro_cos}"
//                   data-id_pres="${item.id_pres}"
//                   data-price-name="Precio base"
//                   data-producto='${JSON.stringify(item)}'
//                 >
//                   ${item.pro_cos}
//                 </button>
//               </div>
//             `;

//               preciosArray.forEach(function (precio) {
//                 preciosHtml += `
//                 <div style="display:flex;flex-direction:column;align-items:center;gap:.3rem">
//                   <span>${precio.nombre}</span>
//                   <button
//                     class="btn btn-secondary btn-sm agregar-precio"
//                     data-precio="${precio.precio}"
//                     data-id_pres="${precio.id_pres}"
//                     data-price-name="${precio.nombre}"
//                     data-producto='${JSON.stringify(item)}'
//                   >
//                     ${precio.precio}
//                   </button>
//                 </div>
//               `;
//               });

//               preciosHtml += `</div></div>`;
//             }
//           } catch (e) {
//             console.warn("Error al parsear precios:", e);
//           }
//         }

//         return `
//         <div class="card-menu-wrapper">
//           <div class="card-menu">
//             <div class="card-menu-header" style="position: relative;">
//               <img src="${
//                 url + "public/images/productos/" + item.pro_img
//               }" alt="">
//               ${renderStockBadge(item)}
//             </div>

//             <div class="menu-name">${item.pro_pre}</div>
//             <div class="menu-category prices-list" title="Ver más precios" style="padding:4px 8px;border:1px solid #7460ee;border-radius:4px;background-color:#7460ee;cursor:pointer">
//               <span class="price" style="margin:auto; color: white;">${
//                 item.pro_cos
//               }</span>
//             </div>
//           </div>
//           ${preciosHtml}
//         </div>
//       `;
//       })
//       .join("");
//   }

//   container.html(html);

//   container.find(".card-menu").each(function (index) {
//     $(this).data("item", items[index]);
//   });

//   container.find(".card-menu").on("click", function () {
//     const item = $(this).data("item");
//     if (item.precios) {
//       try {
//         const preciosArray = JSON.parse(item.precios);
//         if (preciosArray.length > 0) {
//           $(this)
//             .closest(".card-menu-wrapper")
//             .find(".content")
//             .slideToggle("fast");
//           return;
//         }
//       } catch (e) {
//         console.warn("Error al parsear precios:", e);
//       }
//     }

//     if (item.Stock && item.Stock.crt_stock == 1 && item.Stock.ingredientes) {
//       if (tieneStockDisponible(item)) {
//         item.cantidad = 1;
//         agregarProducto(item);
//         actualizarStockVisual(this, item);
//       } else {
//         mostrarAlerta(
//           "warning",
//           "Sin stock disponible",
//           "No hay stock suficiente para agregar este producto."
//         );
//       }
//     } else {
//       item.cantidad = 1;
//       agregarProducto(item);
//     }
//   });
// }

function generarProductos(items, vista = "grid") {
  const url = $("#url").val();
  const container = $(".section-list");
  let html = "";

  if (items.length === 0) {
    html = `
      <div style="display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:400px;text-align:center;">
        <div style="margin-bottom:10px;">
          <svg xmlns="http://www.w3.org/2000/svg" width="120" height="120" viewBox="0 0 24 24" fill="none">
            <path d="M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 .001 3.999A2 2 0 0 0 17 18Zm3.21-13H5.21l-.94-2H1v2h2l3.6 7.59-1.35 2.45A2.003 2.003 0 0 0 7 17h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12L8.1 13h7.45a2 2 0 0 0 1.79-1.11L21 4.6a.5.5 0 0 0-.45-.6h-.34Z" fill="#aaa"/>
          </svg>
        </div>
        <p style="color:#aaa;">Parece que esta categoría aún está vacía</p>
      </div>
    `;
  } else {
    html = items
      .map(function (item) {
        let preciosHtml = "";
        let tienePrecios = false;
        const imageUrl = construirUrlImagenProducto(item.pro_img);

        if (item.precios) {
          try {
            const preciosArray = JSON.parse(item.precios);
            if (preciosArray.length > 0) {
              tienePrecios = true;
              // Reset HTML -> Clean Structure for CSS Control
              preciosHtml = `
              <div class="multiprice-wrapper" style="display:none; width: 100%; margin-top: 5px; background: transparent; border: none;">
                <div class="product-prices-grid">
            `;

              // 1. Add Base Price
              preciosHtml += `
              <div class="price-item">
                <span class="price-label">Precio base</span>
                <button class="btn btn-outline-primary agregar-precio"
                  data-precio="${item.pro_cos}"
                  data-id_pres="${item.id_pres}"
                  data-price-name="Precio base"
                  data-producto='${JSON.stringify(item)}'>
                  ${item.pro_cos}
                </button>
              </div>
            `;

              preciosArray.forEach((precio) => {
                // Fallback para evitar undefined
                const labelPrecio = precio.descripcion || precio.nombre || precio.label || "Opción";

                preciosHtml += `
                <div class="price-item">
                  <span class="price-label" title="${labelPrecio}">${labelPrecio}</span>
                  <button class="btn btn-secondary agregar-precio"
                    data-precio="${precio.precio}"
                    data-id_pres="${item.id_pres}"
                    data-price-name="${labelPrecio}"
                    data-producto='${JSON.stringify(item)}'>
                    ${precio.precio}
                  </button>
                </div>
              `;
              });

              preciosHtml += `
                </div>
              </div>
            `;

            }
          } catch (e) {
            console.warn("Error al parsear precios:", e);
            preciosHtml = ""; // Reset to avoid broken UI
          }
        }

        // HTML para vista tipo lista
        if (vista === "list") {
          return `
                <div class="card-menu-wrapper" style="border-bottom: 1px solid #ccc; padding: 10px; display: flex; align-items: center; gap: 10px; cursor: pointer;">
                  <img class="js-product-img" src="${imageUrl}" alt="" style="width: 50px; height: 50px; object-fit: cover; border-radius: 4px;">
              <div style="flex-grow: 1;">
              <div style="font-weight: bold;">${item.pro_pre}</div>
              <div style="color: #888;">Precio: ${item.pro_cos}</div>
            </div>
              <div class="stock-container-list">
                ${renderStockBadgeList(item)}
              </div>
            ${preciosHtml}
          </div>
              `;
        } else {
          // HTML para vista tipo grid (tarjeta)
          return `
              <div class="card-menu-wrapper">
                <div class="card-menu">
                  <div class="card-menu-header" style="position: relative;">
                    <img class="js-product-img" src="${imageUrl}" alt="">
                    ${renderStockBadge(item)}
                  </div>
                  <div class="menu-name">${item.pro_pre}</div>
                  <div class="menu-category prices-list" title="Ver más precios" style="padding:4px 8px;border:1px solid #7460ee;border-radius:4px;background-color:#7460ee;cursor:pointer">
                    <span class="price" style="margin:auto; color: white;">${item.pro_cos
            }</span>
                  </div>
                </div>
            ${preciosHtml}
          </div>
              `;
        }
      })
      .join("");
  }

  // Limpiar y aplicar clase de vista (list o grid)
  container
    .removeClass("list-view grid-view")
    .addClass(vista === "list" ? "list-view" : "grid-view")
    .html(html);

  validarImagenesProductosEnSegundoPlano(container);

  // Eventos por tarjeta
  container.find(".card-menu-wrapper").each(function (index) {
    $(this).data("item", items[index]);
  });

  container.find(".card-menu-wrapper").on("click", function () {
    const item = $(this).data("item");
    if (item.precios) {
      try {
        const preciosArray = JSON.parse(item.precios);
        if (preciosArray.length > 0) {
          $(this).find(".multiprice-wrapper").slideToggle("fast");
          return;
        }
      } catch (e) {
        console.warn("Error al parsear precios:", e);
      }
    }

    if (item.Stock && item.Stock.crt_stock == 1 && item.Stock.ingredientes) {
      if (tieneStockDisponible(item)) {
        item.cantidad = 1;
        agregarProducto(item);
        actualizarStockVisual(this, item);
      } else {
        mostrarAlerta(
          "warning",
          "Sin stock disponible",
          "No hay stock suficiente para agregar este producto."
        );
      }
    } else {
      item.cantidad = 1;
      agregarProducto(item);
    }
  });
}

// function reponerStockVisual(product) {
//   try {
//     if(product.Stock.ingredientes){
//       const ingredientes = JSON.parse(product.Stock.ingredientes);
//       const principal = ingredientes.find(i => i.principal === 'si' || ingredientes.length === 1);

//         if (principal) {
//           const cantidadRestaurar = product.cantidad || 1;

//           if (product.Stock.receta == 1) {

//             principal.stock_actual = (
//               parseFloat(principal.stock_actual) +
//               (parseFloat(principal.cant) * cantidadRestaurar)
//             ).toFixed(2);
//           } else {

//             principal.stock_actual = (
//               parseFloat(principal.stock_actual) +
//               cantidadRestaurar
//             ).toFixed(2);
//           }

//           product.Stock.ingredientes = JSON.stringify(ingredientes);

//           actualizarBadgeDelProducto(product.id_pres, product);
//       }

//     }
//   } catch (e) {
//     console.warn("Error al reponer stock:", e);
//   }
// }

function reponerStockVisual(product) {
  // Delega al motor compartido: suma qty al insumo base y repinta TODAS las presentaciones afectadas
  var qty = parseFloat(product.cantidad) || 1;
  actualizarStockRuntime(product, qty, 'sumar');
}

// function actualizarBadgeDelProducto(id_pres, product) {
//   const $cards = $(".card-menu");
//   $cards.each(function () {
//     const item = $(this).data("item");
//     if (item && item.id_pres === id_pres) {
//       const $header = $(this).find(".card-menu-header");
//       $header.find(".stock-badge").remove();
//       $header.append(renderStockBadge(product));
//     }
//   });
// }

function actualizarBadgeDelProducto(id_pres, productoActualizado = null) {
  const $cards = $(".card-menu");

  $cards.each(function () {
    const item = $(this).data("item");

    if (item && item.id_pres === id_pres) {
      const $header = $(this).find(".card-menu-header");
      $header.find(".stock-badge").remove();

      const producto =
        productoActualizado || Productos.find((p) => p.id_pres === id_pres);
      if (producto) {
        $header.append(renderStockBadge(producto));
      }
    }
  });
}

// function tieneStockDisponible(item) {
//     console.log("Verificando stock para:", item);

//   try {
//     const ingredientes = JSON.parse(item.Stock.ingredientes);
//     const principal = ingredientes.find(i => i.principal === 'si' || ingredientes.length === 1);

//     if (principal) {
//       if (item.Stock.receta == 1) {
//         if (parseFloat(principal.cant) > 0) {
//           const stockDisponible = parseFloat(principal.stock_actual) / parseFloat(principal.cant);
//           return stockDisponible > 0;
//         }
//       } else {
//         return parseFloat(principal.stock_actual) > 0;
//       }
//     }
//   } catch (e) {
//     console.warn("Error al verificar stock:", e);
//   }
//   return false;
// }

function tieneStockDisponible(item) {
  var actualizado = Productos.find(function(p) { return p.id_pres === item.id_pres; });
  if (actualizado) item = actualizado;
  if (!item.Stock || item.Stock.crt_stock != 1) return true;
  // Usa el runtime compartido: debe haber al menos 1 unidad completa vendible
  return getStockVendible(item) >= 1;
}

// function actualizarStockVisual(cardElement, item) {
//   try {
//     const ingredientes = JSON.parse(item.Stock.ingredientes);
//     const principal = ingredientes.find(
//       (i) => i.principal === "si" || ingredientes.length === 1
//     );

//     if (principal) {
//       const cantidadAgregar = item.cantidad || 1;
//       let nuevoStock;

//       if (item.Stock.receta == 1) {
//         nuevoStock =
//           parseFloat(principal.stock_actual) -
//           parseFloat(principal.cant) * cantidadAgregar;
//       } else {
//         nuevoStock = parseFloat(principal.stock_actual) - cantidadAgregar;
//       }

//       principal.stock_actual = Math.max(0, nuevoStock).toFixed(2);
//       item.Stock.ingredientes = JSON.stringify(ingredientes);

//       const index = Productos.findIndex((i) => i.id_pres === item.id_pres);
//       if (index !== -1) {
//         Productos[index].Stock.ingredientes = item.Stock.ingredientes;
//       }

//       const $header = $(cardElement).find(".card-menu-header");
//       $header.find(".stock-badge").remove();
//       $header.append(renderStockBadge(item));
//     }
//   } catch (e) {
//     console.warn("Error al actualizar stock:", e);
//   }
// }

function actualizarStockVisual(wrapperEl, item) {
  // Delega al motor compartido: resta qty del insumo base y repinta TODAS las presentaciones afectadas
  var qty = parseFloat(item.cantidad) || 1;
  actualizarStockRuntime(item, qty, 'restar');
}

function renderStockBadge(item) {
  var actualizado = Productos.find(function(p) { return p.id_pres === item.id_pres; });
  if (actualizado) item = actualizado;
  if (!item.Stock || item.Stock.crt_stock != 1 || !item.Stock.ingredientes) return '';
  var stock = getStockVendible(item); // Math.floor, desde StockRuntime compartido
  if (stock === null) return '';
  return '<div class="stock-badge" style="position:absolute;bottom:5px;right:5px;background-color:rgba(0,0,0,0.7);color:white;font-size:16px;padding:2px 6px;border-radius:4px;">Stock: ' + stock + '</div>';
}

function renderStockBadgeList(item) {
  var actualizado = Productos.find(function(p) { return p.id_pres === item.id_pres; });
  if (actualizado) item = actualizado;
  if (!item.Stock || item.Stock.crt_stock != 1 || !item.Stock.ingredientes) return '';
  var stock = getStockVendible(item); // Math.floor, desde StockRuntime compartido
  if (stock === null) return '';
  return '<span class="stock-badge-list" style="display:inline-block;background:#00afe9;color:#333;font-size:14px;padding:2px 6px;border-radius:4px;">Stock: ' + stock + '</span>';
}

let _productCounter = 0;

function agregarProducto(product, esNuevo = true) {
  const item = { ...product };

  item.isNew = esNuevo;
  item.wrapperId = `po-${++_productCounter}`;

  item.nombre_precio = item.nombre_precio || "Principal";

  const container = $(".po-items");
  const newItemHtml = `
              <div class="po-item-wrapper${esNuevo ? " new-item" : ""}"
            data-wrapper-id="${item.wrapperId}">
      <button type="button" class="po-item collapsible">
        <div class="description">
          <div class="info">
            <span class="name">
              ${item.pro_pre}
              <span class="r-order-type-label" style="margin-left:.6rem">
                ${item.pro_nom}
              </span>
            </span>
            <span class="price">${item.pro_cos}</span>
          </div>
          <div class="actions">
            <div style="display:flex;align-items:center;gap:.5rem">
              <span class="edit_precio" title="Editar pedido"
                    style="padding:4px 8px;border:1px solid #ddd;border-radius:4px;
                           color:blue;background-color:#fff">
                <i class="fas fa-pencil-alt"></i>
              </span>
              <span class="comments" title="Agregar comentario"
                    style="padding:4px 8px;border:1px solid #ddd;border-radius:4px;
                           color:darkorange;background-color:#fff">
                <i class="fas fa-comment-alt"></i>
              </span>
              <span class="remove-item" title="Quitar de la lista"
                    style="padding:4px 8px;border:1px solid #ddd;border-radius:4px;
                           color:red;background-color:#fff">
                <i class="fas fa-trash"></i>
              </span>
            </div>
            <div class="texto-intermedio"
                 style="margin: 0.5rem 0; font-weight: bold; color: #555;"></div>
            <div class="cantidad"
                 style="display:flex;align-items:center;gap:.5rem">
              <span class="down"
                    style="padding:4px 8px;border:1px solid #999;border-radius:4px;
                           background-color:#fff">-</span>
              <span>${item.cantidad}</span>
              <span class="up"
                    style="padding:4px 8px;border:1px solid #999;border-radius:4px;
                           background-color:#fff">+</span>
            </div>
          </div>
        </div>
      </button>

      <div class="content" style="padding: 0; margin: 0;">
        <div class="modal-content animated bounceInTop" style="padding: .5rem;">
          <div class="modal-body floating-labels p-2">

            <div class="nota-list animated fadeIn mb-2">
              <div class="demo-checkbox row g-2"></div>
            </div>

            <div class="nota-new text-center text-muted small mb-2"
                 style="line-height: 1.2;">
              <i class="mdi mdi-alert-circle" style="font-size: 1.5rem;"></i><br>
              No tiene elementos.<br>
              Agregue una nota <code style="cursor: pointer;">'NUEVA'</code>
            </div>

            <div class="nota-manual-wrapper d-flex align-items-center mt-2"
                 style="gap: .4rem;">
              <input type="text"
                     class="nota_manual_text form-control form-control-sm
                            border border-dark rounded"
                     placeholder="Escribir nota manual..." />
              <button type="button"
                      class="btn btn-warning btn-sm agregar-nota-manual"
                      title="Agregar nota">
                <i class="fas fa-plus"></i>
              </button>
              <button type="button"
                      class="btn btn-success btn-sm guardar-nota-manual"
                      title="Guardar nota en BD">
                <i class="fas fa-save"></i>
              </button>
            </div>

            <input type="hidden" id="notapadre"/>
            <h6 class="card-subtitle notlist p-0 m-0 small"></h6>
            <input type="hidden" id="cod_add"/>
            <input type="hidden" id="cod_pres_add"/>
            <input type="hidden" id="cod_prod_add"/>

          </div>
        </div>
      </div>
    </div>
            `;

  const newItem = $(newItemHtml).data("item", item);
  container.prepend(newItem);

  actualizarTotalesDesdeLista();
  actualizarContadorPedidos();
  showToast(`${item.pro_pre} agregado`, "success");
}

function showToast(message, icon = "info") {
  Swal.fire({
    toast: true,
    position: "top-end",
    icon,
    title: message,
    showConfirmButton: false,
    timer: 3000,
    timerProgressBar: true,
    background: "#f0f0f0",
    customClass: {
      popup: "shadow rounded-lg",
    },
  });
}

function toggleCommentInput(element) {
  $(element).find(".comment-input").toggle();
}

function actualizarTotalesDesdeLista() {
  let subtotal = 0;

  $(".po-item").each(function () {
    const item = $(this);
    // Remove "S/" and non-numeric chars if necessary, but parseFloat usually handles leading numbers.
    // However, if text is "S/ 10.00", parseFloat("S/ 10.00") is NaN. 
    // The previous code used .text() directly. Let's make it robust.
    let priceText = item.find(".price").text().replace(/[^\d.-]/g, '');
    const precio = parseFloat(priceText) || 0;
    const cantidad = parseInt(item.find(".cantidad span").eq(1).text()) || 0;

    subtotal += cantidad * precio;
  });

  // Update Global Variable
  TotalPedido = subtotal;

  // Update cart panel totals (Subtotal / igv / Total visible in the order sidebar)
  $(".sub-total div:eq(0) span:eq(1)").text("S/" + formatNumber(subtotal));
  $(".sub-total div:eq(1) span:eq(1)").text("S/0.00"); // IGV incluido en precio
  $(".total span:eq(1)").text("S/" + formatNumber(subtotal));

  // Update Subtotal Display (payment section)
  $(".SubtotalPedido").text(formatNumber(subtotal));

  // Recalculate totals (Discount, Delivery, Final Total)
  actualizarPrecioDescuentos();
}

function calcularTotalDividirCuenta(subtotalSeleccionado) {
  let total = 0;
  const tipo_descuento = Number($("#tipo_descuento_select").val() || 0);
  const comision_delivery = parseMontoSeguro($("#comision_delivery").val());
  const monto_descuento_ingresado = parseMontoSeguro($("#descuento_monto_fijo").val());
  const subtotal = parseFloat(subtotalSeleccionado) || 0;
  const descuentoAplicado = tipo_descuento === 1 ? subtotal : Math.min(monto_descuento_ingresado, subtotal);

  console.log("subtotalSeleccionado", subtotalSeleccionado);

  if (tipo_descuento === 1) {
    total = comision_delivery;
    $("#descuento_monto_fijo").val(formatNumber(descuentoAplicado));
    $("#descuento_porcentaje").val("100");
    $(".SubtotalPedido").text(formatNumber(0));
  } else {
    total = subtotal - descuentoAplicado + comision_delivery;
    $(".SubtotalPedido").text(formatNumber(subtotalSeleccionado));
  }

  TotalPedido = subtotal;

  $("#pago_efe").val(formatNumber(total));
  $(".totalPedidoMenosTarjeta").text(formatNumber(total));
  $(".totalDescuento").text(formatNumber(descuentoAplicado));
  actualizarVuelto();
}

function actualizarPrecioDescuentos() {
  let total = 0;
  const tipo_descuento = Number($("#tipo_descuento_select").val() || 0);
  const comision_delivery = parseMontoSeguro($("#comision_delivery_input").val());
  const subtotal = parseFloat(TotalPedido) || 0;
  const personalSeleccionado = parseInt($("#personal_descuento").val(), 10) || 0;
  const motivo = ($("#descuento_motivo").val() || "").trim();
  const montoIngresado = parseMontoSeguro($("#descuento_monto_fijo").val());
  const monto_descuento = tipo_descuento === 1 ? subtotal : Math.min(montoIngresado, subtotal);
  const tipoDocumento = Number($('input:radio[name="tipo_doc"]:checked').val() || 0);

  if (tipo_descuento === 1 && (tipoDocumento === 1 || tipoDocumento === 2)) {
    mostrarAlerta(
      "warning",
      "Atención",
      "No se puede aplicar cortesía con boleta o factura."
    );
    return;
  }

  if (tipo_descuento === 2 && monto_descuento <= 0) {
    mostrarAlerta("warning", "Atención", "Ingrese un monto de descuento válido.");
    return;
  }

  if (tipo_descuento === 3) {
    if (personalSeleccionado <= 0) {
      mostrarAlerta("warning", "Atención", "Seleccione el personal para crédito.");
      return;
    }
    if (monto_descuento <= 0) {
      mostrarAlerta("warning", "Atención", "Ingrese un monto de crédito válido.");
      return;
    }
  }

  // Update Hidden Inputs for Form Submission
  $("#comision_delivery").val(comision_delivery.toFixed(2));
  $("#descuento_monto_hidden").val(monto_descuento.toFixed(2));
  $("#descuento_tipo_hidden").val(String(tipo_descuento));
  $("#descuento_motivo_hidden").val(tipo_descuento === 0 ? "" : motivo);
  $("#descuento_personal_hidden").val(tipo_descuento === 3 ? String(personalSeleccionado) : "0");

  if (tipo_descuento === 1) {
    total = comision_delivery;
    $(".SubtotalPedido").text(`${formatNumber(0)} `);
    $("#descuento_porcentaje").val("100");
    $("#descuento_monto_fijo").val(formatNumber(monto_descuento));
  } else if (tipo_descuento === 2 || tipo_descuento === 3) {
    total = subtotal - monto_descuento + comision_delivery;
  } else {
    $(".SubtotalPedido").text(`${formatNumber(subtotal)} `);
    total = subtotal - monto_descuento + comision_delivery;
  }

  // Para cortesía el SubtotalPedido ya es 0; mostrar DESCUENTO=0 evita confusión.
  $(".totalDescuento").text(formatNumber(tipo_descuento === 1 ? 0 : monto_descuento));
  $(".totalDelivery").text(formatNumber(comision_delivery));
  $("#pago_efe").val(formatNumber(total));
  $(".totalPedidoMenosTarjeta").text(formatNumber(total));
  actualizarVuelto();

  const dialog = document.querySelector(".dialogBtn");
  dialog.close();
}

function extraerDataDetalle() {
  var productos = [];
  var total = 0;

  $(".po-items .po-item-wrapper").each(function () {
    var prod = $(this).data("item");

    if (!prod.isNew) {
      return;
    }

    var precio = parseFloat(prod.pro_cos) || 0;
    prod.quantity =
      parseInt($(this).find(".cantidad span").eq(1).text(), 10) || 1;
    var comentarios = $(this).find(".texto-intermedio").text().trim();
    prod.comentarios = comentarios;
    total += precio * prod.quantity;

    productos.push(prod);
  });

  return {
    cod_ped: $("#id_pedido").val(),
    codtipoped: $("#codtipoped").val(),
    igv: (total * 0.1).toFixed(2),
    items: convertirItems(productos),
    subtotal: (total - total * 0.1).toFixed(2),
    total: total.toFixed(2),
  };
}

function convertirItems(itemsOriginales) {
  return itemsOriginales.map(function (item, index) {
    var area_id = parseInt(item.id_areap, 10);
    var cantidad = item.quantity;
    var comentario = item.comentarios || "";
    var id = index;
    var nombre_imp =
      item.Impresora && item.Impresora.nombre ? item.Impresora.nombre : "";
    var nombreprecio = item.nombre_precio;
    var precio = item.pro_cos;
    var presentacion = item.pro_pre;
    var producto = item.pro_nom;
    var producto_id = parseInt(item.id_pres, 10);
    var total = (parseFloat(precio) * cantidad).toFixed(2);

    return {
      area_id: area_id,
      cantidad: cantidad,
      comentario: comentario,
      id: id,
      nombre_imp: nombre_imp,
      nombreprecio: nombreprecio,
      precio: precio,
      presentacion: presentacion,
      producto: producto,
      producto_id: producto_id,
      total: total,
    };
  });
}

function dataPedido() {
  const contextoActual = getPedidoContextoActual();
  const idMozoPedido = getResponsableActualId();

  return {
    id_mesa:
      contextoActual.tipoPedido === 1
        ? contextoActual.idMesa || $(".id-mesa").val()
        : $(".id-mesa").val(),
    id_mozo: idMozoPedido,
    nomb_cliente: $("#buscar_cliente_pedido").val(),
    nro_personas: 1,
    cliente_id: $("#cliente_pedido_id").val(),
    id_repartidor: $("#id_repartidor").val(),
    tipo_entrega: 1,
    pedido_programado: 0,
    telefono_cliente: "0000",
    direccion_cliente: "-",
    referencia_cliente: "-",
    id_tdoc: 1,
    num_cliente: "00000000",
    canal: "2",
    responsable_id: idMozoPedido,
    responsable_nombre: getResponsableActualNombre(),
  };
}

let isSubmitting = false;

function guardarPedido() {
  const $btn = $("#btn_guardar_pedido, #btn_registrar_pedido").first();

  if (isSubmitting) return;
  isSubmitting = true;

  // 1) Desactivar el botón de inmediato
  $btn.prop("disabled", true).text("Guardando…");

  let detalle = extraerDataDetalle();
  let pedido = dataPedido();
  const tipoPedidoActual = normalizarNumeroContexto($("#codtipoped").val());
  const contextoActual = getPedidoContextoActual();
  let tipo_pedido = "pc" + $("#codtipoped").val();

  //   console.log(pedido);
  //   console.log(detalle);
  //   return;

  if (detalle.items.length == 0) {
    mostrarAlerta(
      "warning",
      "Sin productos",
      "Debe agregar productos al pedido."
    );
    isSubmitting = false;
    $btn.prop("disabled", false).text("Hacer pedido");
    return;
  }

  if (tipoPedidoActual === 1) {
    const idPedidoActual = contextoActual.idPedido || normalizarNumeroContexto(detalle.cod_ped);
    const idMesaActual = contextoActual.idMesa || normalizarNumeroContexto(pedido.id_mesa);
    const mesaActual = limpiarTextoContexto(contextoActual.mesa);
    const salonActual = limpiarTextoContexto(contextoActual.salon);

    if (idPedidoActual > 0 && (!idMesaActual || !mesaActual || !salonActual)) {
      mostrarAlerta(
        "warning",
        "Mesa incompleta",
        "No se pudo confirmar la mesa del pedido. Vuelva a seleccionar la mesa antes de agregar productos."
      );
      isSubmitting = false;
      $btn.prop("disabled", false).text("realizar pedido");
      return;
    }

    detalle.cod_ped = idPedidoActual || 0;
    pedido.id_mesa = idMesaActual || "";
  }

  $.ajax({
    dataType: "JSON",
    type: "POST",
    data: {
      codtipoped: tipo_pedido,
      pedido: pedido,
      detalle: detalle,
    },
    url: $("#url").val() + "venta/pedido_create",
    success: function (data) {
      if (data.status == "error") {
        console.error("Error al guardar pedido:", data);
        mostrarAlerta(
          "error",
          "No se pudo guardar el pedido",
          data.message || "Ocurrió un problema al registrar el pedido."
        );
        return;
      }

      $("#modal-super-test").modal("hide");
      vaciarListaProductos();

      let tipo_pedido = $("#codtipoped").val();

      if ($("#impresion_automatica_comanda").val() == 1) {
        imprimirComanda(pedido, tipo_pedido, detalle.items, data.pedido_id);
      }

      listarPedidosGuardados(tipo_pedido, data.pedido_id);
    },
    error: function (xhr, status, error) {
      console.error("Error al guardar pedido:", error);
    },
    complete: function () {
      isSubmitting = false;
      $btn.prop("disabled", false).text("realizar pedido");
    },
  });
}

function listarPedidosGuardados(tipo_pedido, id_pedido) {
  if (tipo_pedido == 1) {
    console.log("Listando pedidos para salón");

    listarPedidos(
      $("#codsalonorigen").val(),
      $("#codmesaorigen").val(),
      1,
      id_pedido,
      $("#mesa").val(),
      $("#salon").val(),
      "i"
    );
  } else if (tipo_pedido == 2) {
    console.log("Listando pedidos para mostrador");

    $(".mostrador02").trigger("click");
    mostrador_list_a();
    listarPedidosDetalle(2, id_pedido);
  } else if (tipo_pedido == 3) {
    $(".delivery02").trigger("click");
    listarPedidosDetalle(3, id_pedido, 0, "automatico");
    console.log("Listando pedidos para delivery");
    console.log(pedidoSeleccionado);
  }
}

// function imprimirComanda(pedido, idTipoPedido, detalles, codAnulacion = 0) {

//   function parsePedidoInfo(text) {
//     const [numero = "", cliente = ""] = text.split("–").map(s => s.trim());
//     return { numero, cliente };
//   }

//   function buildPrintUrl(payload) {
//     const serialized = encodeURIComponent(JSON.stringify(payload));
//     const printCom    = $('#print_com').val() === '1';
//     const pcIp        = $('#pc_ip').val();
//     const baseUrl     = $('#url').val();
//     if (printCom) {
//       return { url: `http://${pcIp}/imprimir/comanda.php?data=${serialized}`, features: '_blank' };
//     } else {
//       return {
//         url:  `${baseUrl}venta/impresion_comanda/?data=${serialized}`,
//         features: 'top=500,left=500,width=400,height=400,_blank'
//       };
//     }
//   }

//   function openPrintWindow({ url, features }) {
//     window.open(url, '_blank', features);
//   }

//   const textoPedido = $('.pedido-numero').text() || "";
//   const { numero: pedidoNumero, cliente: pedidoCliente } = parsePedidoInfo(textoPedido);

//   const gruposPorArea = detalles.reduce((acc, item) => {
//     const area = item.area_id;
//     (acc[area] = acc[area] || []).push(item);
//     return acc;
//   }, {});

//   Object.values(gruposPorArea).forEach(itemsDeArea => {
//     const impresora    = itemsDeArea[0].nombre_imp;    // asume misma impresora por área
//     const pedidoMozo   = $('#select_mozo option:selected').text();
//     const datoUsuario  = $('#dato_usuario').val();
//     const correlativo  = correlativo_imp();
//     const nombrePc     = $('#pc_name').val();
//     const direccion_comanda = $("input[name='tipo_entrega_modal']:checked").val() || "";
//     const direccion_cliente     = $('#direccion_cliente_modal').val() || "";

//     const payload = {
//       pedido_tipo      : idTipoPedido,
//       pedido_numero    : pedidoNumero,
//       pedido_cliente   : pedidoCliente,
//       pedido_mozo      : pedidoMozo,
//       direccion_cliente      : direccion_cliente,
//       direccion_comanda  : direccion_comanda,
//       dato_usuario     : datoUsuario,
//       precio_comanda   : 1,
//       correlativo_imp  : correlativo,
//       nombre_imp       : impresora,
//       nombre_pc        : nombrePc,
//       codigo_anulacion : codAnulacion,
//       items            : itemsDeArea
//     };

//     console.log("Imprimiendo comanda:", payload);

//     const { url, features } = buildPrintUrl(payload);
//     openPrintWindow({ url, features });
//   });
// }

function validarConfiguracionImpresionLocal(showAlert = true) {
  const printCom = $("#print_com").val() === "1";
  const pcIp = ($("#pc_ip").val() || "").trim();

  if (!printCom) {
    return { ok: true, printCom, pcIp };
  }

  if (!pcIp) {
    if (showAlert) {
      Swal.fire({
        icon: "warning",
        title: "Impresión local no configurada",
        text: "Falta configurar la IP de Mike (pc_ip).",
        confirmButtonColor: "#34d16e",
      });
    }
    return { ok: false, printCom, pcIp };
  }

  return { ok: true, printCom, pcIp };
}

function validarPopupImpresion(showAlert = true) {
  const popup = window.open("", "_blank", "width=120,height=80");
  if (!popup) {
    if (showAlert) {
      Swal.fire({
        icon: "warning",
        title: "Popup bloqueado",
        text: "Permite ventanas emergentes para poder imprimir comandas.",
        confirmButtonColor: "#34d16e",
      });
    }
    return false;
  }
  popup.close();
  return true;
}

function pingMikeEndpoint(pcIp, timeoutMs = 2500) {
  return new Promise((resolve) => {
    if (typeof fetch !== "function" || typeof AbortController === "undefined") {
      resolve({ ok: false, detail: "fetch_not_supported" });
      return;
    }

    const controller = new AbortController();
    const timer = setTimeout(() => {
      controller.abort();
      resolve({ ok: false, detail: "timeout" });
    }, timeoutMs);

    fetch(`http://${pcIp}/imprimir/comanda.php?healthcheck=1&t=${Date.now()}`, {
      method: "GET",
      mode: "no-cors",
      cache: "no-store",
      signal: controller.signal,
    })
      .then(() => {
        clearTimeout(timer);
        resolve({ ok: true, detail: "reachable" });
      })
      .catch((err) => {
        clearTimeout(timer);
        resolve({ ok: false, detail: err?.message || "network_error" });
      });
  });
}

async function runComandaHealthCheck(showModal = true) {
  const printCom = $("#print_com").val() === "1";
  const pcIp = ($("#pc_ip").val() || "").trim();
  const pcName = ($("#pc_name").val() || "").trim();
  const baseUrl = ($("#url").val() || "").trim();

  const checks = [];
  checks.push({
    label: "Modo impresión",
    ok: true,
    detail: printCom ? "Mike local (print_com=1)" : "Servidor web (print_com=0)",
  });

  const popupOk = validarPopupImpresion(false);
  checks.push({
    label: "Popups del navegador",
    ok: popupOk,
    detail: popupOk ? "Permitidos" : "Bloqueados",
  });

  if (printCom) {
    const ipOk = pcIp.length > 0;
    checks.push({
      label: "Configuración pc_ip",
      ok: ipOk,
      detail: ipOk ? pcIp : "Vacío",
    });

    if (ipOk) {
      const ping = await pingMikeEndpoint(pcIp);
      checks.push({
        label: "Conexión a Mike",
        ok: ping.ok,
        detail: ping.ok ? `http://${pcIp}/imprimir` : ping.detail,
      });
    } else {
      checks.push({
        label: "Conexión a Mike",
        ok: false,
        detail: "No evaluado (pc_ip vacío)",
      });
    }
  } else {
    checks.push({
      label: "Ruta de impresión web",
      ok: baseUrl.length > 0,
      detail: `${baseUrl}venta/impresion_comanda/`,
    });
  }

  const okGlobal = checks.every((c) => c.ok);
  if (showModal) {
    const html = `
      <div style="text-align:left">
        <div><strong>PC:</strong> ${pcName || "(sin nombre)"}</div>
        <div><strong>IP:</strong> ${pcIp || "(sin ip)"}</div>
        <hr>
        ${checks
          .map(
            (c) =>
              `<div style="margin:4px 0;"><strong>${c.ok ? "OK" : "FAIL"} - ${
                c.label
              }:</strong> ${c.detail}</div>`
          )
          .join("")}
      </div>
    `;

    Swal.fire({
      icon: okGlobal ? "success" : "warning",
      title: okGlobal ? "Health Check OK" : "Health Check con alertas",
      html,
      confirmButtonColor: "#34d16e",
    });
  }

  return { ok: okGlobal, checks };
}

window.runComandaHealthCheck = runComandaHealthCheck;

$(document).on("click", ".btn-health-check", async function (e) {
  e.preventDefault();
  await runComandaHealthCheck(true);
});

function imprimirComanda(pedido, idTipoPedido, detalles, codAnulacion = 0) {
  function buildPrintUrl(payload) {
    const serialized = encodeURIComponent(JSON.stringify(payload));
    const printCom = $("#print_com").val() === "1";
    const pcIp = ($("#pc_ip").val() || "").trim();
    const baseUrl = $("#url").val();

    if (printCom) {
      const check = validarConfiguracionImpresionLocal(true);
      if (!check.ok) return null;
      return {
        url: `http://${pcIp}/imprimir/comanda.php?data=${serialized}`,
        features: "_blank",
      };
    } else {
      return {
        url: `${baseUrl}venta/impresion_comanda/?data=${serialized}`,
        features: "top=500,left=500,width=400,height=400,_blank",
      };
    }
  }

  function openPrintWindow({ url, features }) {
    const popup = window.open(url, "_blank", features);
    if (!popup) {
      Swal.fire({
        icon: "warning",
        title: "Popup bloqueado",
        text: "Habilita ventanas emergentes para completar la impresión.",
        confirmButtonColor: "#34d16e",
      });
    }
  }

  const limpiarTexto = (value) => String(value || "").replace(/\s+/g, " ").trim();
  const esPlaceholder = (value) => {
    const txt = limpiarTexto(value).toLowerCase();
    return (
      txt === "" ||
      txt === "-" ||
      txt === "mesa: -" ||
      txt === "mesa:-" ||
      txt === "nuevo pedido:" ||
      txt === "detalle:" ||
      txt === "undefined" ||
      txt === "null"
    );
  };
  const valorValido = (value) => (esPlaceholder(value) ? "" : limpiarTexto(value));
  const extraerMesa = (value) => {
    const txt = limpiarTexto(value);
    const match = txt.match(/mesa\s*:\s*([^-][^|]*)/i);
    if (!match) return "";
    const mesa = limpiarTexto(match[1]).replace(/\s+-\s*$/, "");
    return esPlaceholder(mesa) ? "" : mesa;
  };
  const extraerSalon = (value) => {
    const txt = limpiarTexto(value);
    if (!txt) return "";
    const partes = txt.split(/\s*-\s*mesa\s*:/i);
    return valorValido(partes[0] || "");
  };

  const textoPedidoUI = limpiarTexto($(".pedido-numero").text());
  const textoClienteUI = limpiarTexto($(".pedido-cliente").text());
  const infoMesaUI = limpiarTexto($("#info_mesa").text());
  const salonHidden = valorValido($("#salon").val());
  const mesaHidden = valorValido($("#mesa").val());

  let pedidoNumero =
    valorValido(pedido && pedido.numero) ||
    valorValido(pedido && pedido.nro_pedido) ||
    valorValido(pedido && pedido.pedido_numero) ||
    valorValido(textoPedidoUI) ||
    "";
  let pedidoCliente =
    Number(idTipoPedido) !== 1
      ? valorValido(pedido && pedido.nomb_cliente) ||
        valorValido(pedido && pedido.pedido_cliente) ||
        valorValido(textoClienteUI) ||
        ""
      : "";

  if (Number(idTipoPedido) === 1) {
    const mesaDetectada =
      mesaHidden ||
      extraerMesa(infoMesaUI) ||
      extraerMesa(textoPedidoUI) ||
      extraerMesa(textoClienteUI) ||
      extraerMesa(pedido && pedido.nomb_cliente);
    const salonDetectado =
      salonHidden ||
      extraerSalon(infoMesaUI) ||
      extraerSalon(textoPedidoUI) ||
      valorValido(pedido && pedido.pedido_numero);

    pedidoNumero = salonDetectado || "MESA";
    pedidoCliente = mesaDetectada ? `Mesa: ${mesaDetectada}` : "Mesa: S/N";
  }

  const gruposPorArea = detalles.reduce((acc, item) => {
    const area = item.area_id;
    (acc[area] = acc[area] || []).push(item);
    return acc;
  }, {});

  Object.values(gruposPorArea).forEach((itemsDeArea) => {
    const impresora = itemsDeArea[0].nombre_imp; // Se asume la misma impresora para toda el área
    const pedidoMozo =
      (pedido && pedido.responsable_nombre) ||
      getResponsableActualNombre() ||
      ($("#nombre_mozo").val() || "").trim() ||
      ($("#select_mozo_input option:selected").text() || "").trim();
    const datoUsuario = $("#dato_usuario").val();
    const correlativo = correlativo_imp();
    const nombrePc = $("#pc_name").val();
    const direccion_comanda =
      $("input[name='tipo_entrega_modal']:checked").val() || "";
    const direccion_cliente = $("#direccion_cliente_modal").val() || "";

    const payload = {
      pedido_tipo: idTipoPedido,
      pedido_numero: pedidoNumero,
      pedido_cliente: pedidoCliente,
      pedido_mozo: pedidoMozo,
      direccion_cliente: direccion_cliente,
      direccion_comanda: direccion_comanda,
      dato_usuario: datoUsuario,
      precio_comanda: 1,
      mostrar_precio_comanda: $("#mostrar_precio_comanda").val() || "0",
      correlativo_imp: correlativo,
      nombre_imp: impresora,
      nombre_pc: nombrePc,
      codigo_anulacion: codAnulacion,
      items: itemsDeArea,
    };

    console.log("Imprimiendo comanda:", payload);

    const target = buildPrintUrl(payload);
    if (!target) return;
    const { url, features } = target;
    openPrintWindow({ url, features });
  });
}

// function cancelarPedido(id_pedido, id_mesa, id_tipo_pedido) {
//   var html_confirm = '<div>Se procederá a liberar este pedido</div><br>' +
//       '<div>Ingrese código de seguridad</div><br>' +
//       '<form><input class="form-control text-center w-50" type="password" id="codigo_anular_venta_" autocomplete="off"/></form><br>' +
//       '<div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>';

//   Swal.fire({
//     title: 'Necesitamos de tu Confirmación',
//     html: html_confirm,
//     icon: 'warning',
//     showCancelButton: true,
//     confirmButtonColor: '#34d16e',
//     confirmButtonText: 'Si, Adelante!',
//     cancelButtonText: "No!",
//     showLoaderOnConfirm: true,
//     preConfirm: function() {

//       return new Promise(function(resolve, reject) {

//         if ($('#codigo_anular_venta').val() === $('#codigo_anular_venta_').val()) {
//           $.ajax({
//             type: 'POST',
//             data: {
//               id_pedido: id_pedido,
//               id_mesa: id_mesa,
//               tipo_pedido: id_tipo_pedido,
//               codigo_seguridad: $('#codigo_anular_venta_').val(),
//               filtro_seguridad: $('#codigo_anular_venta').val()
//             },
//             url: $('#url').val() + 'venta/cancelarPedido',
//             dataType: 'json'
//           })
//           .done(function(response) {

//             resolve(response);
//           })
//           .fail(function(jqXHR, textStatus, errorThrown) {

//             reject(new Error('Error en la solicitud AJAX: ' + textStatus));
//           });
//         } else {

//           reject(new Error('El código ingresado es incorrecto'));
//         }
//       });
//     },
//     allowOutsideClick: false
//   }).then(function(result) {

//     if (result.value) {

//       Swal.fire({
//         title: 'Operación exitosa',
//         text: 'El pedido ha sido cancelado correctamente.',
//         icon: 'success',
//         confirmButtonColor: '#34d16e',
//         confirmButtonText: 'Aceptar'
//       });

//       $(".btn-cancelar-pedido").trigger("click");
//       console.log("Pedido cancelado y lista de productos vaciada.");
//       tab01();
//     }

//   }).catch(function(error) {

//     Swal.fire({
//       title: 'Error',
//       text: error.message,
//       icon: 'error',
//       confirmButtonColor: '#34d16e',
//       confirmButtonText: 'Aceptar'
//     });
//   });
// }

function cancelarPedido(id_pedido, id_mesa, id_tipo_pedido) {
  const modalSub = $("#modal-sub-pedido");
  const modalSuper = $("#modal-super-test");

  const isSubVisible = modalSub.hasClass("show");
  const isSuperVisible = modalSuper.hasClass("show");

  if (isSubVisible) modalSub.modal("hide");
  if (isSuperVisible) modalSuper.modal("hide");

  setTimeout(() => {
    const html_confirm = `
      <div>Se procederá a liberar este pedido</div><br>
      <div>Ingrese código de seguridad</div><br>
      <form>
        <input class="form-control text-center w-50" type="password" id="codigo_anular_venta_" autocomplete="off"/>
      </form><br>
      <div><span class="text-success" style="font-size: 17px;">¿Está Usted de Acuerdo?</span></div>
    `;

    Swal.fire({
      title: "Necesitamos de tu Confirmación",
      html: html_confirm,
      icon: "warning",
      showCancelButton: true,
      confirmButtonColor: "#34d16e",
      confirmButtonText: "Sí, Adelante!",
      cancelButtonText: "No",
      showLoaderOnConfirm: true,
      allowOutsideClick: false,
      preConfirm: () => {
        return new Promise((resolve, reject) => {
          const code = $("#codigo_anular_venta_").val();
          const codeRef = $("#codigo_anular_venta").val();

          if (code === codeRef) {
            $.ajax({
              type: "POST",
              url: $("#url").val() + "venta/cancelarPedido",
              data: {
                id_pedido,
                id_mesa,
                tipo_pedido: id_tipo_pedido,
                codigo_seguridad: code,
                filtro_seguridad: codeRef,
              },
              dataType: "json",
            })
              .done(resolve)
              .fail((jqXHR, textStatus) => {
                reject(new Error("Error en la solicitud AJAX: " + textStatus));
              });
          } else {
            reject(new Error("El código ingresado es incorrecto"));
            Swal.fire({
              title: "Contraseña incorrecta",
              text: "Debe ingresar la contraseña correcta o contactarse con el soporte.",
              icon: "error",
              confirmButtonColor: "#34d16e",
              confirmButtonText: "Aceptar",
            });
          }
        });
      },
    })
      .then((result) => {
        // 🔁 Si canceló el Swal (NO o cerró)
        if (
          result.dismiss === Swal.DismissReason.cancel ||
          result.dismiss === Swal.DismissReason.backdrop ||
          result.dismiss === Swal.DismissReason.close
        ) {
          setTimeout(() => {
            if ($("#rol_usr").val() == 5) {
              modalSuper.modal("show");
            }
          }, 200);
          return;
        }

        // ✅ Confirmado
        if (result.value && result.value.success === true) {
          Swal.fire({
            title: "Operación exitosa",
            text: "El pedido ha sido cancelado correctamente.",
            icon: "success",
            confirmButtonColor: "#34d16e",
            confirmButtonText: "Aceptar",
          });

          $(".btn-cancelar-pedido").trigger("click");
          console.log("Pedido cancelado y lista de productos vaciada.");
          tab01();
        } else if (result.value && result.value.success === false) {
          throw new Error(result.value.message || "No se pudo cancelar el pedido.");
        }
      })
      .catch((error) => {
        Swal.fire({
          title: "Error",
          text: error.message,
          icon: "error",
          confirmButtonColor: "#34d16e",
          confirmButtonText: "Aceptar",
        });
      });
  }, 400);
}

function vaciarListaProductos() {
  $(".po-items").empty();
  subtotal = 0;
  igv = 0;
  total = 0;

  $(".sub-total div:eq(0) span:eq(1)").text("S/0.00");
  $(".sub-total div:eq(1) span:eq(1)").text("S/0.00");
  $(".total span:eq(1)").text("S/0.00");
}

function anularPedido(
  id_pedido,
  id_pres,
  cant_ped,
  prod_nom,
  prod_pre,
  fecha_pedido,
  estado_pedido,
  $wrapperElement = null,
  prodData = null
) {
  $("#modal-sub-pedido").modal("hide");
  $("#modal-super-test").modal("hide");

  const tipo_pedido = $("#codtipoped").val();

  setTimeout(() => {
    const html = `
      <div>
        Se anulará el siguiente pedido:<br>
        <strong class="text-danger">${cant_ped} UNI</strong>
        ${prod_nom} <span class="label label-warning">${prod_pre}</span>
      </div>
      <div class="mt-3">
        <input
          id="codigo_seguridad"
          class="form-control text-center w-50"
          type="password"
          placeholder="Código de seguridad"
          autocomplete="off"
        >
      </div>
      <div class="mt-3">
        <span class="text-success" style="font-size:17px;">
          ¿Está Usted de Acuerdo?
        </span>
      </div>
    `;

    Swal.fire({
      title: "Necesitamos de tu Confirmación",
      html,
      icon: "warning",
      showCancelButton: true,
      confirmButtonText: "Sí, anular",
      cancelButtonText: "No",
      focusConfirm: false,
      allowOutsideClick: false,
      showLoaderOnConfirm: true,
      willOpen: () => {
        setTimeout(() => {
          $("#codigo_seguridad").focus().select();
        }, 100);
      },
      preConfirm: () => {
        const code = $("#codigo_seguridad").val().trim();
        if (!code) {
          Swal.showValidationMessage(
            "Por favor ingresa el código de seguridad"
          );
          return false;
        }
        return new Promise((resolve, reject) => {
          $.ajax({
            url: $("#url").val() + "venta/pedido_delete",
            type: "POST",
            dataType: "json",
            data: {
              id_pedido,
              id_pres,
              fecha_pedido,
              estado_pedido,
              tipo_pedido,
              codigo_seguridad: code,
            },
          })
            .done((response) => resolve(response))
            .fail(() => {
              Swal.showValidationMessage(
                "Problemas con la conexión a internet"
              );
              reject();
            });
        });
      },
    }).then((response) => {
      if (response.isDismissed) {
        setTimeout(() => {
          if ($("#rol_usr").val() == 5) {
            $("#modal-super-test").modal("show");
          } else {
            $("#modal-sub-pedido").modal("show");
          }
        }, 200);
        return; // El producto permanece visible
      }

      const resp = response.value;

      if (!resp) {
        console.log("Operación cancelada o sin respuesta");

        setTimeout(() => {
          if ($("#rol_usr").val() == 5) {
            $("#modal-super-test").modal("show");
          } else {
            $("#modal-sub-pedido").modal("show");
          }
        }, 200);
        return; // El producto permanece visible
      }

      const codigoArr = resp.Codigo;
      const productoArr = resp.Producto;

      if (!Array.isArray(codigoArr) || !codigoArr.length) {
        Swal.fire("Error", "Respuesta inesperada del servidor", "error").then(
          () => {
            setTimeout(() => {
              if ($("#rol_usr").val() == 5) {
                $("#modal-super-test").modal("show");
              } else {
                $("#modal-sub-pedido").modal("show");
              }
            }, 200);
          }
        );
        return; // El producto permanece visible
      }

      const cod = codigoArr[0].cod;
      if (cod === "0") {
        Swal.fire("Error", "El código ingresado es incorrecto", "error").then(
          () => {
            setTimeout(() => {
              if ($("#rol_usr").val() == 5) {
                $("#modal-super-test").modal("show");
              } else {
                $("#modal-sub-pedido").modal("show");
              }
            }, 200);
          }
        );
        return; // El producto permanece visible
      }

      if (cod === "2") {
        Swal.fire(
          "Error",
          "El pedido está en preparación o ya preparado",
          "error"
        ).then(() => {
          setTimeout(() => {
            if ($("#rol_usr").val() == 5) {
              $("#modal-super-test").modal("show");
            } else {
              $("#modal-sub-pedido").modal("show");
            }
          }, 200);
        });
        return; // El producto permanece visible
      }

      if ($wrapperElement && $wrapperElement.length && prodData) {
        reponerStockVisual(prodData);
        $wrapperElement
          .find(".demo-checkbox")
          .removeData("initialized")
          .removeData("seleccionadas");
        $wrapperElement.remove();
        actualizarTotalesDesdeLista();
        actualizarContadorPedidos();
      }

      const porImpresora = {};
      productoArr.forEach((item) => {
        const imp = item.nombre_imp;
        if (!porImpresora[imp]) porImpresora[imp] = [];
        porImpresora[imp].push(item);
      });

      Object.entries(porImpresora).forEach(([nombre_imp, items]) => {
        const pedidoPrint = {
          pedido_tipo: $("#codtipoped").val(),
          pedido_numero: $(".pedido-numero").text().trim().toUpperCase(),
          pedido_cliente: $(".pedido-cliente").text().trim(),
          pedido_mozo: getResponsableActualNombre() || $("#nombre_mozo").val(),
          correlativo_imp: correlativo_imp(),
          nombre_imp,
          nombre_pc: $("#pc_name").val(),
          codigo_anulacion: 1,
          items,
        };
        const dataEncoded = encodeURIComponent(JSON.stringify(pedidoPrint));
        const isLocal = $("#print_com").val() === "1";
        if (isLocal && !validarConfiguracionImpresionLocal(true).ok) {
          return;
        }
        const url = isLocal
          ? `http://${$(
            "#pc_ip"
          ).val()}/imprimir/comanda.php?data=${dataEncoded}`
          : `${$("#url").val()}venta/impresion_comanda/?data=${dataEncoded}`;
        const features = isLocal
          ? "_blank"
          : "_blank,top=500,left=500,width=400,height=400";
        const popup = window.open(url, "_blank", features);
        if (!popup) {
          Swal.fire({
            icon: "warning",
            title: "Popup bloqueado",
            text: "Habilita ventanas emergentes para completar la impresión.",
            confirmButtonColor: "#34d16e",
          });
        }
      });

      // Actualizar lista de pedidos

      // Mostrar mensaje de éxito
      Swal.fire(
        "\u00A1Anulado!",
        "El pedido ha sido anulado correctamente.",
        "success"
      );

      // Si es rol 5, mostrar modal correspondiente
      if ($("#rol_usr").val() == 5) {
        orden(id_pedido, $("#mesa").val(), $("#salon").val());
      } else {
        if (tipo_pedido == 2 || tipo_pedido == 3) {
          console.log("asdasdas");

          listarPedidosDetalle(tipo_pedido, id_pedido);
        } else if (tipo_pedido == 1) {
          listarPedidos(
            $("#codsalonorigen").val(),
            $("#codmesaorigen").val(),
            $("#codtipoped").val(),
            id_pedido,
            $("#mesa").val(),
            $("#salon").val(),
            estado_pedido
          );
        }
      }
    });
  }, 400); // Esperar a que los modales se cierren completamente
}

function actualizarContadorPedidos() {
  const count = $(".po-items .po-item-wrapper").length;
  $("#ver_seleccionados").text(`Ver seleccionados (${count})`);
}

function updateWspStatusDot(state) {
  const $dot = $("#wsp-status");
  if (!$dot.length) return;

  $dot.removeClass("text-secondary text-info text-success text-danger");
  if (state === "sending") {
    $dot.addClass("text-info").attr("title", "Enviando...");
  } else if (state === "success") {
    $dot.addClass("text-success").attr("title", "Enviado correctamente");
  } else if (state === "error") {
    $dot.addClass("text-danger").attr("title", "Error al enviar");
  } else {
    $dot.addClass("text-secondary").attr("title", "No enviado a\u00FAn");
  }
}

function showWspInlineFeedback(type, message) {
  const $input = $("#numero_cliente");
  if (!$input.length) return;

  const $container = $input.closest(".col-12");
  if (!$container.length) return;

  let $feedback = $container.find("#wsp-feedback");
  if (!$feedback.length) {
    $feedback = $(
      '<div id="wsp-feedback" class="wsp-feedback d-none mt-2" aria-live="polite"></div>'
    );
    $container.append($feedback);
  }

  if (type === "clear") {
    $feedback
      .addClass("d-none")
      .removeClass("wsp-feedback-success wsp-feedback-error wsp-feedback-info")
      .empty();
    return;
  }

  const classMap = {
    success: "wsp-feedback-success",
    error: "wsp-feedback-error",
    info: "wsp-feedback-info",
  };

  const iconMap = {
    success: "fas fa-check-circle",
    error: "fas fa-exclamation-circle",
    info: "fas fa-spinner fa-spin",
  };

  $feedback
    .removeClass("d-none wsp-feedback-success wsp-feedback-error wsp-feedback-info")
    .addClass(classMap[type] || "wsp-feedback-info")
    .html(
      '<i class="' +
        (iconMap[type] || iconMap.info) +
        '"></i><span>' +
        message +
        "</span>"
    );
}

function clickSendWhatsapp(id_venta) {
  var Urls = $("#url").val() + "comprobante/ticket/" + btoa(id_venta);
  const textos = { 1: "Boleta", 2: "Factura", 3: "Nota de venta" };
  var activo = $('input[name="tipo_doc"]:checked').val();
  var tipoText = textos[activo] || "Desconocido";
  const $btn = $("#button-addon2");
  const originalHtml = $btn.data("original-html") || $btn.html();
  $btn.data("original-html", originalHtml);

  $btn
    .prop("disabled", true)
    .html('<i class="fas fa-spinner fa-spin mr-1"></i>enviando');
  updateWspStatusDot("sending");
  showWspInlineFeedback("info", "Enviando comprobante por WhatsApp...");

  $.ajax({
    url: $("#url").val() + "whatsapp/get_send_wsp",
    type: "POST",
    dataType: "json",
    data: {
      number: $("#numero_cliente").val(),
      media: Urls,
      filename: tipoText + ".pdf",
    },
    success: function (data) {
      if (!data.ok) {
        const msg = data.message || "No se pudo enviar el mensaje";
        updateWspStatusDot("error");
        showWspInlineFeedback("error", msg);
        $("#viewLivetoast").css("display", "block");
        $("#liveToast .toast-header strong")
          .text("Error")
          .removeClass("text-success")
          .addClass("text-danger");
        $("#liveToast .toast-body").text(msg);
        $("#liveToast").toast("show");
        return;
      }

      updateWspStatusDot("success");
      showWspInlineFeedback(
        "success",
        "Comprobante enviado por WhatsApp correctamente."
      );
      $("#viewLivetoast").css("display", "block");
      $("#liveToast .toast-header strong")
        .text("\u00C9xito")
        .removeClass("text-danger")
        .addClass("text-success");
      $("#liveToast .toast-body").text("Mensaje enviado por WhatsApp");
      $("#liveToast").toast("show");
    },
    error: function () {
      updateWspStatusDot("error");
      showWspInlineFeedback(
        "error",
        "No se pudo enviar el mensaje. Intenta de nuevo."
      );
      $("#viewLivetoast").css("display", "block");
      $("#liveToast .toast-header strong")
        .text("Error")
        .removeClass("text-success")
        .addClass("text-danger");
      $("#liveToast .toast-body").text("No se pudo enviar el mensaje");
      $("#liveToast").toast("show");
    },
    complete: function () {
      const numeroLen = ($("#numero_cliente").val() || "").trim().length;
      $btn.html(originalHtml).prop("disabled", numeroLen !== 11);
    },
  });
}
function cancelarPedidoMozo() {
  console.log(pedidoSeleccionado);
}

function mostrarAlerta(icon, title, text) {
  Swal.fire({
    title: title,
    text: text,
    icon: icon,
    confirmButtonColor: "#34d16e",
    confirmButtonText: "Aceptar",
    allowOutsideClick: false,
    showCancelButton: false,
    showConfirmButton: true,
  }).then(function (result) {
    return false;
  });
}

/* [ NEW ] Dynamic Label Logic for Payment Inputs */
$(document).ready(function () {
  $(document).on("click focus", ".display-pago-tarjeta input", function () {
    $("#label-voucher").text("COD TARJETA");
  });

  $(document).on("click focus", "#pago_yape", function () {
    $("#label-voucher").text("COD YAPE");
  });

  $(document).on("click focus", "#pago_plin", function () {
    $("#label-voucher").text("COD PLIN");
  });

  $(document).on("click focus", "#pago_tran", function () {
    $("#label-voucher").text("COD TRANS");
  });

  $(document).on("click focus", "#pago_efe", function () {
    $("#label-voucher").text("COD OP");
  });

  // Observer to sync visibility
  var target = document.getElementById('content_pagos');
  if (target) {
    var observer = new MutationObserver(function (mutations) {
      mutations.forEach(function (mutation) {
        if (mutation.attributeName === "style") {
          var display = $("#content_pagos").css("display");
          if (display != 'none') {
            $("#payment-inputs-top").show();
          } else {
            $("#payment-inputs-top").hide();
          }
        }
      });
    });
    observer.observe(target, { attributes: true });
  }
});

// ============================================================
// PAYMENT TYPE SELECTION HANDLER - VENTA RÁPIDA
// Controls visibility of payment inputs based on tipo_pago selection
// ============================================================

/*$('#tipo_pago').change(function () {
  // Get the label attribute from selected option (not value)
  var value = $('#tipo_pago option:selected').attr('label');

  console.log("Tipo Pago Change (Venta Rápida): " + value);

  // Helper functions for visibility control
  var showCash = function () {
    $('.display-pago-efectivo').show();
    $('.display-pago-rapido-efectivo').show();
  };

  var hideCash = function () {
    $('.display-pago-efectivo').hide();
    $('.display-pago-rapido-efectivo').hide();
  };

  var hideAllExtras = function () {
    $('.display-pago-tarjeta').hide();
    $('[name="pago_tar"]').closest('.input-group').hide();
    $('[name="pago_yape"]').closest('.input-group').hide();
    $('[name="pago_plin"]').closest('.input-group').hide();
    $('[name="pago_tran"]').closest('.input-group').hide();
    $('.display-codigo-operacion').hide();
  };

  // Reset payment values
  $('#pago_efe').val('0.00');
  $('#pago_tar').val('0.00');
  $('#pago_yape').val('0.00');
  $('#pago_plin').val('0.00');
  $('#pago_tran').val('0.00');
  $('.mensaje-pago').hide();

  // Visibility logic based on payment type
  if (value == 1) {
    // EFECTIVO - Show only cash input
    showCash();
    hideAllExtras();

  } else if (value == 3) {
    // PAGO MIXTO - Show all inputs
    showCash();
    $('[name="pago_tar"]').closest('.input-group').show();
    $('[name="pago_yape"]').closest('.input-group').show();
    $('[name="pago_plin"]').closest('.input-group').show();
    $('[name="pago_tran"]').closest('.input-group').show();
    // FORCE HIDE CODIGO OPERACION
    $('.display-codigo-operacion').each(function () {
      this.style.setProperty('display', 'none', 'important');
    });

  } else if (value == 4) {
    // CULQI - Hide cash, show only message
    hideCash();
    $('.mensaje-pago').show();
    hideAllExtras();
    $('.display-codigo-operacion').show();

  } else if (value == 2 || value >= 5) {
    // TARJETA / YAPE / PLIN / TRANSFERENCIA - Show specific input
    hideCash();
    hideAllExtras();

    // For specific payment methods, show the corresponding input
    if (value == 2) {
      $('[name="pago_tar"]').closest('.input-group').show();
    } else if (value == 5) {
      // YAPE (could be multiple with label=5, show TAR as fallback)
      $('[name="pago_tar"]').closest('.input-group').show();
    }

    $('.display-codigo-operacion').show();
  }
});*/

// CRITICAL: Trigger on page load to set initial visibility
$(document).ready(function () {
  if ($('#tipo_pago').length) {
    $('#tipo_pago').trigger('change');
  }
});

// QUICK CASH BUTTONS LOGIC
$(document).on('click', '.btn-fast-cash', function () {
  var amount = $(this).data('amount');

  // If "Exacto", calculate remaining total to pay
  if (amount === 'exact') {
    var tipoPago = getTipoPagoActual();
    var total = getTotalPedidoActual();

    if (tipoPago === 1) {
      amount = total;
    } else if (tipoPago === 3) {
      var paid =
        getPagoInput("#pago_tar") +
        getPagoInput("#pago_yape") +
        getPagoInput("#pago_plin") +
        getPagoInput("#pago_tran") +
        getComisionTarjetaActual();
      amount = total - paid;
    } else {
      amount = 0;
    }

    if (amount < 0) amount = 0;
  }

  // Set value and trigger calculation
  $('#pago_efe').val(formatNumber(amount));
  actualizarVuelto();
});

// EVENT LISTENERS FOR PAYMENT INPUTS (Dynamic & Static)
$(document).on('keyup change input', '.display-pago-efectivo, .display-pago-tarjeta, input[name^="pago_"]', function () {
  calculo_efectivo();
});
