
(function(){
  "use strict";

  /* Real TAE-.COM catalog. Prices in USD, variant IDs + images pulled from the
     .com product pages. `cat` drives the filter tabs. */
  var PRODUCTS = [
    { id:"balaayah", title:"Balaayah Black Gram Body Booster", sub:"Ayurvedic body oil for firmer, smoother-looking skin", price:45, size:"3.38 fl oz", cat:"Body",
      image:"https://theayurvedaexperience.com/cdn/shop/files/balaayah-black-gram-body-booster-body-oil-iyura-942604_5000x.jpg?v=1770699780", variantId:"44928318537905" },

    { id:"blavana", title:"Blavana Body Lotion", sub:"Black Gram lotion that softens the appearance of crepey skin", price:40, size:"6.25 fl oz", cat:"Body",
      image:"https://theayurvedaexperience.com/cdn/shop/files/blavana-body-lotion-moisturizes-softens-firms-dry-aging-crepey-skin-revolutionary-formula-with-black-gram-best-body-lotion-for-mature-body-skin-with-clinically-proven-ing-121117_5000x.jpg?v=1744357884", variantId:"44928363757745" },

    { id:"keranya", title:"Keranya Pure Black Seed Hair Potion", sub:"Black Seed hair oil for fuller, thicker-looking hair", price:38, size:"3.38 fl oz", cat:"Hair",
      image:"https://theayurvedaexperience.com/cdn/shop/products/keranya-pure-black-seed-potent-hair-potion-more-shiny-hair-on-the-head-not-in-the-comb-hair-oil-iyura-479546_5000x.jpg?v=1619533447", variantId:"46724161732785" },

    { id:"yauvari", title:"Yauvari Amplified Youth Spring", sub:"Oil-serum for a firmer-looking face, neck & décolleté", price:48, size:"1.69 fl oz", cat:"Face",
      image:"https://theayurvedaexperience.com/cdn/shop/products/yauvari-amplified-youth-spring-face-oil-iyura-765193_5000x.jpg?v=1639641277", variantId:"44931585605809" },

    { id:"cerabuild", title:"Cerabuild Face & Neck Cream", sub:"Phyto-ceramide enriched cream for the look of plumper, smoother skin", price:45, size:"1.76 oz", cat:"Face",
      image:"https://cdn05.zipify.com/YZHvlqKtowxjGklWV4ljFMUuTEk=/0x0:1080x1080/fit-in/1080x0/a0a3e730091747fbb04fb43f3541453f/1-11.jpeg", variantId:"44928448725169" },

    { id:"kesaradi", title:"Kesaradi Daily Glow Oil", sub:"Saffron & rose face oil for a naturally radiant glow", price:45, size:"1.69 fl oz", cat:"Face",
      image:"https://cdn05.zipify.com/JIfBykBJN1_-5qEavB-sgw-shg4=/0x0:1254x1254/fit-in/1080x0/edabcc0adb0a44eab08de2baaebb29b2/chatgpt-image-jun-5-2026-05_46_13-pm-copy.webp", variantId:"44928399278257" },

    { id:"ajara", title:"Ajara Sandalwood Rose Eye Butter", sub:"Nighttime under-eye butter for a youthful-looking appearance", price:36, size:"0.53 oz", cat:"Eye",
      image:"https://www.theayurvedaexperience.ca/cdn/shop/files/sandalwood-rose-age-defying-eye-butter-eye-care-ajara-735987_8ef90e17-6804-4134-89cf-57bb87093ce7.png?v=1728890012", variantId:"44931591045297" },

    { id:"rufolia", title:"Rufolia Periorbital Eyemulsion", sub:"Manjistha enriched eye cream for brighter, firmer-looking under-eyes", price:28, size:"0.53 oz", cat:"Eye",
      image:"https://theayurvedaexperience.com/cdn/shop/files/rufolia-periorbital-eyemulsion-brightening-and-visibly-firming-eye-cream-eye-cream-a-modernica-naturalis-643232_5000x.webp?v=1775799621", variantId:"47368836743345" },

    { id:"goldenyears", title:"Golden Years Face Serum", sub:"Brightening serum for less-visible age spots & a clearer complexion", price:38, size:"1.18 fl oz", cat:"Face",
      image:"https://theayurvedaexperience.com/cdn/shop/files/golden-years-face-serum-to-reduce-the-appearance-of-age-spots-clear-complexion-unwrinkled-appearance-face-serum-a-modernica-naturalis-162065_5000x.webp?v=1762944944", variantId:"44931593371825" }
  ];

  var GOAL = 3;
  var SET_PRICE = 99;          // USD — the bundle price (enforced server-side by your cart/discount setup)
  var SET_LABEL = "$99 USD";   // shown on the headline price + CTA

  var activeFilter = "All";
  var cart = null;          // latest /cart.js snapshot (the REAL cart)
  var busy = false;         // guards against overlapping cart requests
  var refreshTimer = null;

  // variantId -> catalog product, for matching live cart lines to our bundle products
  var BY_VARIANT = {};
  PRODUCTS.forEach(function(p){ BY_VARIANT[String(p.variantId)] = p; });

  function money(n){ return "$" + Number(n).toFixed(2); }

  function categories(){
    var seen = {}, out = ["All"];
    PRODUCTS.forEach(function(p){ if(p.cat && !seen[p.cat]){ seen[p.cat]=1; out.push(p.cat); } });
    return out;
  }

  function el(id){ return document.getElementById(id); }
  function q(sel, root){ return (root||document).querySelector(sel); }
  function qa(sel, root){ return Array.prototype.slice.call((root||document).querySelectorAll(sel)); }

  function escHtml(s){
    return String(s).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")
                    .replaceAll('"',"&quot;").replaceAll("'","&#039;");
  }

  /* ---------- render filters ---------- */
  function renderFilters(){
    var wrap = el("tae-filters");
    wrap.innerHTML = categories().map(function(c){
      return '<button type="button" role="tab" class="tae-filter'+(c===activeFilter?' is-active':'')+
             '" data-filter="'+escHtml(c)+'" aria-selected="'+(c===activeFilter)+'">'+escHtml(c)+'</button>';
    }).join("");
  }

  /* ---------- live cart I/O ---------- */
  function fetchCart(){
    return fetch("/cart.js", { credentials:"same-origin" })
      .then(function(r){ if(!r.ok) throw new Error("cart read failed"); return r.json(); });
  }

  // Only lines whose variant is one of our bundle products count toward the set.
  // Returns units expanded by quantity: [{ key, product }], in cart order.
  function eligibleUnits(c){
    var units = [];
    ((c && c.items) || []).forEach(function(line){
      var p = BY_VARIANT[String(line.id)] || BY_VARIANT[String(line.variant_id)];
      if (!p) return;
      var qty = line.quantity || 0;
      for (var i=0;i<qty;i++) units.push({ key: line.key, product: p });
    });
    return units;
  }

  // product id -> quantity currently in the set (across all eligible units)
  function qtyByProduct(units){
    var m = {};
    units.forEach(function(u){ m[u.product.id] = (m[u.product.id]||0) + 1; });
    return m;
  }

  /* ---------- render product grid ---------- */
  function renderGrid(){
    var units = eligibleUnits(cart);
    var qtyById = qtyByProduct(units);

    var grid = el("tae-grid");
    var list = PRODUCTS.filter(function(p){ return activeFilter==="All" || p.cat===activeFilter; });
    grid.innerHTML = list.map(function(p){
      var qty = qtyById[p.id] || 0;
      var isAdded = qty > 0;
      var imgInner = p.image
        ? '<span class="tae-pimg-label">'+escHtml(p.title)+'</span><img src="'+escHtml(p.image)+'" alt="'+escHtml(p.title)+'" loading="lazy" onerror="this.style.display=\'none\'">'
        : '<span class="tae-pimg-label">'+escHtml(p.title)+'</span>';
      return ''+
      '<article class="tae-pcard">'+
        (p.badge?'<span class="tae-badge">'+escHtml(p.badge)+'</span>':'')+
        '<button type="button" class="tae-add'+(isAdded?' is-added':'')+'" data-add="'+escHtml(String(p.variantId))+'" '+
          'aria-label="'+(isAdded?('Remove '+escHtml(p.title)+' from your set'):('Add '+escHtml(p.title)+' to your set'))+'">'+
          (isAdded?'<span class="tae-add-qty">&#10003;</span>':'+')+'</button>'+
        '<div class="tae-pimg">'+imgInner+'</div>'+
        '<div class="tae-pbody">'+
          '<h3 class="tae-ptitle">'+escHtml(p.title)+'</h3>'+
          '<p class="tae-psub">'+escHtml(p.sub||"")+'</p>'+
          '<div class="tae-pfoot">'+
            '<div class="tae-pprice">'+(p.size?'<span class="sz">'+escHtml(p.size)+' | </span>':'')+money(p.price)+'</div>'+
            (isAdded?'<div class="tae-pqty">In your set &#10003;</div>':'')+
          '</div>'+
        '</div>'+
      '</article>';
    }).join("");
  }

  /* ---------- render set panel (from live cart) ---------- */
  function renderSet(){
    var units = eligibleUnits(cart);
    var count = units.length;
    var completeSets = Math.floor(count / GOAL);   // number of full $99 sets
    var remainder = count % GOAL;                  // items started toward the next set
    var hasSet = completeSets >= 1;                // at least one full set unlocked
    // if the latest set just completed with nothing started on the next one,
    // show that finished set filled rather than resetting to an empty row
    var showFinished = (remainder === 0 && count > 0);
    var filled = showFinished ? GOAL : remainder;  // filled tiles in the current (in-progress) set
    var toNext = GOAL - filled;                    // items needed to finish the current set

    // stepper (progress within the current set)
    qa('.tae-step').forEach(function(step){
      var n = parseInt(step.getAttribute('data-step'),10);
      step.classList.toggle('is-active', filled>=n && !(n===GOAL && showFinished));
      step.classList.toggle('is-complete', n===GOAL && showFinished);
    });
    q('[data-line="1"]').classList.toggle('is-active', filled>=2);
    q('[data-line="2"]').classList.toggle('is-active', filled>=3);

    // slots — grow to hold EVERY added item, grouped into rows of GOAL (one row per set)
    var slotCount = Math.max(GOAL, Math.ceil(count / GOAL) * GOAL);
    var multiRow = slotCount > GOAL;
    var slotsHtml = "";
    for (var i=0;i<slotCount;i++){
      if (multiRow && (i % GOAL === 0)){
        var setNo = (i / GOAL) + 1;
        var rowComplete = (setNo * GOAL) <= count;
        slotsHtml += '<div class="tae-set-label'+(rowComplete?' is-complete':'')+'">Set '+setNo+(rowComplete?' &middot; $99':'')+'</div>';
      }
      var u = units[i];
      if (u){
        var p = u.product;
        var img = p.image
          ? '<img src="'+escHtml(p.image)+'" alt="'+escHtml(p.title)+'" loading="lazy" onerror="this.style.display=\'none\'">'
          : '<span class="tae-pimg-label">'+escHtml(p.title)+'</span>';
        slotsHtml += '<div class="tae-slot"><div class="tae-tile">'+img+
          '<button type="button" class="tae-remove" data-remove-key="'+escHtml(u.key)+'" aria-label="Remove '+escHtml(p.title)+'">&times;</button>'+
          '</div><span class="tae-slot-add">'+escHtml(p.title)+'</span></div>';
      } else {
        var isUnlock = (i === slotCount-1);
        slotsHtml += '<div class="tae-slot"><div class="tae-tile"></div>'+
          '<span class="tae-slot-add">Add item</span>'+
          (isUnlock?'<span class="tae-slot-unlock">'+(hasSet?'Unlock another set':'Unlock $99 set')+'</span>':'')+'</div>';
      }
    }
    el("tae-slots").innerHTML = slotsHtml;

    // summary + price (complete sets are priced; remainder items are extra)
    var setsPrice = completeSets * SET_PRICE;
    var setUnits = units.slice(0, completeSets * GOAL);
    var origTotal = setUnits.reduce(function(a,u){ return a + u.product.price; }, 0);
    var savings = Math.max(0, origTotal - setsPrice);

    var labelTxt, subTxt, wasTxt, priceTxt;
    if (count === 0){
      labelTxt = "Add "+GOAL+" items"; subTxt = ""; wasTxt = ""; priceTxt = money(0);
    } else if (!hasSet){                             // building the first set (1–2 items)
      labelTxt = "Add "+toNext+" more"; subTxt = ""; wasTxt = ""; priceTxt = money(0);
    } else {
      if (remainder === 0){
        labelTxt = completeSets===1 ? "Your $99 set is ready" : completeSets+" sets ready · $99 each";
        subTxt = savings>0 ? "You save "+money(savings) : "";
      } else {
        labelTxt = completeSets+" set"+(completeSets>1?"s":"")+" + "+remainder+" item"+(remainder>1?"s":"");
        subTxt = "Add "+toNext+" more for another $99 set";
      }
      wasTxt = savings>0 ? money(origTotal) : "";
      priceTxt = money(setsPrice);
    }

    qa('[data-summary-label]').forEach(function(n){ n.textContent = labelTxt; });
    qa('[data-summary-price]').forEach(function(n){ n.textContent = priceTxt; });
    qa('[data-summary-was]').forEach(function(n){ n.textContent = wasTxt; });
    qa('[data-summary-sub]').forEach(function(n){ n.textContent = subTxt; });

    // CTA — items are already in the live cart, so this just navigates there
    qa('[data-cta]').forEach(function(btn){
      btn.disabled = busy || !hasSet;
      btn.classList.toggle('is-ready', hasSet);
      btn.textContent = busy ? "Updating…"
        : (hasSet
            ? ((remainder===0 && completeSets===1) ? "Go to Cart · "+SET_LABEL : "Go to Cart · "+money(setsPrice))
            : (count===0 ? "Add "+GOAL+" items" : "Add "+toNext+" more"));
    });

    // live status
    el("tae-live").textContent = hasSet
      ? (completeSets+" set"+(completeSets>1?"s":"")+" in your cart"+
         (remainder>0 ? ", plus "+remainder+" item"+(remainder>1?"s":"")+" toward the next" : "")+".")
      : count+" of "+GOAL+" items in your set.";

    renderGrid();
  }

  /* ---------- actions (all mutate the REAL cart) ---------- */
  function refresh(){
    return fetchCart()
      .then(function(c){ cart = c; renderSet(); })
      .catch(function(e){ console.warn("cart refresh:", e); });
  }

  function addVariant(variantId){
    if (busy) return;
    busy = true; renderSet();
    fetch("/cart/add.js", {
      method:"POST", headers:{"Content-Type":"application/json"}, credentials:"same-origin",
      body: JSON.stringify({ items: [{ id: Number(variantId), quantity: 1 }] })
    })
    .then(function(r){ if(!r.ok) throw new Error("add failed: "+r.status); return r.json(); })
    .then(function(){ return refresh(); })
    .catch(function(e){ console.warn(e); alert("Sorry — couldn't add that item. Please try again."); })
    .then(function(){ busy = false; renderSet(); });
  }

  // find the live cart line for one of our bundle variants (matches id or variant_id)
  function variantLine(variantId){
    var vid = String(variantId);
    return (((cart||{}).items)||[]).filter(function(l){
      return String(l.id) === vid || String(l.variant_id) === vid;
    })[0] || null;
  }

  // toggle-off: pull this product out of the cart entirely (all units of the variant)
  function removeVariant(variantId){
    if (busy) return;
    var line = variantLine(variantId);
    if (!line) return;                      // nothing to remove
    busy = true; renderSet();
    fetch("/cart/change.js", {
      method:"POST", headers:{"Content-Type":"application/json"}, credentials:"same-origin",
      body: JSON.stringify({ id: line.key, quantity: 0 })   // 0 = remove the line
    })
    .then(function(r){ if(!r.ok) throw new Error("remove failed: "+r.status); return r.json(); })
    .then(function(){ return refresh(); })
    .catch(function(e){ console.warn(e); })
    .then(function(){ busy = false; renderSet(); });
  }

  // the "+" on a product card is now a toggle: not in set -> add; already in set -> remove
  function toggleVariant(variantId){
    if (busy) return;
    if (variantLine(variantId)) removeVariant(variantId);
    else addVariant(variantId);
  }

  function removeKey(key){
    if (busy) return;
    var line = (((cart||{}).items)||[]).filter(function(l){ return l.key === key; })[0];
    var newQty = line ? Math.max(0, (line.quantity||1) - 1) : 0;   // remove ONE unit
    busy = true; renderSet();
    fetch("/cart/change.js", {
      method:"POST", headers:{"Content-Type":"application/json"}, credentials:"same-origin",
      body: JSON.stringify({ id: key, quantity: newQty })
    })
    .then(function(r){ if(!r.ok) throw new Error("remove failed: "+r.status); return r.json(); })
    .then(function(){ return refresh(); })
    .catch(function(e){ console.warn(e); })
    .then(function(){ busy = false; renderSet(); });
  }

  function goToCart(){ window.location.assign("https://theayurvedaexperience.com/cart"); }

  /* ---------- events (delegated) ---------- */
  document.addEventListener("click", function(e){
    var t = e.target;
    var addBtn = t.closest && t.closest("[data-add]");
    if (addBtn){ if(!addBtn.disabled) toggleVariant(addBtn.getAttribute("data-add")); return; }

    var rmBtn = t.closest && t.closest("[data-remove-key]");
    if (rmBtn){ removeKey(rmBtn.getAttribute("data-remove-key")); return; }

    var flt = t.closest && t.closest("[data-filter]");
    if (flt){ activeFilter = flt.getAttribute("data-filter"); renderFilters(); renderGrid(); return; }

    var cta = t.closest && t.closest("[data-cta]");
    if (cta && !cta.disabled){ goToCart(); return; }

    var mt = t.closest && t.closest("#tae-mtoggle");
    if (mt){
      var panel = el("tae-panel");
      var open = panel.classList.toggle("is-open");
      mt.setAttribute("aria-expanded", open ? "true":"false");
      mt.setAttribute("aria-label", open ? "Hide your set" : "Show your set");
      return;
    }
  });

  /* ---------- live sync: reflect cart changes made elsewhere on the page ---------- */
  function scheduleRefresh(){
    if (refreshTimer) clearTimeout(refreshTimer);
    refreshTimer = setTimeout(refresh, 60);
  }
  (function hookCartMutations(){
    if (window.__taeCartPatched) return;   // don't double-wrap if injected twice
    window.__taeCartPatched = true;
    // NOTE: /cart.js (a read) is intentionally excluded so refreshing can't loop.
    var eps = ['/cart/add','/cart/change','/cart/update','/cart/clear',
               '/cart/add.js','/cart/change.js','/cart/update.js','/cart/clear.js'];
    function isCart(u){ return eps.some(function(p){ return String(u).indexOf(p)!==-1; }); }

    var _f = window.fetch;
    window.fetch = function(input){
      var url = (typeof input==="string") ? input : (input && input.url) || "";
      var hit = isCart(url);
      var pr = _f.apply(this, arguments);
      if (hit) pr.then(function(){ scheduleRefresh(); }).catch(function(){});
      return pr;
    };
    var _o = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(m,u){ this.__isCart = isCart(u); return _o.apply(this, arguments); };
    var _s = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(){
      var self=this;
      function done(){ if(self.__isCart) scheduleRefresh(); self.removeEventListener("loadend", done); }
      this.addEventListener("loadend", done);
      return _s.apply(this, arguments);
    };
    window.addEventListener("focus", scheduleRefresh);
    window.addEventListener("pageshow", scheduleRefresh);
  })();

  /* ---------- init ---------- */
  renderFilters();
  renderSet();     // paint immediately (empty state)
  refresh();       // then pull the live cart
})();
