/** Shopify CDN: Minification failed

Line 6:0 Unexpected "("

**/
(function () {
  /*
    Usa el mismo guard que el script de colección.
    Así nunca se duplican los eventos al cargar recomendaciones por AJAX.
  */
  if (window.__bouCollectionCardsPremiumInit) return;
  window.__bouCollectionCardsPremiumInit = true;

  var cartSections = [
    'cart-notification-product',
    'cart-notification-button',
    'cart-icon-bubble',
    'cart-upsell',
    'cart-drawer-gift'
  ];

  function normalItem(cart, variantId) {
    var fallback = null;

    for (var index = 0; index < cart.items.length; index++) {
      var item = cart.items[index];

      if (Number(item.variant_id) !== Number(variantId)) continue;
      if (!fallback) fallback = item;

      var properties = item.properties || {};
      var special =
        properties._bou_volume_source ||
        properties._bou_volume_pack ||
        properties._bou_upsell ||
        properties._bou_bundle_id;

      if (!special) return item;
    }

    return fallback;
  }

  function updateCard(card, quantity) {
    if (!card) return;

    var addButton = card.querySelector('.bou-btn-add');
    var quantityWrap = card.querySelector('.bou-qty-wrap');
    var quantityNumber = card.querySelector('.bou-qty-num');

    if (!addButton || !quantityWrap || !quantityNumber) return;

    if (quantity > 0) {
      addButton.style.display = 'none';
      quantityWrap.classList.add('is-visible');
      quantityNumber.textContent = quantity;
    } else {
      addButton.style.display = '';
      quantityWrap.classList.remove('is-visible');
      quantityNumber.textContent = '1';
    }
  }

  function syncCards() {
    return fetch('/cart.js', {
      credentials: 'same-origin',
      headers: { Accept: 'application/json' }
    })
    .then(function (response) {
      if (!response.ok) throw new Error('No se pudo leer el carrito.');
      return response.json();
    })
    .then(function (cart) {
      document.querySelectorAll('.bou-card[data-variant-id]').forEach(
        function (card) {
          var item = normalItem(cart, card.dataset.variantId);
          updateCard(card, item ? item.quantity : 0);
        }
      );

      return cart;
    })
    .catch(function () {
      return null;
    });
  }

  function setBusy(card, busy) {
    if (!card) return;

    card.querySelectorAll('button').forEach(function (button) {
      button.disabled = busy;
    });
  }

  function addVariant(variantId, quantity) {
    return fetch('/cart/add.js', {
      method: 'POST',
      credentials: 'same-origin',
      headers: {
        'Content-Type': 'application/json',
        Accept: 'application/json',
        'X-Requested-With': 'XMLHttpRequest'
      },
      body: JSON.stringify({
        id: Number(variantId),
        quantity: Number(quantity),
        sections: cartSections,
        sections_url: window.location.pathname
      })
    })
    .then(function (response) {
      return response.json().then(function (data) {
        if (!response.ok || data.status) {
          throw new Error(
            data.description || data.message || 'No se pudo agregar.'
          );
        }

        return data;
      });
    });
  }

  function changeNormalLine(variantId, quantity) {
    return fetch('/cart.js', {
      credentials: 'same-origin',
      headers: { Accept: 'application/json' }
    })
    .then(function (response) {
      if (!response.ok) throw new Error('No se pudo leer el carrito.');
      return response.json();
    })
    .then(function (cart) {
      var item = normalItem(cart, variantId);
      if (!item) throw new Error('Producto no encontrado.');

      return fetch('/cart/change.js', {
        method: 'POST',
        credentials: 'same-origin',
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json',
          'X-Requested-With': 'XMLHttpRequest'
        },
        body: JSON.stringify({
          id: item.key,
          quantity: Number(quantity),
          sections: cartSections,
          sections_url: window.location.pathname
        })
      });
    })
    .then(function (response) {
      return response.json().then(function (data) {
        if (!response.ok || data.status) {
          throw new Error(
            data.description || data.message || 'No se pudo actualizar.'
          );
        }

        return data;
      });
    });
  }

  function openDrawer(state) {
    var notification = document.querySelector('cart-notification');

    if (
      notification &&
      typeof notification.renderContents === 'function'
    ) {
      notification.renderContents(state);
    }

    if (typeof window.openCartDrawer === 'function') {
      window.openCartDrawer();
      return;
    }

    setTimeout(function () {
      var trigger = document.querySelector(
        '#cart-icon-bubble, [data-cart-drawer-trigger], .header__icon--cart'
      );

      if (trigger) trigger.click();
    }, 180);
  }

  document.addEventListener('click', function (event) {
    var addButton = event.target.closest('.bou-card .bou-btn-add');

    if (addButton) {
      var card = addButton.closest('.bou-card');
      var label = addButton.dataset.label || 'AÑADIR AL CARRITO';

      setBusy(card, true);
      addButton.textContent = 'AÑADIENDO…';

      addVariant(addButton.dataset.variant, 1)
        .then(function (state) {
          addButton.textContent = label;
          openDrawer(state);
          return syncCards();
        })
        .catch(function (error) {
          addButton.textContent = error.message || 'INTENTA DE NUEVO';

          setTimeout(function () {
            addButton.textContent = label;
          }, 2200);
        })
        .finally(function () {
          setBusy(card, false);
        });

      return;
    }

    var quantityButton = event.target.closest(
      '.bou-card .bou-qty-btn'
    );

    if (!quantityButton) return;

    var card = quantityButton.closest('.bou-card');
    var number = card.querySelector('.bou-qty-num');
    var current = Number(number.textContent) || 1;
    var increase = quantityButton.dataset.action === 'inc';
    var next = increase
      ? Math.min(current + 1, 99)
      : Math.max(current - 1, 0);

    setBusy(card, true);

    var request = increase
      ? addVariant(quantityButton.dataset.variant, 1)
      : changeNormalLine(quantityButton.dataset.variant, next);

    request
      .then(syncCards)
      .catch(syncCards)
      .finally(function () {
        setBusy(card, false);
      });
  });

  document.addEventListener('DOMContentLoaded', syncCards);
  document.addEventListener('shopify:section:load', syncCards);
  document.addEventListener('bou:recommendations:loaded', syncCards);
  document.addEventListener('cart:refresh', syncCards);

  if (document.readyState !== 'loading') syncCards();
})();
