
(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:"Firming Ayurvedic body oil for dry, mature 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 firms & smooths 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:"Volumizing hair oil with Black Seed & Ayurvedic herbs", 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:"Firming oil-serum for 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 cream that plumps & protects", price:45, size:"1.76 oz", cat:"Face",
      image:"https://theayurvedaexperience.com/cdn/shop/products/cerabuild-face-and-neck-cream-resurface-plump-protect-your-skin-with-phyto-ceramides-lotion-moisturizer-a-modernica-naturalis-852727_5000x.jpg?v=1683347565", variantId:"44928448725169" },

    { id:"kesaradi", title:"Kesaradi Daily Glow Oil", sub:"Saffron & rose face oil for a natural glow", price:45, size:"1.69 fl oz", cat:"Face",
      image:"https://theayurvedaexperience.com/cdn/shop/products/kesaradi-oil-best-face-moisturizer-for-natural-glow-face-oil-iyura-776502_5000x.jpg?v=1653820620", variantId:"44928399278257" },

    { id:"ajara", title:"Ajara Sandalwood Rose Eye Butter", sub:"Age-defying night-time under-eye butter", price:36, size:"0.53 oz", cat:"Eye",
      image:"https://theayurvedaexperience.com/cdn/shop/files/ajaras-sandalwood-rose-age-defying-eye-butter-15-g-eye-care-ajara-345354_5000x.png?v=1743513406", variantId:"44931591045297" },

    { id:"rufolia", title:"Rufolia Periorbital Eyemulsion", sub:"Brightening, firming eye cream with Manjistha", 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 age spots & clarity", 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 full = units.length >= GOAL;
    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?(qty+' '+escHtml(p.title)+' in your set'):('Add '+escHtml(p.title)+' to your set'))+'"'+((full && !isAdded)?' disabled':'')+'>'+
          (isAdded?escHtml(String(qty)):'+')+'</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-pprice">'+(p.size?'<span class="sz">'+escHtml(p.size)+' | </span>':'')+money(p.price)+'</div>'+
          (isAdded?'<div class="tae-pqty">In your set: &times;'+escHtml(String(qty))+'</div>':'')+
        '</div>'+
      '</article>';
    }).join("");
  }

  /* ---------- render set panel (from live cart) ---------- */
  function renderSet(){
    var units = eligibleUnits(cart);
    var count = units.length;
    var complete = count >= GOAL;
    var remaining = Math.max(0, GOAL - count);

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

    // slots (first GOAL units; remove targets the live cart line key)
    var slotsHtml = "";
    for (var i=0;i<GOAL;i++){
      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)+'">×</button>'+
          '</div><span class="tae-slot-add">'+escHtml(p.title)+'</span></div>';
      } else {
        var isUnlock = (i===GOAL-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">Unlock $99 set</span>':'')+'</div>';
      }
    }
    el("tae-slots").innerHTML = slotsHtml;

    // summary + price (based on the first GOAL eligible units)
    var labelTxt = complete ? "Your $99 set is ready" : "Add "+GOAL+" items";
    var origTotal = units.slice(0, GOAL).reduce(function(a,u){ return a + u.product.price; }, 0);
    var savings = Math.max(0, origTotal - SET_PRICE);

    qa('[data-summary-label]').forEach(function(n){ n.textContent = labelTxt; });
    qa('[data-summary-price]').forEach(function(n){ n.textContent = complete ? SET_LABEL : money(0); });
    qa('[data-summary-was]').forEach(function(n){ n.textContent = (complete && savings>0) ? money(origTotal) : ""; });
    qa('[data-summary-sub]').forEach(function(n){ n.textContent = (complete && savings>0) ? "You save "+money(savings) : ""; });

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

    // live status
    el("tae-live").textContent = complete
      ? "Set complete. 3 of 3 items in your cart, "+SET_LABEL+"."
      : 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;
    if (eligibleUnits(cart).length >= GOAL) return;   // set already full
    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(); });
  }

  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) addVariant(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
})();
